The SnowmanAirdrop::getMessageHash
function generates message digests based on real-time token balances, while the SnowmanAirdrop::_isValidSignature
function lacks critical ECDSA safeguards. This combination creates a fundamental vulnerability where:
Signatures become invalid when token balances change
Valid signatures can be reused after balance replenishment
Signature malleability allows claim duplication
Cross-chain replay attacks are possible
Broken Claim Functionality: Legitimate users cannot claim after balance changes
Signature Replay Attacks: Same signature used for multiple claims
Double NFT Minting: Malleable signatures enable duplicate claims
Cross-Chain Exploits: Signatures valid on all Ethereum chains
Likelihood:
• Affects 100% of claims
• Triggered by normal token transfers
• Guaranteed occurrence
Impact:
• Permanent claim system failure
• Unlimited NFT inflation via replay
• Protocol economics destroyed
Scenario: Signature Lifetime Cycling
Initial State:
Alice holds 100 SNOW
Signs claim: DigestA = hash(receiver, 100)
Balance Change:
Transfers 100 SNOW to Bob
New balance: 0 SNOW
Current digest: DigestB = hash(receiver, 0)
Result: DigestA ≠ DigestB
→ Signature invalid
Balance Reset:
Alice buys 100 SNOW
New balance: 100 SNOW
Current digest: DigestC = hash(receiver, 100)
Result: DigestA == DigestC
→ Signature valid again!
Attack Exploitation Path:
Snapshot-Based Amounts:
Use fixed Merkle tree amounts instead of live balances
Must match values in signed messages
Nonce Management:
EIP-712 Domain Update:
Signature Tracking:
Claims use snow balance of receiver to compute the merkle leaf, making proofs invalid if the user’s balance changes (e.g., via transfers). Attackers can manipulate balances or frontrun claims to match eligible amounts, disrupting the airdrop.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.