We do not have a reliable USD price for the recorded assets yet.
0x34516ee081c221d8576939f68aee71e002dd5557180d45194209d6692241f7b10x50f5474724e0ee42d9a4e711ccfb275809fd6d4aEthereumAt Ethereum mainnet block 14163042, transaction 0x34516ee081c221d8576939f68aee71e002dd5557180d45194209d6692241f7b1 let unprivileged EOA 0x6fb0b915d0e10c3b2ae42a5dd879c3d995377a2c destroy The Sandbox LAND token 3738, which belonged to 0x9cfa73b8d300ec5bf204e4de4a58e5ee6b7dc93c. The caller sent the transaction directly to LAND contract 0x50f5474724e0ee42d9a4e711ccfb275809fd6d4a and supplied the victim owner address twice in calldata, causing the burn to succeed.
The root cause is a public burn helper with no caller authorization. The deployed LAND ABI exposed _burn(address,address,uint256) as an externally callable function, and that function only checked whether the two caller-supplied address arguments matched each other. Because the current owner of any LAND token was publicly readable on-chain, any EOA could pass the victim owner as both from and owner and permanently destroy that victim's NFT.
The Sandbox LAND contract is an ERC-721 style asset system with support for multiple parcel sizes, but ownership for a 1x1 token is still resolved from public storage through ownerOf(uint256) and the internal _ownerOf(uint256) path. Before the exploit transaction, token 3738 existed and ownerOf(3738) returned 0x9cfa73b8d300ec5bf204e4de4a58e5ee6b7dc93c; the victim address held LAND tokens at that pre-state.
2762The verified ABI for the deployed LAND contract shows _burn(address from, address owner, uint256 id) as a public function. The contract also contains intended authorization wrappers such as burn(uint256) and burnFrom(address,uint256), which strongly indicates _burn should have remained an internal helper or should have enforced the same authorization rules itself. Instead, the deployed contract left a direct external path into destructive ownership state mutation.
This incident is an access control failure in a critical ownership-destruction path. The core invariant for an NFT contract is that only the token owner or an explicitly authorized operator may burn a token. The LAND implementation breaks that invariant because _burn authenticates caller-supplied identity parameters instead of authenticating msg.sender.
The vulnerable function is:
function _burn(address from, address owner, uint256 id) public {
require(from == owner, "not owner");
_owners[id] = 2**160; // cannot mint it again
_numNFTPerAddress[from]--;
emit Transfer(from, address(0), id);
}
That code mutates ownership state, decrements the holder balance, and emits the burn event without checking whether msg.sender is the owner, an approved operator, a super operator, or an admin. By contrast, burnFrom does perform those checks before delegating to _burn. The exploit therefore did not require bypassing cryptography, stealing keys, or obtaining approval; it only required reading the public owner address and calling the wrong entrypoint.
The end-to-end exploit path is deterministic. First, the attacker identifies an existing token and reads its current owner from public state. The relevant ownership code path confirms this information is publicly derivable:
function _ownerOf(uint256 id) internal view returns (address) {
require(id & LAYER == 0, "Invalid token id");
uint256 owner1x1 = _owners[id];
if (owner1x1 != 0) {
return address(owner1x1);
}
...
}
Second, the attacker submits a direct transaction to the LAND contract calling selector 0x6ee678ae, which decodes to _burn(address,address,uint256). The transaction metadata shows the direct call target and calldata:
from = 0x6fb0b915d0e10c3b2ae42a5dd879c3d995377a2c
to = 0x50f5474724e0ee42d9a4e711ccfb275809fd6d4a
input = 0x6ee678ae
0000000000000000000000009cfa73b8d300ec5bf204e4de4a58e5ee6b7dc93c
0000000000000000000000009cfa73b8d300ec5bf204e4de4a58e5ee6b7dc93c
0000000000000000000000000000000000000000000000000000000000000e9a
Those two address words are identical and equal to the real owner of token 3738, so the only gate in _burn passes. The seed execution trace then shows the exact unauthorized burn and its post-state effects:
Land::_burn(0x9cfA73B8d300Ec5Bf204e4de4A58e5ee6B7dC93C, 0x9cfA73B8d300Ec5Bf204e4de4A58e5ee6B7dC93C, 3738)
emit Transfer(_from: 0x9cfA73B8d300Ec5Bf204e4de4A58e5ee6B7dC93C, _to: 0x0000000000000000000000000000000000000000, _tokenId: 3738)
storage changes:
victim LAND balance: 2762 -> 2761
token owner slot: 0 -> 0x0000000000000000000000010000000000000000000000000000000000000000
That post-state is consistent with the success predicate in the root cause analysis: the victim loses one LAND token, the token is marked as burned, and future ownerOf(3738) calls revert with token does not exist. No additional privilege, prior approval, or helper contract is required. This makes the incident a permissionless ACT opportunity rather than a privileged misuse case.
The attacker flow is a single direct transaction.
3738 exists and is owned by 0x9cfa73b8d300ec5bf204e4de4a58e5ee6b7dc93c.0x34516ee081c221d8576939f68aee71e002dd5557180d45194209d6692241f7b1 to LAND contract 0x50f5474724e0ee42d9a4e711ccfb275809fd6d4a._burn(victimOwner, victimOwner, 3738) directly, bypassing the intended burnFrom authorization path.Transfer(victimOwner, address(0), 3738), decrements the victim balance from 2762 to 2761, and records the token as burned.ownerOf(3738) queries revert, proving the destruction is final.The important decision point is that the attacker does not try to satisfy the real authorization logic in burnFrom. Instead, the attacker uses the externally exposed helper and supplies matching calldata values, which is enough to satisfy the flawed check.
The measurable loss is the permanent destruction of one LAND NFT, token 3738, owned by 0x9cfa73b8d300ec5bf204e4de4a58e5ee6b7dc93c. In raw token accounting terms, the victim's balance dropped from 2762 to 2761, and the token became non-existent after the transaction.
This is a non-monetary but concrete integrity failure. The exploit breaks NFT ownership guarantees for every token in the collection because any existing token whose owner is publicly known can be burned by an arbitrary unprivileged caller through the same entrypoint.
0x34516ee081c221d8576939f68aee71e002dd5557180d45194209d6692241f7b10x50f5474724e0ee42d9a4e711ccfb275809fd6d4a_burn(address,address,uint256)ERC721BaseToken.sol implementation of _burn and burnFromLandBaseToken.sol ownership resolution path used by ownerOf_burn, the Transfer event, and storage changes