FestivalPass.withdraw() pays out with payable(target).transfer(...), which forwards only 2300 gas. If the owner designates a contract target whose fallback/receive logic costs more than 2300 gas (e.g., a multisig or vault), the withdrawal reverts and funds cannot be pulled to that target.
Contract: src/FestivalPass.sol
Function: withdraw(address target)
transfer hard-caps the gas stipend at 2300, which is not enough for any state-changing fallback logic (a single cold SSTORE costs ~22,100 gas).
Withdrawal DoS on contract targets: withdrawing to a contract with non-trivial fallback logic (multisigs, vaults, any receiver doing storage writes) always reverts, so that withdrawal path is bricked. Funds stay locked in FestivalPass until the owner retries with a different target.
Low severity: the owner chooses target on every withdraw call and can simply use an EOA to work around it — no funds are lost, only specific targets are unusable.
withdraw(address target) lets the owner pull accumulated pass-sale proceeds to an arbitrary target. It sends ETH via Solidity's transfer, which forwards a fixed 2300 gas stipend. Any recipient contract whose receive/fallback does more than log an event — e.g., a multisig wallet or vault performing storage writes — exceeds the stipend and causes the whole withdraw call to revert with an out-of-gas error.
The PoC below funds the contract with a pass sale, then attempts withdraw to a GreedyReceiver contract whose fallback performs an SSTORE (~22k gas on first write). The withdrawal reverts (vm.expectRevert()), while withdrawing the same balance to an EOA succeeds — proving the 2300-gas stipend is the sole cause.
From repo/test/PoC.t.sol (BeatlandPoC; all 5 tests pass with forge test):
Replace .transfer with a low-level call that forwards all gas, plus an explicit success check:
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.