The EIP-712 signed message in SnowmanAirdrop contains only receiver and amount. No nonce is included and no nonce is incremented on claim. Even if s_hasClaimedSnowman were properly checked (see H-03), the signature scheme itself has no replay protection. The same signature can be submitted multiple times by anyone who observes it on-chain.
The claimSnowman function verifies the signature matches the receiver, but once a valid signature is observed (from a previous claim transaction), anyone can replay it. The signature is deterministic for a given (receiver, amount) pair, and the amount is derived from balanceOf() which can be reset to the same value by re-acquiring tokens.
Standard EIP-712 signature schemes include a nonce per signer that increments on each use, making each signature single-use. OpenZeppelin's ERC20Permit and ERC2612 include this pattern.
Likelihood:
Requires observing a valid signature from a previous claim (publicly visible on-chain) and the receiver re-acquiring the same Snow balance. With s_hasClaimedSnowman unfixed, this is trivially exploitable. Even with the claim check fixed, the signature scheme is structurally weak.
Impact:
Signatures are not single-use. Third-party claimers can re-submit the same signature if conditions align. Combined with H-03, this enables unlimited claims.
Output:
Add a nonce per receiver:
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.