Normal behavior:
The Snowman
contract is intended to mint NFTs as rewards, likely only callable by the SnowmanAirdrop
contract after users complete staking and Merkle verification.
The problem:
The mintSnowman(address, uint256)
function is marked as external
and has no access control, allowing any external caller to mint any number of NFTs to themselves or others.
Likelihood: High
This occurs whenever any external contract or externally owned account (EOA) calls the mintSnowman()
function, since it is marked external
and lacks any restriction like onlyOwner
or onlyMinter
.
A malicious actor can deploy a simple contract or use a script to mint unlimited NFTs to themselves or others without interacting with the intended staking or airdrop flow
Impact: High
Unauthorized users can mint an unlimited number of Snowman NFTs, completely bypassing the staking and Merkle-based reward logic defined in the protocol.
The value, rarity, and fairness of the Snowman NFT distribution system is destroyed, leading to inflation, loss of trust, and potential devaluation of user-earned NFTs.
Below here , the PoC shows that anyone can call mintSnowman()
directly and mint arbitrary quantities of NFTs to any address. The contract lacks access control, so it does not verify whether the caller is authorized, nor does it check if the recipient has completed staking or earned the NFTs. This allows attackers to mint fake NFTs indistinguishable from legitimate ones, breaking the integrity of the reward system.
To prevent unauthorized minting, restrict the mintSnowman()
function to be callable only by a designated trusted contract (such as the SnowmanAirdrop
contract). This ensures that NFTs can only be minted after proper staking, Merkle verification, and signature checks.
Access control should be implemented using a minter
address that can only be set by the contract owner.
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.
The contest is complete and the rewards are being distributed.