develicit
← Back to posts

$6.3 Billion Vanished — The Signing-Delegation Paradox in the Binance Hack

·24 min read

TL;DR — At 20:05 UTC on October 29, 2026, funds began leaving Binance's hot wallets. In about 20 minutes, roughly $6.3 billion was gone across 11 chains. It is the largest crypto theft on record. Binance said it found no evidence of a private-key leak. The attacker didn't steal the keys. They fed their own transactions into the system that signs with those keys. On Ethereum, an EIP-7702 delegation turned a hot wallet into a "sweeper" for 3 hours and 49 minutes.

1. What happened — the officially confirmed scope

Binance's official notice confirms the following.

  • It started with a compromised DevOps engineer's laptop. Through it, the attacker reached an internal service container.
  • From that container, the attacker submitted unauthorized withdrawal transactions.
  • There is no evidence that any wallet private key leaked.
  • Losses are about $6.3 billion. About $3 billion has been frozen.
  • Binance will cover all losses from the SAFU fund and company funds.

Binance later said it had found "additional breach points" beyond the laptop. Co-CEO Richard Teng described the EIP-7702 delegation this way: it "did not pass through our normal approval controls."

Not yet public — How the laptop was first infected is still unknown. So are the additional breach points, and the authority the container held over the signing system.

2. A 20-minute timeline

  1. 10-28 07:39
    Attacker wallet funded via Tornado Cash
    Three withdrawals from the 0.1 ETH pool (the last at 10-29 08:23).
  2. 10-29 02:28
    Testing and rehearsal
    Test contract deployed → delegation rehearsed on three test wallets → final sweeper deployed at 15:59.
  3. 20:05
    XRP Ledger drain begins
    233.46 million XRP from five Binance wallets, followed by Solana, Optimism, and others.
  4. 20:20:59
    EIP-7702 delegation on Binance 14
    One transaction carrying 50 authorizations delegates the hot wallet to the sweeper. 18,270 BTC drained at the same time.
  5. 20:24:23
    Ethereum drained in one transaction
    167,464 ETH and 63 tokens swept at once.
  6. 21:01 · 21:04
    Tether and Circle freeze
    The receiving address is blacklisted — after about 644 million USDT had already left.
  7. 22:15
    Binance halts withdrawals
    Withdrawals stop, but deposit consolidation keeps routing funds into the compromised wallet.
  8. 23:56:47
    Final sweep
    Sweeps even a 2,962 ETH deposit that arrived 1 hour 40 minutes after the halt.
  9. 10-30 00:10:35
    Binance revokes with its own key
    Delegation target reset to 0x0. The delegation had lasted 3 hours 49 minutes.
  • Preparation
  • Drain
  • Freeze
  • Withdrawal halt
  • Delegation revoked
Fig 1. Full incident timeline (UTC) — 36 hours of preparation, a 20-minute drain, freezes 37 minutes later, and 3 hours 49 minutes until the delegation was lifted.

3. The keys were safe — the signing-delegation paradox at exchange scale

A phone's Secure Enclave never lets a wallet key out. But what if malware asks it to sign a transaction of its choosing? The secure element signs it anyway. The key stays safe while the funds are drained — the signing-delegation paradox.

The Binance incident is that paradox at exchange scale. Side by side:

LayerMobile walletBinance hot wallet
Key custodySecure Enclave / StrongBoxHSM or MPC signing system (setup undisclosed)
Who requests signaturesWallet appInternal service container
What the attacker controlledMalware deceiving the app or the userEngineer laptop → container
ResultKey intact, funds stolenKey intact, funds stolen on 11 chains
Operations zone
DevOps engineer laptop
initial entry point
↓
Internal service container
holds signing-request rights
Normal path
↓
Risk / policy engine
whitelist · limits · anomaly detection
↓
Attack path
↓
Policy engine bypassed
"did not pass through normal approval controls"
↓
Trust boundary
Signing zone
Hot-wallet signing system
private keys exist only in here — no evidence of leakage

The same structure as a phone's Secure Enclave: the key never crosses the boundary, but any request that reaches it gets signed.

