HaskDetect · Case 001 · Chain forensics

The Binance 14 hot wallet drain: how a signed EIP-7702 backdoor swept 65 assets in one call

An on-chain reconstruction of the 29 October 2026 Binance incident, built from raw Ethereum node data. Every claim below links to a transaction hash you can verify yourself.

Resolved — backdoor revoked 00:10 UTC, 30 Oct Written 29 Oct 2026, 23:40 CET · updated 01:16 CET, 30 Oct Chain: Ethereum mainnet Source: public RPC + Blockscout, no proprietary labels

What happened, in one paragraph

Between 20:20 and 21:44 UTC on 29 October 2026, an attacker who held the private key for Binance's hot wallet 0x28C6c06298d514Db089934071355E5743bf21d60 ("Binance 14") did not drain it the ordinary way. Instead they used EIP-7702, the Pectra upgrade feature that lets a normal account borrow a contract's code, to install attacker-written code onto the Binance 14 account itself. Three and a half minutes later they called one function on it, sweep(to, tokens[65]), and 167,464 ETH plus 63 tokens including 1.615 billion USDT left in a single transaction. A second Binance hot wallet was emptied of 28,005 ETH by a plain transfer at the same time. The attacker rehearsed the exact technique six hours earlier on three test accounts.

Resolved — backdoor revoked at 00:10:35 UTC, 30 October 2026 (block 26301896). For roughly 3 hours 46 minutes after the first sweep, Binance 14 ran the attacker's code and fresh deposits kept being swept — at least four times (20:24, 21:04, 21:44 UTC, and a ~2,962 ETH sweep at ~23:55 UTC caught live on the HaskDetect tracker). Binance then regained operational control of the wallet and sent a single EIP-7702 transaction (0xafbf94c9…dac7209) delegating the account to the zero address, which cleared the code. eth_getCode on Binance 14 now returns 0x — a normal account again. New deposits there are no longer at risk. The stolen funds that already left are a separate matter: the ~195,460 ETH remains parked and the liquid tokens are gone; recovery now rests on the frozen stablecoins and exchange/bridge flags.

Open → revoked, caught end to end on the live tracker. The exact block the backdoor closed is recorded above.

The addresses

Victim (Binance 14)0x28C6c06298d514Db089934071355E5743bf21d60 · nonce 18.9M · delegation revoked 00:10 UTC 30 Oct, now owner-controlled Victim (2nd hot wallet)0xDFd5293D8e347dFe59E90eFd55b2956a1343963d · nonce 15.7M · sent 28,005 ETH by plain transfer Attacker signer0x7c8601d4645b93cea45f71e118a729332e6b5ca0 · 16 outgoing txs total · first seen 02:28 UTC same day Attacker code0x63e842b054bd624a465454d533c33f573e9c6fae · deployed by the signer at 15:59 UTC (its nonce-5 CREATE) Loot address0x5227f603c1ee34ce3c06efe6477003bdfccb2f8c · Tether-blacklisted · holds 1.175B frozen USDT ETH parked0x8532FA14ACAf483729C449b8458aedDb900543D4 · 195,460 ETH · never spent (nonce 0)

Timeline (UTC, 29 October 2026)

How it worked

EIP-7702 in one breath

Since Pectra, an ordinary key-based account can sign an "authorization" that says: run this contract's code as if it were mine. Wallets use it for batching and sponsored gas. The authorization is just a signature over (chainId, contractAddress, nonce). Whoever holds the account's private key can sign one. Once set, the account keeps that code until another authorization replaces it.

Why this beats a normal drain

Draining a hot wallet the ordinary way means hundreds of transactions, one per token, each racing against Binance's own systems which were still sending from Binance 14 every few seconds. Installing code turns the account into a contract the attacker controls: one call, every asset, and the account keeps obeying afterwards. It also sidesteps per-token monitoring that watches for the hot wallet sending, because the sender of the sweep is the attacker's address, not Binance 14.

Why fifty authorizations

