Blog / Threat Analysis

Binance Stopped Withdrawals. The Theft Wasn’t Using Them.

USD 6.34 billion, a fake job interview, a stolen deployment token and an EIP-7702 delegation. Binance’s initial report on the 29 October 2026 incident, classified step by step with TLCTC v2.7.

BK
Bernhard Kreinz
• • ~11 min read • TLCTC v2.7

At 20:05 UTC on 29 October 2026, five Binance hot wallets began sending XRP to an address the attacker controlled. By the time the last transfer finalised, just before midnight, about USD 6.34 billion in digital assets had moved. Binance suspended withdrawals within that window. The theft carried on, because by then it no longer ran through withdrawals.

On 3 November Binance published an initial report.[1] It is unusually candid for a first statement: a timeline, the entry points, the file operations the malware performed, and an honest account of why containment took hours. It also uses labels — “supply chain attack”, “0-day malware”, “compromised internal AI tooling” — that describe the attack in the vocabulary of its outcome or its novelty, not its cause. This post reads the report through TLCTC v2.7: which generic vulnerability made each step succeed, where the business events begin, and where the one containment action that mattered could still have acted.

Everything below rests on Binance’s own report. The investigation is ongoing and Binance holds some technical details back, so two steps carry low confidence and four questions stay open, and I say which.

What Binance reported

Binance describes a campaign that began months before the theft. The FBI attributes it to the Democratic People’s Republic of Korea.[1]

When What happened
June 2026 Engineer A (Wallet DevOps) searches for a popular AI coding tool and downloads a tampered Homebrew installation. Security detects it, replaces the device and rotates the credentials. The attacker has learned A’s role and who works with A on wallet infrastructure.
September Software Engineer B is approached on a legitimate job platform by a fake “Project Director”. A video interview with a fake HR representative, then a second interview in a chat app with a fake CEO. B is asked to download an “assignment” repository onto his work computer. Code in the setup process runs, replaces the legitimate pyenv with a malicious one, opens a channel to an external server and removes its traces. Endpoint protection does not detect it.
20 October From B’s computer, the attacker uses an internal AI tool to gain control over the computers of Engineer A and Wallet Software Engineer C. A’s computer holds a container-deployment token.
29 Oct, 17:15–19:56 On C’s computer the attacker uses A’s token, deploys a container and triggers a malicious script.
20:05–20:09 Through an internal wallet signing service, outside the normal withdrawal process: 233.46 million XRP from five hot wallets. Then about 970,500 SOL and 44.2 million OP. An internal alert fires on the volumes. Then 18,270 BTC.
Afterwards Fifty signing transactions adjust a hot wallet’s nonce and set up EIP-7702 delegations to an attacker-controlled contract. Binance suspends withdrawals and works with partners to freeze tokens.
23:56 The last unauthorised transfer, 2,961.9 ETH, finalises. It had been broadcast earlier and was pending.
30 Oct, 00:10 Binance clears the delegation on the Binance14 hot wallet by authorising the zero address.

As of the report, about USD 2.85 billion had been frozen or intercepted, Binance said it would absorb the loss rather than pass it to users, and 98% of the affected token assets had been replenished by 31 October.[1]

Two paths, not one

The June episode and the September–October campaign are best recorded as two attack paths. The June compromise was detected and contained: the device was replaced and the credentials rotated. What survived it was information, A’s role and team, and that information later decided whose computers mattered. A Data Risk Event links the two paths, not a step.

Binance also reports 57 suspected DPRK-linked cases that its security team detected and prevented during 2026. They belong in neither path. A cluster assignment asserts that the step succeeded; a blocked attempt is evidence about controls, not a step.

#9 ||[human][@Attacker⇒@SearchEngine→@Binance]|| → #7 + [DRE: C]      // Path A, June 2026

Binance calls this step a supply chain attack. Under TLCTC it is not, at least not on what the report says. Since v2.6, a #10 step requires that the trust artifact, or the third party issuing it, was subverted before the target accepted it (R-SUPPLY).[3] A “tampered Homebrew installation” found through a search engine is a counterfeit from an impostor source, not Homebrew’s own distribution delivering something bad. The engineer was deceived about where the file came from: #9. Running the installer executes foreign code: #7. If forensics later show that Homebrew’s official channel served the tampered file, the step becomes #10, and the record changes with the evidence.