Fig 2. The trust boundary of the signing infrastructure — the keys never left the signing system. The attacker went from a laptop into a container, then fed requests to the signer along a path that skipped the policy engine.

Blockaid's CEO called it "key misuse, not key theft." The wallets on the other 10 chains all use different key types and signing schemes. Yet within about 30 minutes, every one of them sent funds via validly signed ordinary transactions. Binance's second Ethereum hot wallet also sent $174 million in nine ordinary transactions, with no delegation involved. Phishing can explain Ethereum alone. So TRM and Elliptic both conclude the attacker could issue commands directly to the hot-wallet signing infrastructure.

Key insight — "No private key was leaked" does not mean "safe." The security boundary does not stop at where the key lives. It must cover every path that can request a signature.

4. The EIP-7702 model — delegation designators and the nonce rule

EIP-7702 lets an EOA hand its code over to a smart contract. It does so through an authorization the EOA signs.

  • An authorization is a (chain_id, address, nonce, y_parity, r, s) tuple. It is submitted inside the authorization_list of a type-4 transaction.
  • Once applied, a delegation designator 0xef0100 || address is written into the EOA's code slot.
  • Any call to the EOA then runs address's code. The code uses the EOA's own balance and storage.
  • The delegation persists until it is replaced by a new authorization or cleared with address = 0x0.
  • The submitter and the signer can differ. In other words, anyone holding the signature can submit it.

To follow this incident, you need one part of the processing rule: the nonce check.

# EIP-7702 authorization processing (simplified from the spec)
for auth in tx.authorization_list:
    authority = ecrecover(auth)
    if auth.nonce != get_nonce(authority):
        continue                      # a failed authorization is skipped silently (the tx continues)
    set_code(authority, b"\xef\x01\x00" + auth.address)
    increment_nonce(authority)        # nonce +1 each time one is applied

Two properties matter.

  1. A failed authorization does not revert the transaction. So you can include many authorizations with different nonces. Only one needs to match at execution time.
  2. Each applied authorization bumps the nonce by one. So the order of the authorizations changes the outcome (§5.2).

5. Anatomy of the attack — what the chain shows

What the public reports leave out is still in the on-chain record. Follow the attacker's wallet and Binance 14 block by block, and the whole operation comes into view.

5.1 Thirty-six hours of preparation

The attacker EOA sent 23 transactions in total, nonces 0 through 22.

Time (UTC)NonceActivity
10-29 02:28:590Test contract v1 deployed
13:51:351Delegation on test wallet A
13:51:592Delegation on test wallet B
14:19:593Sweep test on wallet A
14:24:114Sweep test on wallet B
15:59:115Final sweeper deployed
16:20:476Delegation on test wallet C
16:25:597Delegation on wallet C again
16:30:118Sweep rehearsal on wallet C
16:47:239withdrawETH test on wallet C
20:20:5910Binance 14 delegation
20:24~23:5611~22Twelve sweeps and withdrawals (§5.3)

The funds came from three Tornado Cash 0.1 ETH pool withdrawals: the first, second, and third. Two hours before the attack, a separate gas wallet sent 1.08 ETH. Its first deposit also came from the Tornado 0.1 ETH pool. The sweeper's bytecode hard-codes authorizedCaller() to the attacker EOA.

Pattern — small Tornado top-ups → testing → rehearsal → batch execution of pre-signed authorizations. TRM sees the same sequence in the Bybit and KelpDAO incidents.

5.2 Fifty authorizations, in descending order

live nonce at processing: 809·nonces shown without the shared 189147 prefix
If ascending
  1. 775 … 808skipped · 34
  2. 809 … 824applied · 16
↓
nonce 809 → 825 (+16)
every pre-signed withdrawal (nonces 810–824) invalidated → ops alerts
Actual — descending
  1. 824 … 810skipped · 15
  2. 809applied · 1
  3. 808 … 775skipped · 34
↓
nonce 809 → 810 (+1)
looks like any other transaction → minimal footprint
Fig 3. The order of the 50 authorizations decides how loud the attack is — in ascending order 16 would have applied in a chain and the nonce would have jumped, but in the actual descending order only one applied and the other 49 failed silently.

