What we know, what we do not, and where it comes from
On October 29, 2026, between 20:05 and 23:56 UTC, an attacker moved about 6.3 billion dollars out of Binance's hot wallets on ten blockchains, and nobody has yet shown that a private key was stolen. That second half of the sentence is the part that matters to anyone who runs custody for a living. The cryptography held. The process that decides what the cryptography signs did not.
This article was written on October 30, less than a day after the first outflow, so the sourcing behind each claim is set out here. Binance has published one preliminary statement, one service update and one investigation update. TRM Labs, Elliptic and Bitquery have published on-chain reconstructions with different cutoffs and different chain counts (TRM counts ten chains, Elliptic eleven including NEAR, Bitquery nine). Two independent researchers, drk and 808bits, decoded the Ethereum transactions. Halborn pulled the key Ethereum transactions from a public node and verified the 50 delegation signatures offline against the EIP-7702 message format. Observed means Halborn or a named researcher read it from the chain. Reported means an organization states it. Inferred means it is Halborn's reading, and the reasoning is given with it.
The headline numbers move with the cutoff. Binance estimates the impact at about 6.3 billion dollars. TRM values the transfers at 6.36 billion at the moment each left; Elliptic at 6.43 billion. Frozen funds stood at about 2.7 billion in TRM's count at 00:30 UTC, 2.84 billion verified by Elliptic, and about 3 billion in Binance's own statement. Gross transfers, frozen assets, returned assets and final loss are four different measures, and a freeze is not a recovery. Keep that in mind every time a number appears below.
| Time (UTC) | Event | Status |
|---|---|---|
| Oct 28, 07:39 to Oct 29, 08:23 | Operator wallet 0x7C86…5CA0 funded with three withdrawals of about 0.098 ETH each from Tornado Cash | Reported (drk, Elliptic) |
| Oct 29, 02:28 | First version of the delegate contract deployed and tested against the attacker’s own account | Reported (drk) |
| 13:51 | Rehearsal 1: a test wallet delegated with three authorizations at nonces 0, 1 and 2; one applies | Reported (drk) |
| 15:59 | Final delegate contract 0x63e8…6fAe deployed from the operator wallet | Observed (bytecode), reported (time) |
| 16:25 to 16:47 | Rehearsal 2: a second test wallet delegated to the final contract, sweep path exercised three times | Reported (drk) |
| 20:05 to 20:09 | Five Binance wallets on the XRP Ledger send 233.46 million XRP to one address, leaving only the reserve | Reported (TRM) |
| 20:10 onward | Binance wallets on Solana, Optimism, Base and Arbitrum start sending to the attacker | Reported (TRM, Elliptic) |
| 20:17:47 | Binance 14 reaches nonce 18,914,775, the lowest nonce in the attacker’s batch | Observed (808bits) |
| 20:20 | A Binance Bitcoin hot wallet sends 18,270 BTC; the peel chain starts in the same block | Reported (TRM) |
| 20:20:59 | Type-4 transaction with 50 EIP-7702 authorizations lands in block 26,300,753; the entry at nonce 18,914,809 applies | Observed |
| 20:22 | A Binance hot wallet on Tron sends 612.7 million USDT and 46.4 million TRX | Reported (TRM) |
| 20:24:23 | Sweep 1 from Binance 14 in block 26,300,770: 167,464 ETH and 63 tokens, including 1,615,409,498.97 USDT, to the hub 0x5227…2f8c | Observed (token events), reported (ETH) |
| 20:24:47 | Binance 16, never delegated, signs its own transfer of about 28,006 ETH and 108 million dollars in tokens to the same hub | Reported (drk, TRM) |
| 20:41:23 | 780 million USDC moves from Hot Wallet 34, a smart account that lists Binance 14 as operator; 43 million more at 20:59:47 | Observed (event), reported (path) |
| 21:01 to 21:04 | Tether freezes 971.1 million USDT in the hub; Circle freezes 823 million USDC three minutes later | Reported (TRM, Elliptic) |
| 21:04 to 23:56 | Four further sweeps of funds arriving at Binance 14 | Reported (Bitquery, TRM) |
| 22:01 to 22:26 | Ripple freezes RLUSD, World Liberty freezes USD1, Tether blacklists Binance 14 itself at 22:06 | Reported (TRM, drk) |
| About 22:30 | Binance confirms a security incident and pauses withdrawals | Reported (Binance) |
| 23:05 | Second wave: Binance wallets on Avalanche and Polygon | Reported (TRM) |
| Oct 30, 00:08 to 00:18 | Arbitrum Security Council force-moves 8,426 ETH and 74.6 million ARB out of the attacker’s wallet | Reported (TRM) |
| 00:10:35 | Binance 14 signs an authorization to the zero address in block 26,301,896; the delegation is cleared | Observed |
| 02:23 | Binance publishes its Security Incident Update: compromised DevOps laptop, service container, no evidence of key leak | Reported (Binance) |
| 04:17 | Co-CEO Yi He: deposits normal, withdrawals paused, resumption expected within 48 hours | Reported (Binance) |
| 08:47 | Binance investigation update: the laptop was not the only point of breach, losses will be covered from the SAFU fund, about 3 billion dollars frozen, withdrawals still expected to resume in 45 hours | Reported (Binance) |
The attack chain, end to end
The chain runs from one engineer's laptop to valid signatures on eight networks in about twenty minutes and on two more three hours later, and the only link Binance has confirmed so far is the first one. Everything between the laptop and the signatures is still inference, so I will separate the links.
Link 1: The compromised laptop
Link one is the endpoint. Binance's statement says the incident "may involve a compromised DevOps engineer's laptop, which allowed an attacker to gain access to a service container and submit unauthorized withdrawal transactions." Nothing public establishes the infection method, the dwell time, the operating system or the malware. The precedents tell you where to look. In the DMM Bitcoin theft of 2024, the FBI documented a fake recruiter who sent a Ginco engineer a malicious pre-employment coding test, stole a session cookie, impersonated the engineer and manipulated a legitimate transaction request. In Bybit, Sygnia traced the loss to a compromised developer workstation at the wallet provider, stolen cloud session tokens and a tampered signing interface. Same playbook, different entry. Precedent is not evidence, but it is a very good search warrant.
Link 2: From container to withdrawals
Link two is the one nobody has explained: how access to a container became accepted financial instructions. A container is a packaging and execution boundary, not an authorization boundary. An attacker who controls a workload inherits its permissions without touching a key, and a withdrawal submitter has, by design, standing permission to ask the signing layer for signatures. The candidate paths are misuse of that service identity, modification of withdrawal requests in flight, deployment of altered code under a stronger identity, manipulation of policy or approvals, or direct access to a signing interface. More than one may have been used. What the chain tells us is that whatever the attacker reached sat upstream of every signer Binance operates, or could reach each of them in turn.
Link 3: Preparation
Link three is preparation, and it is the link that tells you who you are dealing with. The operator wallet was funded from Tornado Cash starting the morning of October 28, in three withdrawals of about 0.098 ETH from the 0.1 ETH pool. On October 29 the attacker deployed a first delegate contract at 02:28 and tested it against a wallet of their own. At 13:51 they ran a rehearsal that is worth a second look: a test wallet delegated with three authorizations at nonces 0, 1 and 2, of which exactly one applied. That is the nonce-window trick, tested on their own money six and a half hours before they used it on Binance. The final contract went live at 15:59, a second rehearsal exercised the sweep path three times between 16:25 and 16:47, and the test funds were routed back. I spent eleven years in naval cyber operations and this discipline is recognizable: fund, build, test, rehearse, execute in one burst, then move the money before the defender has read the first alert.
Link 4: The burst
Link four is the burst. XRP Ledger first, at 20:05, five wallets emptied down to their reserve. Solana and Optimism from 20:10. Bitcoin at 20:20, 18,270 BTC in one transaction, split into 1,000 and 100 BTC pieces inside the same block. The Ethereum delegation at 20:20:59. Tron at 20:22. The Ethereum sweep at 20:24:23, and 24 seconds later a second Ethereum hot wallet, Binance 16, signing its own transfer of about 28,006 ETH and 108 million dollars in tokens to the same receiving address with no delegation involved. Avalanche and Polygon followed in a second wave at 23:05. Eight chains in about twenty minutes, then two more three hours later, with different key types and different serialization formats.
Link 5: The pipeline that kept feeding the drain
Link five is the part that should keep custody engineers awake. Binance 14 kept processing ordinary withdrawals after the drain, batched calls and USDT payouts included, which means the exchange's own pipeline kept feeding the compromised wallet while the attacker's code swept every arrival. Six more sweeps followed between 21:04 and 23:56. At 23:17 the wallet was still running attacker code. The delegation was cleared at 00:10:35 on October 30, three hours and fifty minutes after it was installed.

