Last updated: September 03, 2025
SCWE-096: Missing Token Burn on During Cross-Chain NFT Withdrawal
Stable Version v0.0.1
This content is in the version-(v0.0.1) and still under active development, so it is subject to change any time (e.g. structure, IDs, content, URLs, etc.).
Send Feedback
Relationships
- CWE-345: Insufficient Verification of Data Authenticity
CWE-345 Link
- CWE-664: Improper Control of a Resource Through Its Lifetime
CWE-664 Link
Description
This weakness occurs when a cross-chain bridge allows withdrawals from Chain B to Chain A without properly burning or locking the corresponding token on the source chain (Chain B) before initiating the cross-chain transaction.
As a result, the same token can exist simultaneously on both chains, enabling a double-spend scenario where malicious actors can sell, transfer, or use the same token on multiple chains.
-
Burn the NFT
- Call the
burn(tokenId)
function on the L2 NFT contract before sending the cross-chain withdrawal request.
- This ensures that the NFT no longer exists on L2 and cannot be reused, transferred, or sold.
-
Alternatively, Lock the NFT (if burning isnβt possible)
- If NFTs are not meant to be permanently destroyed, implement a lock mechanism to freeze the token on L2 until the cross-chain withdrawal is completed successfully.
-
Update Cross-Chain Workflow
- Enforce the burn/lock operation as part of the withdrawal process.
- Revert the entire transaction if the burn/lock fails.
Examples