claim() accepts account as a parameter rather than deriving it from msg.sender. Anyone can call the function for any eligible account by paying FEE, and the tokens are sent to account (not the caller).
(src/MerkleAirdrop.sol:30-34)
Likelihood: Low
Calling on someone else's behalf is permissionless but does not redirect funds, so there is little direct incentive in isolation. The realistic abuse is griefing or chaining with the replay bug.
Impact: Low
A griefer cannot steal tokens this way (they go to account), but they can force execution timing on a victim's claim, burn their FEE value, and, combined with the missing replay guard (AD-01), an attacker can drive the unbounded re-claim loop against any leaf rather than only their own, broadening the drain surface.
A third party with no allocation pays the fee and successfully drives another account's claim.
Bind the caller to the recipient, or explicitly adopt a relayer model where the recipient is paid and pays nothing.
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.