The delegation transaction carries 50 authorizations. Every one targets the sweeper. Their nonces run consecutively from 18914775 to 18914824.

A Binance hot wallet processes withdrawals nonstop. So its nonce keeps climbing. The attacker obtained authorizations for 50 consecutive nonces and bet that one would match. But the order of the authorizations reveals something more interesting.

  • The authorizations were in descending nonce order (824 → 775).
  • In the same block, at index 133, Binance sent its own transaction. Its nonce was 18914808.
  • The attack transaction sat at index 138. So the only authorization that applied was 18914809. After the block, the nonce stood at 18914810.

Why pack them backwards? In ascending order, the nonce would become 810 once 809 applied. Then the next authorization, 810, would match and apply too. The chain would run all the way to 824, a 16-step jump in the nonce. Every withdrawal Binance had already signed (nonces 810–824) would become invalid. That would very likely trip operational alerts at once. In descending order, one authorization applies and every remaining one has a lower nonce. They all fail silently. It is, in effect, an ordering that minimizes the footprint.

The gas used, 1,258,562, fits this picture. Start with the 21,000 base cost and add 50 authorizations × 25,000. Subtract a 12,500 refund for the one applied to an existing account, and you land almost exactly there. The 49 failed authorizations still paid gas.

So when were these authorizations signed? Binance 14's nonce passed 18914775 at 20:17:47. That is exactly where the signed range starts. The wallet processes roughly 10 transactions a minute. So 50 nonces buy 4–5 minutes of headroom. The attacker most likely got the authorizations in real time, about three minutes before submitting them. That fits TRM's view: "access was time-limited, or signatures had to be requested through the system."

5.3 Three hours and 49 minutes — twelve attacker calls

Time (UTC)FunctionResult
20:24:23sweep167,464 ETH + 63 tokens (including 1,615.41 million USDT)
20:41:23callExecute780 million USDC pulled from a Binance smart account
20:59:47callExecute43 million USDC pulled from the same account
21:04:23sweep1,700 ETH + 23 tokens
21:44:11sweep370 ETH + 14 tokens
22:39:35sweep128 ETH + 122 tokens
23:36:47, 23:37:23, 23:37:47, 23:38:23, 23:54:59sweep ×5Balance below 1 ETH, nothing moved (automated polling)
23:56:47sweep2,962 ETH
  • Sweeps moved about 172,624 ETH in total. Each one left exactly 1 ETH behind.
  • callExecute exploited another privilege of Binance 14. The wallet was the executor of a separate smart account. That right passed to the attacker along with the delegation. The exposure did not stop at the wallet balance.
  • The 2,962 ETH swept at 23:56 was a deposit that arrived 1 hour 40 minutes after withdrawals were halted (22:15). Binance's deposit-consolidation pipeline kept routing funds into a wallet the attacker controlled.

5.4 Revocation — Binance never lost its signing ability

The delegation was cleared at 00:10:35 on October 30 by this transaction. It was sent by Binance 14 itself, with the authorization pointing at 0x0.

  • It is a self-sponsored authorization: the sender and the signer are the same account.
  • The transaction nonce is 18914903 and the authorization nonce is 18914904. The sender's nonce is incremented before authorizations are processed. So the authorization must use nonce + 1.
  • Binance sent 93 transactions from this wallet while it was delegated. The last one was at 00:07:11.
  • Binance revoked the delegation with its own key. That means it never lost its signing ability. This is consistent with the official statement that no private key leaked.

6. The intrusion mechanism — reasoning backward from the evidence

Binance has not disclosed the path from laptop to signature. Still, the evidence narrows the possibilities a lot. Let's start from the typical structure of an exchange hot wallet. Then let's see which paths the evidence allows and which it rules out.

6.1 The typical exchange withdrawal pipeline

  1. Withdrawal service
    creates requests
    ↓
  2. H3
    Risk / policy engine
    whitelist · limits
    ↓
  3. H1
    Signing orchestrator
    per-chain formats
    ↓
  4. H2
    Per-chain signers
    HSM / MPC
    holds keys
    ↓
  5. Broadcaster
    sends to chain
