The intended behavior is that users receive Snowman NFTs only through the SnowmanAirdrop contract. In the normal flow, a user must hold Snow, provide a valid Merkle proof, provide a valid EIP-712 signature, approve the airdrop contract to transfer their Snow, and then the airdrop contract mints NFTs equal to the user’s eligible amount.
The issue is that the NFT minting function on Snowman is publicly callable by anyone. There is no access control restricting mintSnowman to the airdrop contract, the owner, or an approved minter role. As a result, an attacker can skip the entire airdrop claim process and mint arbitrary NFTs directly.
Likelihood:
The vulnerable function is external, so any address can call it directly.
There is no access control check such as onlyOwner, onlyAirdrop, or onlyRole.
The attacker does not need Merkle proof data, a valid signature, Snow tokens, or token approval.
Impact:
The airdrop eligibility system can be fully bypassed.
NFT supply can be inflated arbitrarily, breaking scarcity and token economics.
Attackers can mint NFTs to themselves or to other addresses without consent.
The s_TokenCounter supply accounting becomes meaningless because it can be increased by unauthorized users.
The following test demonstrates that an address which is not the contract owner can mint NFTs directly. The attacker calls mintSnowman without interacting with SnowmanAirdrop, without owning or staking Snow, and without providing a Merkle proof or signature.
This succeeds because mintSnowman does not validate msg.sender. The attacker can repeat the same call with larger amounts until gas limits prevent a single transaction, and can continue across multiple transactions.
Restrict minting so that only the authorized airdrop contract can mint NFTs. This preserves the intended claim flow: Merkle proof validation, signature validation, Snow transfer, claim-state update, and then NFT minting.
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.