The path to the signing service

The theft itself is a twelve-step path, two of whose steps run in parallel. Written out with the intervals the report supports:

#9 ||[human][@Attacker⇒@JobPlatform⇒@ChatApp→@Binance]||
 →[Δt=?]          #7
 →[Δt=?]          #7
 →[Δt=~weeks]     #1 [conf=low]
 →[Δt=?]          (#7 + #7) + [DRE: C]
 →[Δt~9d]         #4
 →[Δt<2h41m]      #1
 →                #7
 →[Δt=9m..2h50m]  #1 [conf=low] + [DRE: If]
 →[Δt=?]          #1 + [DRE: If]
 →[Δt<3h47m]      #1 + [DRE: If]
Step What happened Why this cluster
#9 Fake recruiter, two staged interviews, “download the assignment” The human is the exploited vulnerability. The job platform and chat app only carried the lure: transit (⇒), not a party to the attack.
#7 Setup code in the repository runs on B’s work computer and plants a malicious pyenv Foreign executable content executes, so R-EXEC requires #7 at that moment.
#7 The planted pyenv runs: it executes commands and opens a channel to the attacker’s server Each distinct execution of foreign code is its own #7 step: first the dropper, then the second stage it planted. Removing traces is something the payload does, not a further step.
#1 [conf=low] The internal AI tool is used from B’s computer The report says only that an internal AI tool was used to gain control. If the tool is an agent acting on what it is told, acting on instructions is its designed function: #1. If it has an authorisation flaw (Binance “rebuilt … access controls”), the step is #2; if B’s credentials were presented to it, #4. #1 is the most defensible reading of the evidence, so the step is marked low-confidence rather than left unresolved.
(#7 + #7) + [DRE: C] Control gained over A’s and C’s computers; A’s deployment token found Gaining control of a computer implies that commands the attacker controlled ran on it: on the #1 reading, this is #1 → #7, the agentic pattern. Two hosts, no meaningful order. The token’s exposure is the [DRE: C] of the step that obtained it (Axiom X).
#4 A’s token used from C’s computer Using a credential is always #4 (R-CRED), however it was obtained.
#1 Container deployed The deployment function, used as built. Not Abuse of Rights: a stolen credential never confers a grant (R-SCOPE), so this is #4 → #1.
#7 “Triggered a malicious script” Foreign code now runs inside wallet infrastructure.
#1 [conf=low] + [DRE: If] The signing service signs XRP, SOL, OP and BTC transfers outside the withdrawal process The service signed what a caller its policy did not cover asked it to sign; Binance itself names “signing policy coverage”. If the container presented a service credential to the signing service, the step is #4.
#1 + [DRE: If] Fifty signing transactions set up EIP-7702 delegations EIP-7702 lets an account delegate execution to a contract by a signed authorisation.[2] That is a protocol function, used as designed.
#1 + [DRE: If] The delegated contract moves assets until 23:56 Contract execution on-chain is #1, not #7, as in the Bybit record.[5] See below.

Why If, not C. Every unauthorised transfer is a correct transaction. The amounts, addresses and signatures are all valid, and the ledger records exactly what happened. What fails is provenance: each transaction carries Binance’s authority, and Binance’s authorised process never issued it. That is the misattributed state of the v2.7 DRE tree — the record claims an origin it does not have, while its content is accurate.[3] It is not Ii as well: the balances that remain are exactly what the ledger says they are. Calling them “wrong” because the transfers were unauthorised would split the code by how the state came about, which the DRE stopping rule forbids. The controls the dictionary names for it are the right ones here too: segregation of duties, provenance logging, behavioural monitoring.

If the shape looks familiar, it should. Bybit, February 2025: a developer approached with a trojanized project, malware on the workstation, stolen development credentials, abuse of a deployment function, and a contract that redirected the funds.[5] The specific techniques differ. The causes, step by step, are the same, which is why the same controls apply.

Three labels that do not survive classification

Binance writes that this “was not a single isolated breach or a simple phishing incident.” That is true. It does not follow that it needs new categories. Three of the report’s labels dissolve once each step is asked what it exploited.

“Supply chain attack.” A counterfeit installer from a search result is #9 → #7. #10 requires the supplier or its artifact to be subverted before acceptance.

“0-day malware.” The report means malware no signature knew. It describes no exploit of a software flaw, so there is no #2 or #3 step. “Undetected” is a statement about the defender’s tooling, not about the cause: the cause is foreign code that was allowed to run, #7.

“Compromised internal AI tooling.” The report does not say how the tool was misused. On the most likely reading — an agent that does what it is told, followed by commands that run on a colleague’s machine — it is #1 → #7; on the others, #2 or #4 before the #7. None of them is new. AI changes the speed and the reach. It does not add an eleventh cluster.

Counted over both paths, the incident is fourteen steps: two #9, six #7, one #4, five #1. A sophisticated campaign, built from four generic vulnerabilities that every organisation already has to control.

Where the business events begin

Clusters stop at the data. What happens to the business is recorded on the consequence side, as Business Risk Events, each reached from a DRE or from an earlier BRE.[3] Placed with the TLCTC+ catalogue codes, at the step whose DRE triggers them, and only where the report gives evidence:[4]

… → #1 [conf=low] + [DRE: If]
       + [BRE: BRE-FIN.23 → BRE-ORG.14 → (BRE-SVC.11 + BRE-ORG.16 + BRE-REP.13)]
  → #1 + [DRE: If] + [BRE: BRE-ENT.17]
  → #1 + [DRE: If] + [BRE: BRE-FIN.23]
       + [Impact: IMPACT-FIN.12 Direct Fraud Loss = USD 6.34bn gross]
BRE Reached from Evidence
BRE-FIN.23 Unauthorized Crypto Transfer Executed [DRE: If] of the signing step; causal, Δt = on-chain finality (seconds) XRP, SOL, OP and BTC leave the hot wallets from 20:05. This is BRE₁, an event in the custody process.
BRE-ORG.14 Internal Investigation Opened BRE-FIN.23; causal “Received an internal alert regarding large-volume transfers and immediately began investigating.”
BRE-SVC.11 Payment Function Unavailable BRE-ORG.14; causal Customer withdrawals suspended.
BRE-ORG.16 Control Remediation Program Opened BRE-ORG.14; causal Systems rebuilt, devices replaced, independent review, research fund.
BRE-REP.13 Executive Public Statement Issued BRE-ORG.14; causal The 3 November report.
BRE-ENT.17 Authorization Granted Under False Identity [DRE: If] of the delegation step; causal Execution rights over a Binance hot wallet granted in Binance’s name, not by Binance.
BRE-FIN.23 (further instances) BRE-ENT.17; causal, Δt < 3h47m Transfers continue through the delegation after withdrawals are suspended, until 23:56.

Two steps carry the same DRE and lead to different business events. The signing step moves money directly: BRE-FIN.23. The delegation step moves no money at all. It grants authority, in Binance’s name, to someone else: BRE-ENT.17. That second event is the one Binance’s containment could not reach.

The edge containment had to cut

A consequence chain breaks only at a causal edge, and each causal edge has an interval, Δt, that bounds the window for detection and response.[3] Read the Binance chain edge by edge and the windows are very uneven.

From [DRE: If] to BRE-FIN.23, the window is on-chain finality: seconds. Once the signing service has signed, nothing on the response side can stop the transfer. That edge can only be prevented, not detected. The real detection windows were earlier: about nine days between gaining control of A’s and C’s machines and the use of A’s token, and between nine minutes and 2h50m between the malicious script and the first transfer.

From BRE-ENT.17 to the later BRE-FIN.23, the window was hours. This is the edge where response could still have acted, and Binance’s report explains why it largely did not. Suspending withdrawals stops the withdrawal process. The delegation did not run through the withdrawal process; it lived on-chain, in the hot wallet’s own account code, which is where EIP-7702 places a delegation.[2] Removing it required a transaction signed by the wallet’s key, and the wallet was an MPC wallet: there was no single key to sign with quickly. Binance built and ran a special procedure. It cleared the delegation at 00:10, fourteen minutes after the last transfer had finalised.

Contain where the authority lives

The response stopped a process. The attacker’s authority had already left the process. When an attack step creates authority outside the infrastructure you control — an on-chain delegation, an OAuth grant, a federated trust, a scheduled job in someone else’s cloud — switching that infrastructure off does not revoke it. The revocation has to be designed, tested and fast before the incident, for every place authority can be granted.

Expected, but not yet in the record

A record should hold only what the evidence shows. Some business events will follow almost certainly, but the report does not mention them, so they stay out of the path and are listed here as expected:

Expected BRE Edge Why it is expected
BRE-REG.11 Mandatory Notification Obligation Triggered normative, no Δt A duty to notify arises in each jurisdiction where Binance is licensed or registered. The report names no regulator and no filing.
BRE-LGL.16 Evidence Preservation Obligation normative, no Δt Arises once the incident is known and law enforcement is involved. The report does not mention it.
BRE-REG.12 Supervisory Inquiry Opened causal Likely at this scale. Not reported yet.
BRE-LGL.15 Criminal Complaint Filed causal Binance “worked with law enforcement”. Cooperation is not the same as a filed complaint.
BRE-REP.12 Media Escalation Occurred causal Certain in practice, but outside the source this post relies on.
BRE-CUS.12 Customer Complaint Received causal Likely to follow the withdrawal suspension (BRE-SVC.11). Not reported.
BRE-CUS.17 Market Confidence Event causal Possible. The report gives no evidence either way.

One event that might be expected is not on the list. Binance says users will bear no loss, and topping up its own reserves is not compensation paid to customers, so there is no BRE-CUS.14.

Reputation is not on the list either, because it is not a single event. It works as an amplifier: one incident dents trust and visible repair restores it; repeated incidents make the loss of trust final, and only then do customers leave. For Binance this is the second hot-wallet theft, after 7,000 BTC in May 2019.[6] Replenishing 98% of the assets within two days and pointing to the Proof of Reserves page is exactly that visible repair. Whether it holds depends on whether there is a third.

One lever per step

The use of classifying each step is that each cluster has its own control lever and its own owner. Binance’s remediation list — rebuilt systems, replaced devices, revoked tokens, AI-based anomaly detection — is mostly response and detection. The prevention levers sit at the steps:

Step Lever Typical owner Examples
#9 The recruitment lure as a known pattern Security awareness, HR Engineers in privileged teams briefed on the fake-interview pattern by name; a standing rule that no third-party “assignment” ever touches a work device.
#7 (B, A, C, container) What may execute IT: endpoint and platform Untrusted repositories built only in disposable sandboxes; integrity monitoring on developer toolchains (a replaced pyenv in the Homebrew Cellar is a detectable file change); execution allowlisting on wallet-team endpoints.
#1 (AI tool) What the agent may do, for whom IT: the tool’s owner An agent acts only for the user who drives it; commands on another person’s machine need that person’s approval.
#4 Credential use IT: identity and access No standing deployment tokens on laptops: short-lived, bound to the device they were issued to, and phishing-resistant.
#1 (deploy) What deployment may reach IT: platform engineering Two-person approval for deployments into namespaces that can reach the signing service.
#1 (signing, delegation) What the signing service will sign Business: custody and treasury operations Policy on every request, not on the withdrawal path only: proof that the request came from the withdrawal process, destination allowlists, volume limits, and a hard refusal of EIP-7702 authorisations for hot wallets.
BRE-ENT.17 → BRE-FIN.23 Response on the last open edge Business: custody and treasury, with incident response A tested, fast revocation procedure for every kind of authority a wallet can grant, including delegations from MPC wallets.

The signing-service row carries the most weight. Every path to the signing service needs the service’s cooperation in the end. A signing policy that covers every request, not only the requests that arrive through the expected door, closes the incident at the step where the money would have moved, whatever happened upstream.

The decisive #1 belongs to the business

Look at the owner column again. Every lever up to the deployment belongs to IT. The last three steps of the path — signing, delegating, draining — are #1 in a functional domain: the function abused is not a server or an operating system but a business function, the release of customer assets. Who may sign what, to which destination, in what volume and through which process is a custody and treasury decision. Its control regime — signing policy, limits, four-eyes release, reconciliation — is typically owned by the business, not by IT.

The detection rules for that domain are of a different kind as well. They are not malware signatures or login anomalies; they are financial and transactional rules:

  • Provenance reconciliation: every signed transaction matched against a withdrawal ticket from the authorised process. A signature without a ticket is the [DRE: If] itself, caught the moment it occurs.
  • Volume and velocity limits per hot wallet, per asset and per destination, with a hard stop rather than an alert.
  • Destination rules: first-time destinations, destinations outside the allowlist.
  • Authority-change monitoring: any EIP-7702 authorisation, approval or delegation touching a house wallet treated as a critical event, because it changes who can move funds, not just how much moves.

These controls are not in the standard toolkit of a CISO. EDR, SIEM use cases and identity analytics cover #7 and #4; they do not know what a normal withdrawal pattern looks like. Binance’s own account shows this. The one detection that fired on 29 October was a transactional one — “an internal alert regarding large-volume transfers” — and it fired only after the XRP, SOL and OP transfers. Endpoint protection had missed the malware in September; nothing reported a signature without a withdrawal behind it.

Name the owner of the functional #1

Wherever a path ends in a business function — payment release, custody, payroll changes, trading limits — the last #1 step is controlled by the business and detected by transactional monitoring. A risk register that puts “cyber” entirely under the CISO leaves exactly that step without an owner. Fraud and transaction monitoring, treasury limits and reconciliation are cyber controls here, and they decide whether a compromise upstream becomes a loss.

What is still open

Four points depend on details Binance has not published yet, and the record should change as they arrive:

  • The AI tool step. Designed function (#1), an authorisation flaw (#2), or B’s credentials presented to it (#4)?
  • The signing service. Did it sign for anything that could reach it (#1), or did the container present a credential (#4)?
  • “Logged onto C’s computer.” If that involved C’s own credentials, a further #4 belongs before the use of A’s token.
  • Homebrew. A counterfeit installer (#9) or the official channel subverted (#10)?

One point is not open, although it can look that way. Under EIP-7702 the attacker’s contract code runs as the Binance account, and a Turing-complete virtual machine invites the reading “foreign code executes, so #7”. It is still #1. The EVM is not one of the general-purpose execution engines that define foreign executable content;[3] it is the designed transaction function of the ledger, and the delegation used it exactly as designed. That is how the Bybit record classifies contract execution too.[5]

Contain where the authority lives

Binance did the hard part of a report well: it said what happened and why containment took time. Read with a cause-oriented taxonomy, the incident needs no new vocabulary. It is a fake interview, foreign code allowed to run, a token that should not have been on a laptop, and a signing service that signed for a caller nobody intended. The novel part is the last edge. Withdrawals stopped. The authority to move funds had already left the withdrawal process.

Stopping a process does not revoke authority that the attacker has already moved outside it.

Sources

  1. [1] Binance, “29 October Binance Security Incident: Initial Findings and Response Update”, post on X (@binance), 3 November 2026. All facts, times and figures in this post are taken from it; the attribution to the DPRK is the FBI’s, as cited there.
  2. [2] EIP-7702: Set Code for EOAs, Ethereum Improvement Proposals.
  3. [3] TLCTC v2.7 core paper: §3.4 (consequence chain, causal and normative edges), §4 (cluster definitions), §6 (R-EXEC, R-CRED, R-SCOPE, R-SUPPLY), §7.6 (DRE refinement tree). The classifications in this post are my application of TLCTC to Binance’s statements, not classifications made by Binance.
  4. [4] TLCTC+ v0.9: BRE catalogue v0.3 and BRE notation (§8.5). See also The Cyber Bow-Tie.
  5. [5] TLCTC attack-path record PRESSURE-CHOLLIMA-BYBIT-2025 (Safe{Wallet} / Bybit, February 2025), from the CrowdStrike 2026 Global Threat Report.
  6. [6] Binance, “Binance Security Breach Update”, 7 May 2019: 7,000 BTC withdrawn from the BTC hot wallet in one transaction.

TLCTC Framework · v2.7 · CC BY 4.0