H4
Ops path — CI/CD · cluster management
can change code and config in every layer above
  • H1direct signing-API calls with service credentials
  • H2abuse of a raw-digest signing path
  • H3tampering with policy-engine settings
  • H4poisoned deployment path (CI/CD)
Fig 4. The typical exchange withdrawal pipeline and where the four hypotheses attach — the signer protects the key but signs whatever request arrives, so the attacker's target becomes some layer in front of it.

A large exchange's hot wallet is usually split into these layers.

LayerRoleIf the attacker controls it
Withdrawal serviceCreates user-withdrawal and internal-transfer requestsCan create requests. They still have to pass the policy engine
Policy engineChecks address whitelists, amount limits, velocity limits, and anomaliesEffectively decides what gets signed
Signing orchestratorConverts requests into chain-specific formats and hands them to signersReaches every chain at once
Per-chain signersHSM or MPC nodes sign with the real keysProtects the key. But signs whatever request arrives
Ops pathDeploys services via CI/CD and runs the clustersCan change code or config in any layer above

Just like the Secure Enclave in a phone wallet, a signer never exports its key. Instead, it signs the requests it receives. So the attacker's target is not the key. It is some layer in front of the signer.

6.2 Constraints the evidence imposes

Observed factBasisConstraint on the mechanism
• No evidence of key leakage
• Binance signed 93 transactions during the delegation
• Binance revoked it itself
Binance, on-chainThe attacker gained the right to request signatures, not the keys
• Wallets on 11 chains with different curves (secp256k1, ed25519) all drained within ~30 minutesTRM, EllipticNot per-chain signers breached one by one. The attacker reached a chain-agnostic upper layer
• Other chains drained via validly signed ordinary withdrawalsTRM, EllipticThe attacker used request formats the signing system normally accepts
• The EIP-7702 delegation "did not pass through normal approval controls"Richard TengThe policy engine was bypassed. Or the request was in a format it couldn't interpret
• 50 authorizations obtained ~3 minutes before submission
• chainId 1 (mainnet only)
On-chainNot signatures stolen in advance. Live signing-API access. Access may have been time-limited
• 36 hours of testing and rehearsal
• Exact authorization format used
On-chainThe attacker knew the internal signing API's spec beforehand. There was a reconnaissance period
• "Additional breach points"
• Attacker tooling with a "self-destruct mechanism"
BinanceA multi-stage intrusion, not a single click. Trace removal slows forensics

6.3 Comparing hypotheses

HypothesisDescriptionSupporting evidenceInconsistent or uncertain
H1. Direct signing-API calls with service credentialsThe compromised container's service-account token or mTLS certificate is used to call the signing orchestrator directly. Possible if the policy engine sits beside the signing path, not in front of it• Simultaneous drain on 11 chains
• The official account ("withdrawals submitted from a container")
• Live access
• Should have been blocked if the signer re-checked policy
H2. Abuse of a raw-digest signing pathThe signing API had a path that signs a raw 32-byte hash. A 7702 authorization digest was fed into it (§6.5)• "7702 didn't pass approval controls"
• Other chains used ordinary-withdrawal formats
• Whether such an API existed is undisclosed
H3. Tampering with policy-engine settingsWhitelists and limits changed so withdrawals to attacker addresses pass• Ordinary withdrawals were "validly signed"• The official wording is bypassed, not passed
• No mention of config changes
H4. Poisoned deployment path (CI/CD)Malicious code planted in a signing-related service image or config via DevOps privileges. Same family as the Safe front-end tampering in the Bybit hack• Entry point was a "DevOps" endpoint
• Self-destruct mechanism
• Additional breach points
• An image change would show up in deployment records
• No mention of one

The simplest picture that satisfies all these constraints is H1 + H2. It goes like this.

  1. Obtain cloud and cluster credentials from the DevOps endpoint.
  2. Get into a withdrawal-related service container.
  3. Use the signing-request rights that container already had.
  4. On the other chains, submit requests in ordinary withdrawal format (H1).
  5. On Ethereum, get an authorization digest signed that the policy engine cannot interpret (H2).

H4 fits the "DevOps" entry point well enough that it can't be ruled out. H3 fits the official wording least.

