GAME Hack
What happened
On February 12, 2024, an attacker drained about 20 ETH (roughly $49,600) from the GAME auction contract on Ethereum through a reentrancy bug in its makeBid() function.
makeBid() only required a new bid to exceed newBidEtherMin(), which returned 5% of the standing bid (bidEther * 5 / 100), not the standing bid itself. So a bid far lower than the current one could take the lead. On every new bid, makeBid() sent the full stored bidEther back to the previous highest bidder before updating who led and how much they had bid. The attacker's contract held the top bid, then placed a bid of about 5% of it. When the refund reached the attacker contract, its receive() function called makeBid() again before the state changed, collecting the same stale refund over and over. Part of the stolen ETH was later deposited to the FixedFloat exchange.
Attacker: 0x145766A51ae96E69810fE76f6f68Fd0e95675A0B
Attack contracts: 0x8d4dE2Bc1a566b266bD4B387f62C21e15474D12a, 0x327aa670AABeAaC9B8F099E4827e04e957B66dCd
Attack transactions: 0xe07fa7cf5f590ea82cf195923549722f924857537111aeb3824359d3e1c2e32f, 0x1624cd342758019872713c31965f983a9154cc22c04430164be506bc1a68f6c7, 0x0eb8f8d148508e752d9643ccf49ac4cb0c21cbad346b5bbcf2d06974d31bd5c4
How it happened
- The attacker sent 0.6 ETH to an attack contract, which placed a bid of about 49% of that balance through
makeBid()and became the highest bidder. - The contract then placed a second bid of
newBidEtherMin() + 1wei. Because of a logic error, this small amount passed the minimum bid check. - The new bid made
makeBid()refund the previous highest bidder, the attack contract itself, before updating the stored bid state. - The refund triggered the contract's
receive()function, which calledmakeBid()again with another minimal bid. Each nested call refunded the same stale bid amount. - The loop ran about 110 times in the reproduced exploit. The largest attack transaction returned about 11.16 ETH to the attacker, and several transactions together took about 20 ETH.
Protocol details
Evidence
- report @CertiKAlert incident report twitter.com
- transaction Etherscan transaction 0x0eb8f8d1...d5c4 etherscan.io
- transaction etherscan.io transaction 0x1624…f6c7 etherscan.io
- transaction etherscan.io transaction 0xe07f…e32f etherscan.io
- transaction etherscan.io transaction 0xf19d…464b etherscan.io
- address Etherscan verified source code, Game contract 0x52d69c67...dbd6 etherscan.io
- address etherscan.io address 0x077D…C4A4 etherscan.io
- address etherscan.io address 0x1457…5A0B etherscan.io
- address etherscan.io address 0x327a…6dCd etherscan.io
- address etherscan.io address 0x8d4d…D12a etherscan.io
- code DeFiHackLabs Game_exp.sol (2024-02) github.com
- analysis AI Agent Smart Contract Exploit Generation (GAME case study) arxiv.org
Understand the attack patterns
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.