An authorization is only valid if its nonce equals the account's nonce at the moment the transaction executes. Binance 14 sends a transaction roughly every ten seconds, so the attacker could not know which nonce it would be on when their transaction was mined. They signed fifty in a row and submitted them all; the one that matched took effect, the rest were discarded. This is the signature of someone who studied the target's traffic pattern and understood 7702's validation rules precisely. It also means the attacker signed with the Binance 14 private key fifty times. There is no reading of this data in which the key was not in their hands.

What this is not. Not a smart-contract exploit, not a bridge bug, not a phishing of a user. The chain shows a hot-wallet private key being used by someone other than its owner, on two wallets. How the key left Binance's infrastructure is not visible on-chain and is not claimed here.

What the backdoor looks like, byte by byte

Anyone can check whether an account has been hijacked this way with one call, eth_getCode. A normal key-based account returns 0x (empty). Binance 14 returns:

0xef010063e842b054bd624a465454d533c33f573e9c6fae

It reads in two parts. ef0100 is the fixed three-byte flag EIP-7702 writes onto a delegated account; seeing it at all means the account is now executing another contract's code. The 20 bytes after it, 63e842b0…9c6fae, are the address of that contract: here, the attacker's own payload, deployed by the attacker six hours before the attack. So the single line of code on the victim account names its attacker. As long as that line is present, the account is still under attacker control, and resetting it needs the account's own key, which the attacker also holds.

Where the money is

AssetAmountStatusWhere
USDT1,175,464,711Frozen (Tether blacklist)0x5227f603… (loot)
USDT700,000,000Moved one hop before freeze; both hops now blacklistedvia 0x9749292D… and 0x0Ddf0480…
ETH195,460Parked, unspent0x8532FA14ACAf483729C449b8458aedDb900543D4
ETH~2,076Remaining at loot0x5227f603…
RLUSD88,541,065Freezable by issuer0x5C23023C…
ENA / wBETH217M / 29,934Liquid0x7f9DC988…
UNI7,018,792Liquid0x42CDF00c…
PEPE7.77TLiquid0x600d6F00…

USDC figures are not in this report because the USDC leg left from the second hot wallet and other chains (Arbitrum, Avalanche), which this reconstruction does not yet cover. Circle has publicly confirmed a freeze. The BTC on Arkham's entity page is likewise out of scope for this Ethereum-only pass.

What a detector would have seen

HaskDetect scores behaviour, not labels. Reading only public chain data, these signals were available before the sweep landed:

01
Fresh signer, same-day lifecycleFirst transaction at 02:28, attack at 20:24. Age under 24 hours is a strong prior on its own.
02
Anonymous fundingGas arrived by internal transfer with no visible sender history, the Tornado withdrawal shape.
03
Rehearsal patternThe same function selector (0x8a179be4) called on three throwaway accounts within hours, each immediately after a 7702 delegation. Three dress rehearsals is a louder signal than one.
04
Type-4 transaction targeting a high-value accountA 7702 authorization whose signer is a top-100 balance address, submitted by an unrelated fresh account, should page a human. There were 50 of them in one transaction.
05
Delegation to code deployed the same day by the submitterTrivially checkable: the delegate address is the submitter's own CREATE output from six hours earlier.
06
Three-and-a-half-minute gapSet-code at 20:20:59, sweep at 20:24:23. Fast enough to need automation, slow enough that an alert on signal 04 would have beaten it.

Signals 04 and 05 are new to the post-Pectra world and are not in most exchange monitoring stacks yet. They should be.

Open threads

Verify it yourself

Every address and hash above is public. For the 7702 authorization list: fetch transaction 0xad99264d…51298b from any Ethereum node, read its authorizationList, and recover each signer from keccak(0x05 || rlp([chainId, address, nonce])). For the attacker's contract: compute the CREATE address of 0x7c8601d4… at nonce 5. For the current backdoor: eth_getCode on Binance 14 and look for the 0xef0100 prefix.