On zkSync Era with native account abstraction, msg.sender in claim() can differ from the eligible account, but the function has no mechanism to verify authorization between the two.
In MerkleAirdrop.sol:30, claim accepts account as a parameter with no check that msg.sender == account:
zkSync natively supports account abstraction — smart contract wallets are first-class citizens. msg.sender is the contract wallet, not the EOA. Since account and msg.sender are decoupled with no signature check, any address can trigger claims for any eligible account.
HIGH — The claim function assumes msg.sender == account (EOA model), but zkSync's native AA breaks this. Unauthorized parties can trigger claims.
Require EIP-712 signature from account to authorize the claim.
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.