The contract uses the ERC1155 standard to represent festival passes (General, VIP, Backstage). ERC1155 tokens are fungible per token ID by default, meaning each pass type is just a balance of a given token ID.
ERC1155 allows balances to be split and transferred in arbitrary amounts, including fractions (e.g., 0.5, 0.01), unless explicitly prevented.
Fractional Passes:
Users can transfer a fraction of a pass (e.g., 0.5 VIP pass) to another address.
Access Control Bypass:
The hasPass(address user) function only checks if the user’s balance for a pass ID is greater than zero. Thus, any address with a tiny fraction of a pass will be considered a valid pass holder.
Potential Abuse:
A single pass can be split into many fractions and distributed to multiple addresses, all of which would be able to access pass-holder features (e.g., attend performances, claim rewards).
Likelihood: HIGH
User A buys 1 VIP pass (token ID 2).
User A transfers 0.01 of the VIP pass to User B.
User B now has a balance of 0.01 for VIP pass.
User B passes the hasPass check and can access all VIP pass-holder features.
Override the _beforeTokenTransfer hook in ERC1155 to enforce this for pass IDs.
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.