6.4 Initial access — TraderTraitor's known playbook

How the laptop was infected has not been disclosed. But the playbook of TraderTraitor, the group named as the likely culprit, is on the official record.

IncidentInitial accessLateral movement
CISA advisory (2022)• Recruitment-themed spear-phishing aimed at sysadmin and DevOps staff
• Trojanized crypto apps
—
DMM Bitcoin (2024)• Posed as a LinkedIn recruiter
• Lured a Ginco employee into running a malicious Python script as a GitHub "pre-employment test"
• Impersonated the employee with stolen session cookies
• Reached internal systems
• Manipulated a transaction
Bybit (2025)• A Safe developer's macOS machine infected via a Docker project (social engineering suspected)• Hijacked active AWS session tokens to bypass MFA
• Altered Safe's front-end code
• Cleared Bash history
• Removed the malware

All three follow the same arc: developer or ops endpoint → stolen session credentials → lateral movement disguised as a legitimate user. A session token has already passed MFA. So stealing one neutralizes MFA. The way the Bybit attackers wiped their traces also resembles the "self-destruct mechanism" Binance mentioned. Did Binance's laptop go down the same road? That is a question for the post-mortem.

6.5 Why one authorization signature is more dangerous than thousands of withdrawals

Signing an EIP-7702 authorization means signing a different message than a transaction.

EIP-1559 transaction signature:  keccak256(0x02 || rlp([chain_id, nonce, ..., to, value, data, ...]))
EIP-7702 authorization signature: keccak256(0x05 || rlp([chain_id, address, nonce]))

To a signer, both are just 32-byte hashes. A policy engine usually checks decoded transactions: recipient, amount, calldata. An authorization digest has no recipient and no amount. If the signing API accepts raw hashes, an authorization signature looks to the policy engine like nothing at all. That is why H2 fits the official wording ("did not pass through approval controls") so well.

And the authority each signature hands over is in a different league.

Withdrawal signatureEIP-7702 authorization signature
ScopeOne asset, one amount, onceEvery asset in the wallet and all future deposits
DurationDone once executedPersists until revoked
Side privilegesNoneEvery other contract role the wallet holds (§5.3 callExecute)
Visibility to the policy engineRecipient and amount can be checkedNo recipient or amount to check

Key insight — A withdrawal signature is a signature over an amount. A delegation signature is a signature over the account itself. If signing policy only looks at amounts, the most dangerous signature gets the least scrutiny.

7. The freeze race — 37 minutes and 200 million USDT

Receiving addressUSDT blacklistUSDC blacklistCurrent balance (frozen)
0x5227…2f8c21:01:3521:04:591,175.46 million USDT, 823 million USDC
0xa97b…8d10—10-30 04:11:35~120,000 USDC
  • From the first sweep (20:24) to Tether's freeze (21:01) took 37 minutes. About 644 million USDT got out in that window.
  • The 21:44 sweep sent 200.4 million USDT to an address that was already frozen. The USDT contract checks the blacklist only for the sender. It doesn't block the recipient. So those funds were locked the moment they arrived.
  • The attacker didn't switch receiving addresses until 22:39, an hour and 38 minutes after the freeze.

Automation failure on both sides — Binance kept sending deposits into a compromised wallet. The attacker kept sending funds to a frozen address. Both were running automation that never checked the other side's state.

Native assets like BTC, XRP, SOL, and NEAR cannot be frozen. None have been. By Elliptic's count, the attacker still holds about $3.33 billion. A freeze blocks disposal. It is not recovery.

8. Market side effects — a 38% premium and MEV

2,4002,8003,20020:3021:0021:3022:00pre-hack ≈ 2,320delegationTether freezepeak 3,328.6 · 21:09:11WETH price (USDT)

Values read from slot0 (sqrtPriceX96) block by block: 5-minute samples plus two peaks located at block resolution (20:49:23, 21:09:11).

Fig 5. Uniswap v3 WETH/USDT 0.05% pool price (UTC) — as the attacker rushed to swap USDT for ETH before the freezes, the pool price rose up to 43% above its pre-hack level. The 21:09:11 peak (3,328.6) matches, to the minute, HOW TO ONCHAIN's report of 'a 38% premium over market at 21:09.'

