The normal behavior should require that only the NFT owner or approved operators can burn their own NFTs, following standard ERC721 authorization patterns.
The burn() function lacks any authorization checks, allowing any user to permanently destroy any NFT regardless of ownership, approval status, or any other access controls.
Likelihood:
Any external account can call the public burn() function with any valid token ID
No authentication or authorization barriers exist to prevent malicious burning
Attack can be executed in a single transaction
Impact:
Complete permanent loss of NFT assets for legitimate owners
Destruction of marketplace listings
Loss of user funds and trust in the platform
This PoC demonstrates how any external account can permanently destroy NFTs belonging to other users. The attack requires no special privileges, approvals, or ownership, highlighting the complete absence of access controls in the burn() function.
The fix replaces the vulnerable _burn() call with _update(address(0), _tokenId, _msgSender()). Here's why this works:
_update() is OpenZeppelin's core transfer function that handles minting, transferring, and burning with optional authorization
The third parameter (auth) controls security checks:
address(0) = Skip all authorization
_msgSender() = Require caller authorization
When auth != address(0), _update() calls _checkAuthorized() which verifies the caller is either:
The token owner, OR
Approved for this specific token, OR
Approved for all tokens of the owner
address(0) as the to parameter indicates this is a burn operation (transfer to zero address)
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.