Attack chain · 7 steps, 1 unexplained
Binance has confirmed the first two boxes, the chain shows the last four, and the dashed box in between is the one the post-mortem has to explain.
Ethereum in detail: one signature, fifty nonces, a wallet that works for two owners
The attacker never withdrew from Binance 14 in the usual sense. They used one valid authorization to change how the account behaves, then operated it as their own for nearly four hours while Binance kept using it too. The details below are where the lessons are.
What EIP-7702 does
EIP-7702 shipped with the Pectra upgrade in May 2025. It adds a transaction type (0x04) that carries a list of authorizations. Each is signed by the account being delegated and contains a chain ID, a delegate address, and a nonce.
- What gets signed: not a transaction, but a hash of the byte 0x05 plus those three fields (29 bytes here).
- When valid: the protocol sets the account’s code to 0xef0100 plus the delegate address (23 bytes) and raises the account’s nonce by one.
- Effect: every call to the account, even a plain transfer, runs the delegate’s code in the account’s own context.
- Duration: until the account signs a new authorization. One pointing at the zero address clears it.
- Invalid entries: skipped, and the transaction moves on. The outer sender pays 25,000 gas per entry, valid or not.
All of this is specified behavior. Nothing was broken on October 29.
The carrier transaction
- Transaction: 0xad99…298b, block 26,300,753, 20:20:59 UTC.
- Sender: operator wallet 0x7C86…5CA0, an address that was empty two days earlier.
- Contents: no value, no calldata, about 0.0065 ETH in gas. The only payload was 50 authorizations.
- Details: all use chain ID 1 (so none worked on other EVM chains) and all point to the same delegate, 0x63e8…6fAe.
- Signer: every signature recovers to Binance 14 (0x28C6…1d60), the exchange’s busiest Ethereum hot wallet, with close to nineteen million transactions sent. We verified all 50 offline against the EIP-7702 message format, and 808bits independently reached the same result.
Why fifty nonces
The nonces run in descending order, from 18,914,824 to 18,914,775. They are the fingerprint of the access.
Binance 14 sent a transaction roughly every six seconds (33 in the three minutes before the attack), so any single nonce goes stale within seconds. The attacker covered a range instead:
- The lowest nonce, 18,914,775, became live at 20:17:47, 3 minutes 12 seconds before the carrier was broadcast. The batch starts at the nonce the wallet had when the signatures were produced and reaches 49 positions ahead, about five minutes of headroom.
- By inclusion, the wallet had advanced to 18,914,808 through its own transaction five positions earlier in the same block, so the entry for 18,914,809 was the match.
Since tuples are processed in order and the nonce bumps after each success, descending order meant exactly one entry took effect: those above the live nonce were skipped as premature, the match applied (moving the nonce to 18,914,810), and the rest were stale.
An ascending list would have applied every entry from the live nonce upward and made the nonce jump by sixteen in one block, which a withdrawal pipeline would notice. Intent or luck, the result was a wallet that kept working for Binance and the attacker at once.
What the batch says about the signatures
An attacker holding the raw key would sign one authorization at submission time. Fifty pre-signed ones suggest someone who could get the key to sign digests but could not control when, how fast, or how many times. From outside, that looks like a signing service with a request queue.
A 7702 authorization digest is 32 bytes like any other, so a service that signs raw digests cannot tell it from a transaction hash. Every transaction-level policy check (destination, amount, calldata) never runs. A signer that parses what it signs and only knows transaction formats would have refused these.
So either Binance’s signing path signs raw digests, or it supports 7702 authorizations as a message type and nothing in front of it objected to fifty of them. Both are inference. Only Binance’s signer request log can settle it.
The delegate contract
The contract at 0x63e8…6fAe is unverified and was deployed at 15:59 from the operator wallet.
- Its bytecode hardcodes the operator wallet as the only permitted caller. The four paths we examined revert for anyone else.
- A sweep function takes a destination and a token list, then forwards the account’s full ETH balance and the full balance of each token.
- Because the code runs in Binance 14’s context, every transfer shows Binance 14 as sender. It looks like a normal payout, except for where the money goes.
Sweep one
At 20:24:23 (3 minutes 24 seconds after the delegation), in block 26,300,770, the operator called Binance 14. Binance 14 ran the attacker’s code, which emptied the account into the hub 0x5227…2f8c (transaction 0x53bd…e2f3).
- The receipt holds 64 logs, 63 of them Transfer events across 63 token contracts, all from Binance 14 to the hub.
- The USDT contract alone records 1,615,409,498.97 USDT.
- Every reconstruction reports 167,464 ETH, though the public trace endpoint did not return the internal ETH transfer in our capture.
- A few token transfers reverted and the transaction still succeeded, so the sweeper was built to tolerate failures.
Total: roughly $2.5 to $2.8 billion in one transaction, depending on whose prices you use.
Reaching an account they never touched
Hot Wallet 34 (0xEe7a…4055) is an ERC-1967 proxy smart account that lists Binance 14 as its operator.
- At 20:41:23 the operator called Binance 14 with a different function. The delegated code called execute on Hot Wallet 34 with an ERC-20 transfer, moving 780 million USDC to the hub (transaction 0xdc10…7481, block 26,300,855).
- Another 43 million followed at 20:59:47. Together that is the 823 million USDC Circle froze.
No second key, no second compromise. The authority relationship between the two accounts did the work, and I would bet nobody at Binance had it written down as an attack path. Halborn’s October 2025 post on EIP-7702 security considerations showed the same property from the protocol side: a delegated account still appears as the caller, so a check keyed to that address can be passed by whatever code the account delegates to.
Not a one-shot drain
Bitquery counts seven calls to the wallet over three hours and fifty minutes:
- 21:04:23: about 1,700 ETH and $4.4 million in tokens, arriving from Binance’s own deposit sweepers.
- 21:44:11: 200.39 million USDT and 370 ETH.
- 22:39 and 23:56: further sweeps.
Binance moved that 200 million USDT into Binance 14 at 21:43, eighty minutes after the main drain, and the attacker’s code took it about a minute later. It arrived frozen only because Tether had blacklisted the hub at 21:01. The exchange’s own replenishment logic fed a compromised wallet, and the issuer’s blacklist caught it.
Issuers as the kill switch
- Tether: blacklisted Binance 14 itself at 22:06.
- Ripple and World Liberty: froze RLUSD and USD1 in the hot wallet by 22:26.
- Circle: froze Binance’s compromised wallets from 23:53.
- Binance: cleared the delegation at 00:10:35 on October 30 (transaction 0xafbf…7209, block 26,301,896). Binance 14 sent a type-4 transaction itself, authorizing the zero address at nonce 18,914,904, one above the outer sender nonce, as the specification requires for self-sponsored delegation. The account’s code is empty again.
Two notes for anyone running a similar wallet:
- Advancing the nonce does not remove a delegation.
- Clearing the code is pointless if the attacker can still obtain a replacement signature.
The open question
Binance 16, the second Ethereum hot wallet, signed nine ordinary transfers to the attacker worth about $174 million, with no delegation at all. So the attacker could already get plain signed withdrawals. Why use 7702 on Binance 14?
My reading is persistence and independence. One signature bought unlimited, policy-free control of the largest wallet until someone revoked it, with no further requests through a compromised path that could be cut at any moment. It also gave the attacker every inbound deposit plus reach into the smart account.
A withdrawal is an event. A delegation is a position.
The other nine chains, and what they say about the signing path
Nine other chains lost money through nothing more exotic than correctly signed transfers, and that is the strongest evidence that the compromise sat in the signing path rather than in one wallet's key. The Ethereum delegation gets the headlines because it is clever. The Bitcoin transaction is the one that should worry a custodian more, because it is so ordinary.
| Chain | What left | How | Time (UTC) |
|---|---|---|---|
| Ethereum | About 3.79 billion dollars: 200,630 ETH and 185 tokens, including 1.875 billion USDT, 823 million USDC and 88.5 million RLUSD | EIP-7702 delegation on Binance 14; nine plain signed transfers from Binance 16 | 20:20 to 23:56 |
| Bitcoin | 18,270 BTC, about 1.47 billion dollars | One signed transaction from a hot wallet; peel chain starts in the same block | 20:20 |
| Tron | 612.7 million USDT and 46.4 million TRX, about 628 million dollars | Plain signed transfers from a hot wallet | 20:22 |
| XRP Ledger | 233.46 million XRP, about 296 million dollars | Five wallets each emptied to the reserve minimum, to one address | 20:05 to 20:09 |
| Solana | 970,500 SOL, about 96 million dollars | Plain signed transfers | From 20:10 |
| Arbitrum, Optimism, Base | About 39 million dollars combined, including 74.6 million ARB | Plain signed transfers | From 20:10 |
| Avalanche | About 28 million dollars | Plain signed transfers, second wave | 23:05 |
| Polygon | About 10 million dollars | Plain signed transfers, second wave | 23:05 |
| NEAR | Reported by Elliptic, no figure published | Plain signed transfers | First wave |
Figures are TRM's valuation at the moment of transfer; Bitquery's per-chain numbers differ by a few million where the two overlap.
Look at what those chains have in common: nothing. Bitcoin, Ethereum and Tron sign with secp256k1 ECDSA over three incompatible serialization formats. Solana signs with ed25519. The XRP Ledger supports either curve and has its own binary encoding. A single leaked private key explains none of this. A single leaked key store, an HSM partition or MPC cluster that holds all the hot keys behind one interface, could explain it. So could a signing service that signs whatever the withdrawal service asks for, which is the simplest reading of Binance's own statement that a container used to submit withdrawals was reached. Either way, the attacker did not need ten exploits. They needed one position upstream of every signer.
The detail of each chain adds texture. On the XRP Ledger the attacker emptied five wallets down to the reserve, which means they knew the balances, the addresses and the reserve rule before they started. On Bitcoin the 18,270 BTC moved in one transaction and the splitting into 1,000 and 100 BTC pieces began inside the same block, so the child transactions were built and ready before the parent confirmed. On Ethereum, Binance 16 signed nine ordinary transfers worth about 174 million dollars 24 seconds after the Binance 14 sweep, no delegation involved, which proves the attacker could obtain plain withdrawals and chose delegation for the big wallet on purpose. Bitquery notes that the XRP and Solana drains share no address with the rest of the operation and are tied to it only by timing and transaction construction; I accept the tie, with that caveat on the record.
Then there is the second wave. Avalanche and Polygon were hit at 23:05, about half an hour after Binance had confirmed the incident and paused withdrawals. Either those transfers were signed earlier and held back, or the attacker's access outlived the pause. The difference between those two sentences is the difference between a contained incident and one that was still running after the press statement, and only Binance's signer logs can tell them apart.
So what is the working hypothesis? I rank them the way I would in a register, with what would separate them.
| Explanation | My assessment | What would settle it |
|---|---|---|
| Abuse of a trusted withdrawal or signing path | Leading hypothesis. Fits Binance’s statement, the coordinated outflows across incompatible chains and the fifty-nonce batch. The internal sequence is unproven. | Correlated identity, withdrawal, policy and signer records |
| Theft of key material | Possible, not established. “No evidence of a key leak” is narrower than proof that none occurred. The batch of fifty argues against direct key control. | Key access and export evidence, signer logs, endpoint artifacts |
| A phished Ethereum delegation alone | Explains Binance 14 and nothing else | Evidence of separate compromises per chain |
| A failure of signature cryptography or consensus | No evidence. Every signature recovers correctly and every transaction is valid. | Proof of forgery or invalid state accepted by a network |
| Insider or provider compromise | Unresolved. Public evidence cannot attribute either way. | Access history, change records, personnel and provider evidence |
The question that decides the root cause is simple to state and impossible to answer from the outside: which identity caused which component to authorize which bytes, and why did that instruction pass? Public chains show execution. They never show intent.
Cash-out, freezes and the race against the issuers
The issuers froze about 2.8 billion dollars, and most of it within 47 minutes of the main sweep, but the attacker had moved 700 million USDT out of the hub before the first freeze landed and converted close to 800 million dollars of stablecoins into assets nobody can freeze. The speed of the brake mattered less than the timing of the sweep. Both sides had rehearsed.
| Issuer or body | Chain | Frozen at (UTC) | After the sweep | Amount |
|---|---|---|---|---|
| Tether, USDT | Ethereum | 21:01:35 | 37 min | 971.1 million at freeze, about 1.18 billion by later reads as sweeps kept landing in the frozen hub |
| Circle, USDC | Ethereum | 21:04:59 | 41 min | 823 million |
| Tether, USDt | Avalanche | 21:07:55 | 44 min | 8.4 million |
| Tether, USDT | Tron | 21:09:12 | 45 min | 312.7 million, plus 66 million one hop further |
| Tether Gold, XAUt | Ethereum | 21:11:23 | 47 min | 12,574 ounces, about 50.6 million |
| Ripple, RLUSD | Ethereum | 22:00:59 | 1 h 37 min | 40.5 million; 48 million had already been sold |
| World Liberty, USD1 | Ethereum | 22:10:35 | 1 h 46 min | 27.8 million |
| Paxos, PAXG | Ethereum | 22:30:47 | 2 h 6 min | 1,907 ounces, about 7.7 million |
| Binance, WBETH | Ethereum | 22:48:35 | 2 h 24 min | 29,934 WBETH, about 76.9 million |
| Tether, USDT0 | Polygon | 23:25:39 | 3 h 1 min | 6.2 million |
| Arbitrum Security Council | Arbitrum | 00:18:20 | 3 h 54 min | 74.6 million ARB and 8,426 ETH, force-moved to a frozen wallet |
| First Digital, FDUSD | Ethereum | 00:46:11 | 4 h 22 min | 3.5 million |
| ETH, BTC, XRP, SOL, TRX, AVAX, POL, NEAR | Various | Never | No issuer or chain body can freeze them |
Times and amounts from OnChain Benchmark's freeze chronology, cross-checked against TRM and Elliptic where they overlap. Amounts in US dollars unless stated.
The attacker's cash-out was built around the freeze. Between 20:30 and 20:33, before Tether acted, 700 million USDT left the hub in two transfers; Tether later caught 205 million of it one and two hops downstream. Roughly 434 million USDT was sold for about 160,451 ETH through Uniswap, 1inch and the request-for-quote systems of professional market makers, at an implied loss of 12 to 26 percent against market. A second wallet deposited 59.9 million USDT into Aave and borrowed 19,762 ETH against it before Aave froze the affected markets. On Tron, 234 million USDT became 638 million TRX on SunSwap, and 300 million more USDT was parked in JustLend. Forty-eight million RLUSD was sold on decentralized exchanges in the twenty minutes before Ripple froze the remaining 40.5 million. About 150 smaller tokens were dumped for ETH. Elliptic puts the stablecoin value converted before freezes at about 786 million dollars. The attacker paid a double-digit haircut for speed, and it was the right trade: everything they did not convert in time is now frozen.
The professional fillers who took the other side of those trades deserve a paragraph of their own. A wallet that received stolen funds minutes earlier sold hundreds of millions in USDT to market makers and intent-based solvers who, with real-time address screening, would have declined. If the attribution below holds, those counterparties now have a sanctions problem as well as a reputational one.
What the attacker keeps is what nobody can freeze. By Elliptic's count about 3.33 billion dollars sat in roughly 43 addresses: 511,861 ETH, 18,270 BTC, 233 million XRP and 670 million TRX, with about 445 million in XRP, SOL and NEAR that has not moved at all. The bitcoin went through a short peel chain into 19 addresses, mostly 1,000 BTC each, and none has touched a service. Almost nothing has reached a bridge, a mixer or an exchange; the exception is about 1.9 million dollars of TRX, some of it through THORChain. The Arbitrum Security Council's forced transfer of 8,426 ETH and 74.6 million ARB between 00:08 and 00:18 was the only chain-level brake anywhere. Ethereum has no equivalent, and the ETH is gone.
On attribution, TRM states high confidence that this is TraderTraitor, the North Korean unit the FBI named for Bybit, on the basis of on-chain and off-chain intelligence it has not published. Elliptic says likely, and lists its reasons: a laundering address shared with the September Bitget theft, 0x1510…feb7, although only about 39,000 dollars of Binance funds reached it against 510,000 linked to Bitget; the preparation pattern of Tornado Cash funding, rehearsal and pre-signed bursts seen in Bybit and in KelpDAO in April; the targeting of staff, which matches the DMM Bitcoin case; and the capability to drain eleven chains in three hours. Elliptic also lists the caveats: the shared address could be a launderer serving several clients, the stablecoins were held longer than North Korea usually holds them, the cash-out went through market makers and lending rather than bridges, and no government has said a word, whereas the FBI attributed Bybit within five days. Binance has named nobody.
My view is that the pattern fits and that a compliance team should act on it today rather than wait for a press release. Screening against the attacker addresses costs nothing. Being the desk that filled the next 100 million USDT from a North Korean wallet costs a great deal.
The lesson: the key was never the target
Bybit and Binance are the same failure in different clothes. In both, the legitimate signing system produced a valid signature for the attacker's transaction, and in neither was a key broken, extracted or, as far as anyone can show, copied.
Recall Bybit, February 2025, about 1.5 billion dollars from a cold multisig. The attackers compromised a developer workstation at the wallet provider, took cloud session tokens, and injected JavaScript into the signing interface that was served only to Bybit's addresses. The signers, on hardware wallets, approved what the screen showed them: a routine transfer. What they signed was a delegatecall that swapped the implementation behind their Safe for the attacker's contract. The keys did exactly what keys do. The intent was forged at the human boundary, between the eyes of the approver and the bytes under the signature. DMM Bitcoin, 2024, was the same idea one step earlier: a legitimate transaction request manipulated after an engineer's session was stolen.
Binance moved the forgery one layer deeper, to the machine boundary. Nobody needed to fool a human approver because the service that constructs and submits withdrawal requests was itself the attacker's instrument. The signer saw requests from the component it trusts, in the format it expects, and signed. Eight chains in twenty minutes, two more three hours later, valid signatures everywhere. If you wanted to design a demonstration that the key is not the asset, you could not do better than these two incidents twenty months apart.
Here is the distinction I want every custody architect to internalize. A signing system makes two separate promises: the key cannot leave, and only authorized requests get signed. HSMs and MPC make the first promise strong. They say nothing about the second. A cloud KMS illustrates it well: the private key is non-exportable, and any caller with the right permission can have it sign any digest. Splitting a key across MPC parties does not create independent approval if every party accepts the same compromised request source. An MPC cluster behind a single policy engine is a single point of failure with extra steps. I have sat through enough vendor demos where the whole pitch was the key ceremony. Nobody demos the request path, and the request path is where the last 8 billion dollars went.
The architecture that survives this separates three functions and gives each its own trust boundary. Initiation and validation authenticate the user, the session and the device, check entitlements, balances, destination allowlists, limits and cooling-off periods, and keep automated sweep destinations under change management. Independent authorization enforces the transaction policy inside a separate, tamper-resistant boundary that the orchestration layer cannot reach, over a typed and decoded request: chain, destination, asset, amount, nonce and expected effect, all bound to the approval. Signing protects the key with hardware or MPC and adds human approval with trusted display for anything exceptional. The objective is one sentence: a fully compromised upstream component cannot produce a valid signature outside policy. The test is one procedure: change a material field after approval and watch the signer reject it.
Two corollaries follow from the Ethereum evidence. First, a digest-only signing interface is blind signing at the service level. If the policy engine sees 32 bytes, it enforces nothing, and an authorization that changes the account's future behavior looks exactly like a routine payout. Anything the signer cannot parse should be refused, and anything that starts with the 0x05 magic byte should route to a policy that almost nobody has written yet. Second, risk scoring by amount is wrong. The transaction that changed everything carried zero value and cost 0.0065 ETH in gas. A policy engine that waves through small transactions would have waved through the one that mattered.
And one question to ask of every identity in the environment, human or workload: what can this identity cause, directly or through another component? Binance's DevOps identity could reach a container that could submit withdrawals. Whether the policy in that path was missing, bypassed, changed or fed the wrong data is unknown, and the answer changes the remediation completely. Nominal separation between services means nothing if one identity can alter the requester, the policy and the signer's inputs. Effective authority is the only authority that counts.
Not every digital asset fails the same way
About 44 percent of the stolen value is frozen and zero percent has been recovered, and which asset fell into which bucket was decided by its legal and technical design, not by anything the attacker did. That is the second lesson of this incident, and for a bank it may be the more useful one.
Native assets, meaning BTC, ETH, SOL, XRP, TRX, AVAX, POL and NEAR, have no issuer. Control rests with whoever can produce a valid signature, and once the transfer confirms, getting the asset back requires the cooperation of whoever receives it next: an exchange, an OTC desk, a bridge operator. The one exception this week was the Arbitrum Security Council force-moving 30 million dollars out of the attacker's wallet, which is both a recovery and a reminder that a chain's governance can move your assets too. Bybit's experience with 401,000 ETH says that most of the native assets taken here will be laundered over months and never return.
Stablecoins carry an administrative plane. Tether froze within 37 minutes and Circle within 41, and between the issuers roughly 2.8 billion dollars stopped moving. The same power cut both ways: Tether blacklisted Binance's own hot wallet to stop the sweeper, and Circle froze Binance's compromised addresses. A bank holding stablecoins should write both facts into its risk register. The issuer's freeze is a recovery control you do not operate, and it is also an availability risk on your own balances, through contamination, mistaken listing or a court order in a jurisdiction you do not choose.
Freezing is not recovering. A blacklisted balance sits in the thief's address until the issuer burns and reissues it under a legal process, which takes months, a competent authority and a claimant with a provable title. Binance will probably see most of its frozen USDT and USDC again. It will not see it next week, and the operational and legal steps between frozen and returned are part of the recovery plan, or they are not a plan.
Tokenized securities and regulated tokenized assets sit at the other end. Depending on their design, the issuer, registrar or transfer agent keeps the ability to freeze, force a transfer or reissue after a compromise; the ERC-3643 permissioned token standard and CMTAT both carry those functions by design, and Stellar's clawback does the same at protocol level. A stolen tokenized bond is a registrar operation away from being back. A stolen ETH is gone. Tokenized deposits go one step further: the bank runs the ledger, so the theft risk moves entirely onto the administrative plane, the keys that mint, freeze and force transfers. Lose those and the impact is not a tier of float, it is the rules.
The design consequence is that digital asset custody cannot run on one uniform security model. The underlying asset's legal nature, transferability, administrative controls and recovery path change its risk profile, and this week they changed how much of 6.3 billion dollars could be immobilized. Hot tier limits should be set per asset class, with a native-asset float well below a stablecoin float of the same operational need, because a native loss is final. Recovery playbooks should be written per asset class, with the issuer contact, the legal basis and the expected timeline for each. And risk assessments should score the same control differently depending on what sits behind it: a signing compromise over a tokenized bond is a bad day; the same compromise over a BTC hot wallet is a write-off.
What this means for banks and regulated custody
For a bank this is not a crypto story. It is a demonstration that one engineering endpoint reached the asset-moving path of the largest operator in the industry, and that is the test every supervisor will now apply to yours. Nine controls follow from the evidence above. Each comes with the check that proves it works, because a control without a test is a slide.
- Enforce policy inside the signer.
- Transaction policy must live in a boundary the orchestration layer cannot reach: the HSM, the co-signing enclave, or a separately operated policy service with its own identity.
- It must evaluate a decoded request, not a digest.
- Our position with the banks we advise has been a hardware core, with policy enforced inside the HSM boundary under a human quorum, and a capped operational lane on an MPC platform for daily flows. Nothing this week argues against it, and everything argues for the cap.
- Check: Change a material field after approval and the signer rejects it. Present an unknown message type and the signer refuses it. Assume the withdrawal service is hostile and show that it still cannot obtain an out-of-policy signature.
- Size the hot tier to what you can afford to lose in twenty minutes.
- Binance lost about four percent of what it held, which sounds like a conservative hot allocation until four percent is six billion.
- Replace generic hot-to-cold ratios with a maximum tolerable loss per tier and per asset class. Enforce it with hard value caps, per-chain velocity limits, aggregate cross-chain exposure limits, and automated circuit breakers.
- Replenish through intermediate wallets, with independent human authorization for material top-ups. Binance’s own pipeline pushed 200 million USDT into a compromised wallet eighty minutes after the drain.
- Check: A simulated coordinated drain across every chain stops at the defined exposure, and replenishment halts before more assets become reachable.
- Segment by chain and by tier.
- More than ten hot wallets on ten chains fell to one foothold because something upstream served all of them.
- Separate keys, signing infrastructure, policy engines, and operators. The cold tier and the hot tier must never share a signer, and no single service should be able to request signatures for every chain.
- Check: A red team with full control of one operational domain reaches a bounded set of wallets and nothing else.
- Inventory authority, not just balances.
- Hot Wallet 34 held 823 million USDC and was never compromised. It was reachable because Binance 14 was its operator.
- Every wallet that can operate another account, vault, or contract is a path to the assets behind that relationship. That includes executor roles, operator rights, token allowances, administrative roles, and delegated code.
- Check: A change in a treasury wallet’s code or execution authority raises an alert in an independently operated system, and the dependency inventory names every downstream account to examine.
- Treat engineering and DevOps endpoints as tier zero.
- Separate daily development from privileged administration. Use dedicated identities, hardware-bound authentication, short-lived just-in-time credentials, independent approval for production changes, and strict isolation from anything that signs.
- Endpoint detection helps and does not replace the authorization barrier.
- Brief engineers on the lures North Korea uses on them specifically: recruiters, coding tests, trojanized packages, and collaboration projects that ship a loader.
- Check: A stolen ordinary session cannot obtain treasury privileges or promote arbitrary code to production. Every privileged session can be listed, terminated, and reconciled against what the workloads did afterward.
- Write a policy for delegation.
- On every EVM chain, reject EIP-7702 authorizations by default.
- Route anything that starts with the 0x05 magic byte to its own rules.
- Alert on a request for authorizations across a range of nonces.
- Monitor treasury addresses for code where there should be none. A delegated account reports a code size of 23 bytes beginning with 0xef0100.
- Keep a rehearsed revocation runbook with a pre-approved signing path.
- Keep a cold-signed migration plan for the day the signer itself cannot be trusted, because clearing a delegation with a compromised signer achieves nothing.
- Check: The runbook has been executed on a test wallet in the last quarter, with times recorded.
- Prepare asset-specific response, and measure it in minutes.
- Pre-agree contacts and request formats with every issuer whose asset you hold, and keep a blockchain intelligence partner on call.
- Hold a playbook that does four things within the hour: gets a freeze request out, suspends signing, revokes credentials and authorizations, and checks persistent on-chain state chain by chain.
- Rehearse the part that follows the freeze: the legal basis, the claimant, the jurisdiction, and the timeline for actual restitution.
- The regulatory clock runs in parallel. Under DORA, a major ICT incident needs:
- an initial notification within four hours of classification and no later than 24 hours after you become aware;
- an intermediate report within 72 hours;
- a final report within a month.
- Check: A tabletop that starts at a simulated 20:24 and ends with a freeze request sent, a notification drafted, and a recovery claim outlined, timed.
- Know your counterparty exposure before the next one.
- Balances at exchanges, prime brokers, and market makers, plus settlement arrangements and liquidity providers, all create exposure without any compromise of your own infrastructure.
- Two market makers disclosed exposure to Binance within hours. A bank should be able to do the same for any venue in an hour.
- Use off-exchange settlement for trading flows wherever the venue supports it.
- Screen counterparties in real time. If the attribution holds, desks that filled the attacker’s USDT sales now carry a sanctions problem.
- Check: For every venue, the exposure figure, the owner, and the time to produce it.
- Expect the supervisor’s questions and answer them first.
- MiCA: A crypto-asset service provider is liable to clients for the loss of crypto-assets resulting from an ICT incident attributable to it, up to the market value at the time of loss. The hot tier cap is therefore a balance sheet decision, not only a security one.
- DORA: The custody provider’s signing path is third-party ICT risk inside your perimeter. This incident is the scenario your next threat-led penetration test should simulate end to end, from a developer laptop to a signed withdrawal.
- FINMA: A FINMA-supervised bank should assume the question will be how a compromised engineer endpoint could reach a signing path. Have the diagram, the controls, and the evidence ready before it is asked.
- Proof of reserves: Treat it for what it is, a snapshot of balances, not of control. Binance will publish an updated one, and it would have shown a healthy balance sheet at 20:00 on October 29. Assurance over the signing path is worth more than attestation over the balance.