The attacker rushed to swap USDT for ETH before the freezes. That opened a wide gap between DEX and CEX prices. Elliptic found the attacker chose speed over price, accepting losses of 12–26% versus market.

The Uniswap v3 WETH/USDT 0.05% pool shows the story block by block. Before the hack, the price was about 2,320 USDT. It began rising at 20:36 and hit 2,917 at 20:49. The peak was 3,328.6 at 21:09:11. By 21:36 it was back to normal. That matches, to the minute, HOW TO ONCHAIN's report of "a 38% premium over market at 21:09."

According to the same analysis, most of that spread went to MEV bots. Of the $44.9 million in WETH arbitrage PnL, most went to 78 bots. ETH priority tips that night reached 10,251 ETH. That is about 2,200 times the 4.6 ETH of the same window the day before. The attacker's haste became profit for the bots that bought block space.

9. Attribution — what is and isn't established

TRM Labs points to North Korea's TraderTraitor with "high confidence." Chainalysis and Elliptic reached the same conclusion through their own analyses. The FBI, however, said only that it is "aware of the incident and engaged with partners." It has not formally attributed it.

EvidenceCounterpoint
Funds routed from Tron through THORChain and Hyperlane landed at the same address that received September 2026 Bitget hack fundsThe overlap is only about $39,000. That shows a shared laundering network, not necessarily the same hackers
The small-Tornado-top-up → rehearsal → batch pre-signed execution pattern matches BybitThe attacker sat on $2.6 billion in stablecoins until it was frozen. North Korean groups usually dispose of funds fast
A track record of targeting exchange engineers with fake job offers (DMM, Bybit)The laptop's initial infection vector is still undisclosed

10. Comparison with Bybit (2025)

Bybit (Feb 2025)Binance (Oct 2026)
Loss~$1.5 billion~$6.3–6.4 billion
Entry pointSafe{Wallet} developer PCDevOps engineer laptop + additional breach points
What was manipulatedTransaction contents approved by multisig signersHot-wallet signing infrastructure (11 chains)
Common threadNot the cryptography, but the infrastructure and people around the wallet were breachedSame

In both cases, "who signs" was not the problem. What broke was "who decides what gets signed."

11. Defensive design — treating signing infrastructure as a security boundary

AttackerDevOps endpoint compromise → signing-request path
↓
1Isolated operator endpoints
§1 initial access
2Least-privilege containers
§6.3 H1
3Policy engine in series
§5.2 delegation
4Signer decodes for itself
§6.5 H2
5Per-chain, per-tier signers
§3 11 chains
6Real-time delegation monitoring
§5.3 3h49m
Signing system and hot-wallet funds
Fig 6. Defense in depth for signing infrastructure — six layers from the outer endpoint to delegation monitoring. The tag on each layer shows which stage of this attack it would have stopped.
MitigationStage it would have stopped hereTrade-off
• Signers refuse raw hashes and decode structured requests themselves before signing§6.5 authorization-digest bypass (H2)A parser per chain and message format
• Policy checked again at the signer (policy engine placed in series, in front of the signing path)§6.3 direct calls with service credentials (H1)Latency, policy maintained twice
• Signing-request rights split per service and per chain, with short-lived credentials§6.3 one container reaching 11 chainsCredential-issuance infrastructure
• Default-deny EIP-7702 authorizations in signing policy§5.2 the delegation itselfLegitimate delegations (e.g., AA migration) need a separate approval flow
• Treat a batch request for authorizations across many nonces as an indicator of compromise§5.2 the 50-authorization batchAlmost never seen in normal ops, so cheap
• Real-time monitoring of treasury delegation state
• A pre-tested revocation runbook
§5.3 delegation lasting 3h49m → minutesMonitoring infrastructure
• Automatically halt deposit consolidation when a delegation is detected§5.3 the 23:56 sweepDeposit delays on false positives
• Separate signing infrastructure by chain and wallet tier§3 simultaneous drain on 11 chainsOperational complexity
• Separate operator endpoints from everyday work
• Separate approval for privilege escalation
§1 initial accessDeveloper productivity

