No access control modifiers (onlyOwner, role-based, etc.)
No validation of caller identity
No limits on minting amount
Complete bypass of intended airdrop mechanism
Impact:
Any address can mint unlimited NFTs
Intended flow completely circumvented
System integrity compromised
Normal Behavior:
The Snowman NFT contract should only allow authorized entities
(specifically the SnowmanAirdrop contract) to mint NFTs after users
have staked Snow tokens and provided valid Merkle proofs and
signatures through the proper airdrop mechanism.
Specific Issue: The mintSnowman() function in Snowman.sol (lines 36-44) lacks any
access control restrictions, allowing any external address to directly
call the function and mint unlimited NFTs without staking Snow
tokens, providing proofs, or going through any validation process,
completely bypassing the intended airdrop economics and rendering the
entire system worthless.
Likelihood:
Any user can discover this vulnerability by simply reading the
contract code or attempting to call the mintSnowman() function
directly
Attackers will exploit this immediately upon contract deployment
since no technical barriers or validations prevent unauthorized
minting
Impact:
Complete economic collapse of the airdrop system as unlimited free
NFTs destroy the value proposition of purchasing Snow tokens
Total bypass of the intended Merkle tree validation and Snow token
staking mechanism, rendering the entire project architecture
meaningless
The following PoC demonstrates how any unauthorized address can mint
unlimited Snowman NFTs, completely bypassing the intended airdrop
mechanism.
forge test --match-contract PoC_Simple -vvv
test/PoC_Simple.t.solExpected Output
This fix implements strict access control by restricting the
mintSnowman() function to only be callable by the designated
SnowmanAirdrop contract. The AIRDROP_CONTRACT address is set once
during deployment as an immutable variable, ensuring it cannot be
changed later. The require() statement validates that msg.sender
matches this authorized contract address before allowing any minting
operations.
This approach restores the intended architecture where users must go
through the proper airdrop flow (stake Snow tokens → validate Merkle
proofs → provide signatures) via the SnowmanAirdrop contract, which
then calls mintSnowman() as the only authorized caller. This
completely eliminates the ability for random addresses to bypass the
economic model and mint free NFTs directly
The mint function of the Snowman contract is unprotected. Hence, anyone can call it and mint NFTs without necessarily partaking in 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.