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
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.
Recommended mitigation steps
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.