Monitoring for delegation is simpler than it sounds. Just watch for an EOA that should have no code suddenly carrying a delegation designator.

// EIP-7702 delegation monitor for treasury EOAs (concept code)
const DELEGATION_PREFIX = "0xef0100"; // EIP-7702 delegation designator prefix
const POLL_INTERVAL_MS = 12_000;      // check once per Ethereum block (~12 s)
 
async function watchDelegation(eoa: `0x${string}`, alert: (target: string) => void) {
  for (;;) {
    const code = await client.getCode({ address: eoa });
    if (code?.startsWith(DELEGATION_PREFIX)) {
      alert(`0x${code.slice(DELEGATION_PREFIX.length)}`); // delegation target address
    }
    await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
  }
}

In production, there is a faster way than polling. Recover the signers of authorizationList entries in each new block's type-4 transactions and match them against your addresses. That flags an authorization the moment it lands in a block.

Practical recommendation — "Who can request a signature" matters more than "where the key lives." The signing policy engine is as important a security boundary as the key-custody hardware. Signatures that change the nature of the account, like EIP-7702, belong in a different tier from ordinary withdrawals.

12. What's established and what remains

What's established is clear. The attacker went through a DevOps engineer's laptop into an internal service container. From there, they submitted unauthorized withdrawals. Binance did not lose its private keys. On Ethereum, EIP-7702 authorizations spanning 50 nonces delegated Binance 14 to a sweeper. Binance revoked the delegation with its own key 3 hours and 49 minutes later.

The open questions are just as clear. How was the laptop infected? What were the additional breach points? Through what path did the signing requests bypass the policy engine? Was the signing system an HSM or MPC? Is the culprit really TraderTraitor? Binance's post-mortem needs to answer these. Above all, it should show which hypothesis in §6 was right.

13. Conclusion

Binance didn't lose its keys. It lost the authority to decide what gets signed.

  • The keys didn't leak, but the funds were stolen. The signing-delegation paradox happened at exchange scale.
  • The security boundary must extend from the key to every signing-request path. The whole chain — laptop → container → signing system — belongs in the threat model.
  • A withdrawal signature is a signature over an amount; a delegation signature is a signature over the account. If signing policy only looks at amounts, the most dangerous signature gets the least scrutiny.
  • Response speed sets the size of the loss. Tether took 37 minutes to freeze. Revocation took 3 hours 49 minutes. Deposits kept flowing in after withdrawals were halted.

So was EIP-7702 the cause? The other 10 chains were drained without it. On Ethereum, though, a single delegation signature handed over the entire wallet. That included every deposit still to come. That is why the same intrusion grew into a 3-hour-49-minute account takeover.

In the end, the question isn't "is EIP-7702 dangerous?" It is "does our signing system know how much a signature weighs?" A signature that moves an amount and one that hands over an account look like the same 32-byte hash. But they can never sit in the same tier. Security extends to knowing what you're signing.

Appendix — Verifying it hands-on

Every on-chain claim in this piece can be reproduced with public RPC alone. All you need is one Ethereum node that serves archive queries.

  • When the delegation was set and cleared — Call eth_getCode on Binance 14 across block numbers. A binary search finds two blocks: block 26300753, where the code became 0xef010063e8…, and block 26301896, where it returned to 0x.
  • The 50 authorizations and their order — Read the nonces from the delegation transaction's authorizationList. They descend from 18914824 to 18914775.
  • Every attacker transaction — Recursively locate only the blocks where the attacker EOA's eth_getTransactionCount changes. You can rebuild nonces 0–22 without an indexer.
  • Freeze times — eth_call USDT's getBlackListStatus(address) and USDC's isBlacklisted(address) across blocks. That reveals the blacklisting block.
  • The Uniswap peak — Read sqrtPriceX96 from the pool's slot0() and convert it to a price. You'll see 3,328.6 at 21:09:11.

Sources

Section numbers in parentheses show where each source is used.

Official statements

On-chain analysis reports

Coverage

TraderTraitor's past playbook

Standards

On-chain evidence (queried directly)

Related post


Comments