57427 sc medium mint signatures are not bound to a collection which makes cross collection replay possible under a shared signer

Submitted on Oct 26th 2025 at 05:43:15 UTC by @Rhaydden for Audit Comp | Belongarrow-up-right

  • Report ID: #57427

  • Report Type: Smart Contract

  • Report severity: Medium

  • Target: https://github.com/immunefi-team/audit-comp-belong/blob/main/contracts/v2/utils/SignatureVerifier.sol

  • Impacts:

    • Unauthorized minting of NFTs

Description

Issue description

The backend signs mint payloads that include the receiver, token details, and chainId, but not the collection’s address. Any collection that trusts the same factory signer will accept that signature.

In dynamic price signature: https://github.com/immunefi-team/audit-comp-belong//blob/a17f775dcc4c125704ce85d4e18b744daece65af/contracts/v2/utils/SignatureVerifier.sol#L221-L232

function checkDynamicPriceParameters(address signer, address receiver, DynamicPriceParameters calldata params)
    external
    view
{
    require(
        signer.isValidSignatureNow(
            keccak256(abi.encodePacked(receiver, params.tokenId, params.tokenUri, params.price, block.chainid)),
            params.signature
        ),
        InvalidSignature()
    );
}

Also in static price signature:

Albeit, AccessToken uses a global factory signer for checks, but does not bind the signature to address(this):

The signer is global per factory and shared by all collections:

Because address(this) (verifying contract) is not part of the signed payload, a signature intended for Collection A can be replayed on Collection B (same signer, same chain).

Impact

Critical - Unauthorized minting of NFTs.

Mint permissions intended for one collection can be reused on another.

Consider including the collection address in the signed hash for mint parameters:

  • Static:

  • Dynamic:

Proof of Concept

Attach this poc to a new file test/v2/tokens/accessToken.replay.test.ts:

Run without mainnet forking (local only) using:

Logs:

The test passes because both collections accept the same signature from the same signer.

Was this helpful?