Normal behavior: Burning an ERC-721 token should be restricted to the token owner or an approved operator (e.g., OpenZeppelin ERC721Burnable uses _isApprovedOrOwner).
Issue: BidBeasts.burn(uint256) is public and calls _burn(tokenId) without checking ownership or approval. OpenZeppelin’s internal _burn does not authenticate the caller. As a result, any address can permanently destroy any existing token, including those currently escrowed by the marketplace, breaking auctions/settlements.
Likelihood:
Occurs whenever a valid tokenId exists and any EOA/contract calls burn(tokenId); no approvals or ownership required.
Also occurs while listed/escrowed in the marketplace, since the token contract does not restrict burning during escrow.
Impact:
Permanent asset loss: Tokens are irreversibly destroyed by unauthorized third parties.
Marketplace disruption: Auctions and unlisting/settlement flows later revert on transferFrom due to the token’s nonexistence, causing state/UX inconsistencies and potential fund-flow issues.Impact 2
(Extended scenario: even when the marketplace holds the NFT in escrow, calling burn(tokenId) succeeds, and later unlistNFT / _executeSale revert when attempting transferFrom.)
Additional hardening (optional but recommended):
Consider inheriting ERC721Burnable (OpenZeppelin) which already implements this gate.
If business logic does not require user-initiated burns, restrict to a specific role (e.g., onlyOwner/AccessControl).
Since the marketplace escrows tokens, evaluate forbidding external burns while listed (policy or role-based control) to prevent escrow-time griefing.
In the BidBeasts ERC721 implementation, the burn function is publicly accessible, allowing any external user to burn NFTs they do not own. This exposes all tokens to unauthorized destruction and results in permanent asset loss.
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.