The normal behavior should be that users purchase festival passes and use them to attend performances, with each pass providing access according to its type (General, VIP, or Backstage) and being consumed or tracked to prevent abuse.
The attendPerformance
function only verifies that a user owns a pass but does not consume, burn, or mark the specific pass as used. This allows a single pass to be transferred between multiple addresses and used indefinitely to attend performances, bypassing the intended economic model where each attendance should require a valid, unused pass.
Likelihood:
Users can easily transfer passes using the standard ERC1155 safeTransferFrom
function after attending a performance
No technical barriers prevent this exploit - it only requires basic knowledge of token transfers
The vulnerability can be exploited repeatedly across multiple performances and multiple users
Impact:
Economic loss to the festival organizer as a single pass purchase generates unlimited attendance revenue through BEAT token minting
Unfair advantage for users who exploit this vulnerability compared to honest users who purchase individual passes
Undermines the entire festival pass pricing model and token economics
Potential for coordinated abuse where groups of users share a single pass across multiple accounts
Add the following test to the FestivalPass.t.sol
file, and run it with forge test --match-contract FestivalPassTest --match-test test_AttendPerformance_MultipleUsesOfASinglePass
.
In this test, we can see that both user1 and user2 attend the performance and get the reward, but only user1 have bought the pass. The same pass could be transferred indefinitely, leading to economic loss for the festival organizer.
To solve this problem, the pass must be bound to the buyer's address.
One way to do this is to migrate the pass logic from the ERC1155 contract to an internal logic, for example, having a map of addresses => pass IDs,. Since the ERC1155 is designed to be transferable, thus incompatible with the FestivalPass design, it's easier to migrate the logic instead of doing various workarounds. This new logic must be able to track the pass ownership and prevent the pass from being used by other addresses. Since the ERC1155 now would only be used to mint memorabilia NFTs, it could be replaced by the ERC721 standard, leading to a more gas efficient implementation.
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.