Trust boundaries · 3 gates, 1 failure path
A request that leaves the operations zone must pass a policy engine that zone cannot reach before any key sees it; on October 29 the requests went straight to the signer.
Ten questions to put to a custody provider this week
Ask these in writing and insist on evidence rather than a slide. A provider that answers all ten with architecture documents, test reports and drill timings is one you can defend to a supervisor. A provider that answers with adjectives has just told you where its policy engine lives.
- Where exactly is the transaction policy enforced, and what evidence shows that a fully compromised orchestration host cannot obtain a signature outside it?
- What does the signer actually sign: a decoded, typed request bound to chain, destination, asset, amount and nonce, or a 32-byte digest? If a digest, what independent mechanism proves what the digest represents?
- How does the signer treat EIP-7702 authorizations and equivalent delegation or account-abstraction primitives on each supported chain? Are they denied by default, and does a request for authorizations across a range of nonces raise an alert?
- How many chains and tiers can one compromised operator endpoint reach, and how long does revocation take once you know?
- Which of my wallets can operate other accounts, through executor roles, operator rights, allowances or administrative roles, and will you alert me when the code or the execution authority of a treasury address changes?
- What are the hard value caps and velocity limits per wallet, per chain and in aggregate, and who can change them, under what quorum and what time-lock?
- How is replenishment of operational wallets authorized, and does it halt automatically when outflows are anomalous?
- What is your incident playbook with stablecoin issuers, with named contacts and request formats, and what was your measured time from alert to freeze request in your last drill?
- Who at your company can reach the signing infrastructure, from which devices, under which identity, and how are developer and DevOps identities kept away from it? Show me the last access review.
- When did you last run a threat-led test that starts from a compromised engineer laptop and ends at a signed withdrawal, and what did it find?
How Halborn can help
Halborn helps banks, exchanges and custody providers test the claims behind the ten questions above. A Custody and Key Management Assessment reviews where transaction policy is enforced, what the signer actually signs, and how far one compromised endpoint can reach. A Red Team Exercise simulates the path from a developer laptop to a signed withdrawal and measures detection and response along the way. Technical Due Diligence applies the same scrutiny to third-party custodians and platform providers, and Compliance Readiness maps the findings to the regulatory requirements that apply, such as MiCA, DORA and other digital asset mandates. Halborn has advised more than 20 financial institutions on digital asset security. To discuss an assessment of your custody environment, get in touch with Halborn.
Indicators, open questions and references
The indicators below come from public explorer labels and published reconstructions; the chain proves address behavior, not legal ownership. For screening, use the labeled sets maintained by the blockchain intelligence firms, which are more complete and are updated as funds move.
| Type | Indicator | Context | Source |
|---|---|---|---|
| Victim hot wallet, Ethereum | 0x28C6c06298d514Db089934071355E5743bf21d60 (Binance 14) | Delegated at 20:20:59, cleared at 00:10:35 | Observed |
| Operator wallet | 0x7C8601d4645b93cea45f71e118a729332e6b5ca0 | Sent the type-4 transaction and every sweep, paid all gas, funded from Tornado Cash | drk, Bitquery |
| Gas-funding wallet | 0xe4f9070e1316de2988fc6f869fead8fb99cc74cd | Tornado Cash withdrawals, top-up of 1.08 ETH at 18:20 on October 29 | drk, Bitquery |
| Delegate contract | 0x63e842B054Bd624a465454D533C33F573e9c6fAe | Sweeper with hardcoded operator check, deployed 15:59 | Observed |
| Main receiving hub, Ethereum | 0x5227f603C1eE34CE3C06eFe6477003BDfCCB2f8c | Holds the frozen USDT and USDC | Observed, TRM |
| Second receiver, Ethereum | 0xa97bf7836f8a08f9ed91d41453d371493fae8d10 | Bitquery | |
| ETH consolidation wallet | 0x8532FA14ACAf483729C449b8458aedDb900543D4 | Received about 195,460 ETH from the hub at 20:38 | SOCRadar |
| Bitget-linked address | 0x15104a9ce0f08a8f0075a0869ae80e795fe0feb7 | Commingling point with the September Bitget proceeds; small volume | Elliptic, ZachXBT |
| First receiver, Tron | TG5iBMQPrDzJJAUM8GMVBf1hRaJ1wvzsGi | Bitquery | |
| First receiver, Bitcoin | bc1q0mtc2f5agpkvlq6hhahmfr3hlr55kyfjhl2mnm | Head of the peel chain | Bitquery |
| Receiver, XRP Ledger | rK21t6nGLy4MNDqhvy3pGwcLFy25qgfzMx | Bitquery | |
| Receiver, Solana | AffzFDKZbyMiU11zmVBoAqD25ugpr7xoWWyRyGigBEaU | Bitquery | |
| Delegation transaction | 0xad99264d5532ae0dd04b2004eebda05f25657e70dacb764f7ac8d4ccd051298b | Block 26,300,753, 50 tuples | Observed |
| Sweep 1 | 0x53bd38b816c23e74134786c29a8c18d792777998a3b9326047b583100e88e2f3 | Block 26,300,770, 63 Transfer events | Observed |
| USDC movement | 0xdc102dd89dded5a83f1008906883ffb7c81ff3b7d7965d8c7277d170b5e17481 | Block 26,300,855, 780 million USDC from Hot Wallet 34 | Observed |
| Delegation cleared | 0xafbf94c92a8d749988411669fa14d4f8866d9b4420b4ebd299f28e958dac7209 | Block 26,301,896, authorization to the zero address | Observed |
| Pattern | Type-4 transaction carrying many authorizations across consecutive nonces | Indicator of compromise for any treasury signer | |
| Pattern | Code of 23 bytes beginning 0xef0100 at an address that should have none | Delegated treasury account | |
| Pattern | Small Tornado Cash withdrawals into a fresh wallet that later deploys contracts | Staging |
These are the questions Binance's post-mortem has to answer before anyone can call the root cause closed. I would treat them as the review checklist for any custody environment, because each one maps to a control above.
- How was the laptop compromised, by what lure or tooling, and how long did the attacker hold access before October 29?
- Which identities and workloads were reachable from the service container, and could the attacker deploy code or only call interfaces?
- Were withdrawal requests invented, altered in flight, replayed, or approved under a policy that had been changed or fed wrong data?
- What did the signer sign, through which interface, typed request or digest, under which authorization, and does the signer log show fifty requests in a three-minute window?
- Were the Avalanche and Polygon transfers at 23:05 pre-signed and held, or did signing access persist after withdrawals were paused?
- Why did replenishment of Binance 14 continue after the drain, and why did revocation take three hours and fifty minutes?
- Which other accounts were reachable through operator and executor relationships, and have all of them been reviewed?
- What positive evidence supports the statement that no key material was accessed, beyond the absence of evidence that it was?
I will update this analysis when the post-mortem is published. Until then, everything above the indicators table is a reconstruction from public evidence, labeled as such, and I would rather be corrected by Binance's logs than be confidently wrong.
Sources: Binance, TRM Labs, Elliptic, Bitquery, drk, 808bits, OnChain Benchmark, EIP-7702, SOCRadar, TechFlow and the FBI, DC3 and NPA press release, plus Halborn's own node retrieval and offline verification of the 50 authorization signatures. North Korea attribution comes from blockchain intelligence firms, not any government. Preliminary as of 30 Oct 2026.
