dogesec Logo
TraderTraitor's Binance Playbook as STIX: Three Reports, One Graph

TraderTraitor's Binance Playbook as STIX: Three Reports, One Graph

Binance, ReversingLabs and Vectra AI each saw part of the $6.34bn theft. Join their reports into one STIX graph you can hunt with, caveats included.

Category: Case studies Category: Research

tl;dr

  • About $6.34 billion was taken from Binance’s hot wallets in under four hours, and about $2.85 billion has since been frozen.
  • About five months passed between a tampered Homebrew (a macOS package manager) download and the theft.
  • The only host artefacts Binance published are the file operations behind one swapped pyenv executable, which grew by 70 bytes.

Three reports, three different views

On the evening of 29 October 2026 (UTC), attackers emptied Binance’s hot wallets, the online wallets it uses to process withdrawals. Two days later the FBI, the US Secret Service and IRS Criminal Investigation attributed the theft to North Korea’s TraderTraitor. Their alert is a list of wallet addresses to block. It contains no technical detail about how the attackers got in.

The technical story arrived over the following week, in three reports that each saw something different:

Source What it saw What it lacks
Binance’s initial findings (3 Nov) The victim’s timeline, the people targeted, the only published host artefact (a swapped pyenv file; pyenv is a Python version manager), and the abuse of EIP-7702, an Ethereum feature explained below Hashes, domains, malware names
ReversingLabs (4 Nov) An ATT&CK mapping of Binance’s steps, and a separate 2026 TraderTraitor toolset, also documented by Zscaler and SentinelOne and referred to below as the Terraform toolset: a trojanised Terraform provider (a plugin for HashiCorp’s infrastructure-as-code tool) that installs the FLATROOF and ROOFDECK backdoors, with hashes, infrastructure and detection rules Proof that the toolset was used against Binance, which ReversingLabs says it cannot establish
Vectra AI (4 Nov) The identity path: how the attacker moved across team boundaries, and why no single log showed the chain ATT&CK IDs and IoCs

An analyst reading all three can hold the full picture in their head. A detection pipeline, a threat intelligence platform or an AI agent cannot. They need the three accounts as data, joined where they overlap and kept apart where the evidence doesn’t connect them.

STIX 2.1 can do that: one graph that joins the three reports, puts Binance’s account in sequence, separates confirmed indicators from related ones, and records how sure each source is. If you are new to STIX, Understanding STIX 2.1 Objects explains the object types used below.

What Stixify extracted from each report

The first step is to turn each report into STIX, so I uploaded all three to Stixify. Here is what Stixify extracted:

  • Binance’s report produced a threat actor (the Democratic People’s Republic of Korea), the FBI and Binance as identities, pyenv as a tool, and a generic “Social engineering” attack pattern.
  • ReversingLabs’ report produced the most: file hashes for the Terraform toolset, an IP address, and ATT&CK techniques from its mapping of Binance’s steps and of the toolset.
  • Vectra’s report produced two techniques, Supply Chain Compromise (T1195) and Valid Accounts (T1078). Vectra gives no ATT&CK IDs; Stixify extracted both from its description of the tampered download and the attacker’s valid credentials.

Nothing is shared, even where the reports reach for similar techniques. ReversingLabs maps the Terraform toolset to Compromise Software Dependencies and Development Tools (T1195.001). From Vectra’s account of the June tampered Homebrew download, Stixify extracted the parent technique, Supply Chain Compromise (T1195). Techniques from the same family land on different objects, for different events. No report produced TraderTraitor as an object. ReversingLabs builds on Binance’s findings throughout and Vectra links to them, but those cross-references exist only as prose and links, not as STIX relationships.

Joining the three reports: intrusion set, campaign and malware

None of the three graphs contains the thing they all describe, a campaign by TraderTraitor, so the join starts there:

  • a campaign, “Binance hot wallet theft, October 2026”, which each of the three reports references and which targets the Binance identity
  • an intrusion set, TraderTraitor, with the aliases ReversingLabs lists for it (UNC4899, Jade Sleet, Slow Pisces, Pressure Chollima). The name comes from CISA advisory AA22-108A, published in April 2022, which used it for the group’s trojanised cryptocurrency apps.
  • attributed-to relationships from the campaign to TraderTraitor, and from TraderTraitor to the North Korea (DPRK) threat actor from Binance’s report
  • malware objects for FLATROOF and ROOFDECK, from the ReversingLabs report
  • the campaign’s uses relationships to pyenv and to techniques from each report: Social engineering (Binance); from ReversingLabs’ mapping of Binance’s steps, not its Terraform analysis, Spearphishing via Service (T1566.003), Steal Application Access Token (T1528) and Deploy Container (T1610); and Supply Chain Compromise (T1195) and Valid Accounts (T1078), as extracted from Vectra

Every report reaches every other report in two hops, through the campaign. A query for “everything known about TraderTraitor’s Binance campaign” returns what all three reports contain, together.

Keeping the caveat in the data

Linking FLATROOF and ROOFDECK straight to the Binance campaign would make the graph look complete, and would state something no source says.

ReversingLabs is explicit that no source ties the Terraform toolset to Binance, and that it can’t tell whether the pyenv implant shares code or infrastructure with it. Zscaler, as ReversingLabs reports, links the toolset to TraderTraitor at medium confidence. ROOFDECK is linked to FLATROOF, which installs it, through a drops relationship. FLATROOF is linked to TraderTraitor (the intrusion set), not to the Binance campaign, and that relationship carries Zscaler’s medium confidence as 50. The campaign’s attribution to TraderTraitor, and TraderTraitor’s to North Korea, get 85, because US law enforcement and the blockchain analytics firm TRM Labs (at high confidence, as ReversingLabs summarises) both state it.

Confidence says how sure you are of a link but not why a link is missing, so a note on the campaign and both malware objects records that ReversingLabs can’t tie the toolset to Binance, and that the missing relationship is deliberate.

The close-up below shows the campaign, TraderTraitor, the malware and the note.

A downstream tool that filters on confidence, or an agent that reads notes before answering, now gets the same caution the original authors wrote into their prose. If someone later confirms the link, you add one relationship and retire the note, without rewriting anything else.

The incident as an Attack Flow

The joined graph says what TraderTraitor used against Binance, but not in what order. An Attack Flow, a STIX extension, links ATT&CK techniques into that sequence, and this one is linked to the campaign. If you are new to Attack Flows, How to Build Dynamic Attack Flows with STIX explains how the objects fit together.

This flow contains only the steps Binance describes, in the order Binance gives them. For the same reason as the note above, it leaves out the Terraform toolset.

Binance refers to the staff involved as Engineers A, B and C. The flow has 13 actions, grouped here by date:

  • June: a tampered Homebrew download on Engineer A’s machine (T1195, Supply Chain Compromise, as Stixify extracted it from Vectra; ReversingLabs suggests Drive-by Compromise (T1189) as “likely”). Binance caught it and rotated credentials, but the attacker had already mapped the wallet team (T1591.004, Identify Roles).
  • September: fake Project Director, HR and CEO personas (T1585, Establish Accounts) approach Engineer B through a legitimate job platform and a chat app (T1566.003, Spearphishing via Service). An “assignment” repository runs during setup (T1204.002, Malicious File), replaces pyenv with a malicious build (T1554, Compromise Host Software Binary; ReversingLabs also gives Hijack Execution Flow, T1574), then contacts an attacker server (T1071, Application Layer Protocol). The implant also removes its traces, which ReversingLabs maps to File Deletion (T1070.004); the flow records that in the step’s description rather than as a separate action.
  • 20 October: from Engineer B’s machine, an internal AI tool is used to take control of Engineer A’s and Engineer C’s machines (no technique, see below). A token with container deployment permissions is taken from Engineer A’s machine (T1528, Steal Application Access Token).
  • 29 October, from 17:15 UTC: a container is deployed from Engineer C’s machine with Engineer A’s credentials and reaches the wallet signing service (T1610, Deploy Container).
  • From 20:05 UTC: the signing service sends XRP, SOL, OP and BTC from the hot wallets to attacker addresses (T1657, Financial Theft).
  • The attacker then uses the signing service to abuse EIP-7702, an Ethereum feature that lets a wallet hand execution rights to a smart contract (no technique, see below). Funds keep leaving after Binance pauses withdrawals, until the last transfer at 23:56 UTC (T1657).

Two steps ATT&CK can’t name

The internal AI tool. Remote Services (T1021) and Software Deployment Tools (T1072) are the nearest techniques, and ReversingLabs marks both as only “likely”. Binance hasn’t disclosed which tool it was or how it gave the attacker control, so neither can be confirmed. Vectra makes the defensive point directly: internal AI tools are trust boundaries and should be monitored as such.

EIP-7702 delegation abuse. The attacker used the signing service to sign 50 transactions that gave an attacker-controlled smart contract partial control of a Binance hot wallet. Those permissions lived on the blockchain, so pausing withdrawals on Binance’s side didn’t stop them. ReversingLabs suggests Transmitted Data Manipulation (T1565.002) while saying the step doesn’t map cleanly; that technique covers tampering with data in transit, not on-chain delegation.

An Attack Flow action doesn’t need a technique_id. The detail a technique ID can’t carry goes in a procedure object instead: what the attacker was trying to achieve, the environment it worked in, and what had to be true for it to work. If you are new to procedure objects, TTPs Are Missing the P: Let’s Fix That explains why dogesec models procedures and how the object is structured.

Each of the two steps has a procedure, linked to its Attack Flow action:

The EIP-7702 procedure records the objective (keep control of hot wallet funds after withdrawals are paused), the context (an Ethereum hot wallet signed through an MPC signing service, where several parties jointly produce each signature, so no single key can quickly revoke a delegation) and the preconditions, which are where the defensive value is. One of them, access to the signing service outside the normal withdrawal flow, is something a defender can actually remove, whatever the next variant of this attack looks like on-chain.

IoCs you can hunt with

The pyenv swap is the only indicator confirmed on Binance’s machines, so it alone points to the campaign, at confidence 100. The other 17 come from ReversingLabs’ Terraform analysis. They point to FLATROOF or ROOFDECK at confidence 50, and each description says it is not a confirmed Binance IoC.

The Binance artefact is a file event, not a hash. Binance published the file operations, not the file itself: a pyenv_ staging file is created in /opt/homebrew/Cellar/pyenv/2.8.0/libexec, the legitimate 3,344-byte pyenv is deleted, and the 3,414-byte replacement is renamed into place.

That path is Homebrew on Apple Silicon with pyenv 2.8.0. Intel Macs install under /usr/local/Cellar, and other pyenv versions use a different directory, so adjust the path to your fleet. A broader hunt is any libexec/pyenv whose size doesn’t match the legitimate file for that pyenv version (3,344 bytes for 2.8.0).

The toolset indicators cover delivery, payload hosting and C2. The file hashes are the SHA-256 values from ReversingLabs’ IoC table, and the full list, with each indicator’s STIX ID, is in the reference section at the end. Several of those hosts and URLs sit on shared services: dynamic DNS providers, Vercel, GitHub and Pastebin. Block the full hostname or URL. Blocking serveftp.com or vercel.app takes out every legitimate customer of those services along with the attacker.

The trojanised provider reaches victims through Terraform lock files (.terraform.lock.hcl) that point at a lookalike registry. That suggests a hunt that doesn’t depend on any IoC: look for lock files that reference a registry other than registry.terraform.io (or registry.opentofu.org, if you use OpenTofu, the open-source Terraform fork). Teams that run a private registry or Terraform Cloud will see legitimate hits too, so allow-list those first.

Writing a Sigma rule for the pyenv swap

A Sigma rule is a YAML file that describes suspicious activity in a log, which detection tools then convert into queries for a specific SIEM. If you are new to Sigma, Writing Effective Sigma Detection Rules: A Guide for Novice Detection Engineers explains each field.

Every indicator above can change overnight: a new domain, a rebuilt binary, a new hash. The behaviour in the pyenv step is harder to change, which makes it a good first rule to write. The rule below is adapted from one in the ReversingLabs report, which also has a rule for the Terraform provider if you want rules to deploy rather than to learn from.

Binance’s account gives one reliable signal: a file called pyenv_ appears in pyenv’s libexec directory just before the real pyenv is swapped out. The ReversingLabs original already covers both Apple Silicon (/opt/homebrew) and Intel (/usr/local) Homebrew paths. This version matches /Cellar/pyenv/ under any install prefix, drops the original’s exclusion for the brew process, and keeps only the T1554 tag, so it maps to the one flow step it detects:

title: pyenv Staging File Created in a Homebrew Install
id: 7b6dc95f-61f9-5486-9e72-cd7561a12a79
status: experimental
description: Detects a pyenv_ staging file being created in the libexec directory of a Homebrew pyenv install. In the September 2026 compromise that preceded the Binance theft, this file was created before the legitimate pyenv was deleted and replaced with a malicious build. Adapted from the ReversingLabs rule, generalised to any Homebrew install prefix and without its exclusion for brew itself.
references:
    - https://x.com/binance/status/2117626126214504729
    - https://www.reversinglabs.com/blog/binance-heist-what-we-know-and-what-rl-sees-in-tradertraitors-toolkit
author: dogesec
date: 2026-11-05
tags:
    - attack.persistence
    - attack.t1554
logsource:
    product: macos
    category: file_event
detection:
    selection:
        TargetFilename|contains: '/Cellar/pyenv/'
        TargetFilename|endswith: '/libexec/pyenv_'
    condition: selection
falsepositives:
    - Manual patching of pyenv by a developer (rare)
level: high

The logsource says which telemetry the rule needs (file creation events from macOS endpoints), and the tags map it to the same ATT&CK technique as the flow step, T1554. Converted with the pySigma Splunk backend, the rule becomes:

TargetFilename="*/Cellar/pyenv/*" TargetFilename="*/libexec/pyenv_"

To convert it for your own SIEM, An Introduction to pySigma: Converting Sigma Rules to Work with Your SIEM walks through the process and how to check the result.

As a STIX indicator with pattern_type: sigma, linked to the pyenv action with a detects relationship, the rule sits on the same graph as the attack:

With rules linked to actions, the flow shows which steps you can detect and which you can’t. Here only the pyenv step has a rule, which makes the gaps visible: nothing yet covers the AI tool pivot, the stolen token or the signing service. If you want to take this further, Using Sigma Rules in Attack Flows for Detection Coverage and SOC Triage shows how to use those links to track detection coverage across a flow.

The whole theft in one graph

Put together, the graphs are one model of the theft: the three reports joined through the campaign, Binance’s steps in order with their procedures, the indicators split by what each source can support, and a detection on the step it covers.

If you run OpenCTI, the open-source threat intelligence platform, read OpenCTI Is Not a STIX Database before importing these graphs; it explains why OpenCTI may not store them exactly as written.

In summary

Three reports on the Binance theft started as three unconnected STIX graphs. A campaign and an intrusion set join them. FLATROOF attaches to TraderTraitor at confidence 50, ROOFDECK hangs off FLATROOF, and a note explains why neither touches the campaign. The Attack Flow puts Binance’s confirmed steps in order, leaving two without an ATT&CK technique rather than forcing a match. The result is one graph you can hunt with: one confirmed Binance indicator and 17 related ones, each carrying its source’s confidence, and a Sigma rule linked to the pyenv step it detects.

Reference: IoCs and ATT&CK techniques

For copying into tools that don’t use STIX. Each row gives the STIX ID of the matching object in the graphs above.

IoCs

Domains, URLs and the IP address are defanged ([.], hxxps). “Linked to” is the object each indicator points to: the campaign for the one indicator confirmed on Binance’s machines, and FLATROOF or ROOFDECK for the Terraform toolset indicators, which are not confirmed for Binance.

Type Value What it is Linked to Confidence STIX ID
File event pyenv_ created in /opt/homebrew/Cellar/pyenv/2.8.0/libexec pyenv replaced via pyenv_ staging file Binance hot wallet theft, October 2026 100 indicator--b9788fae-7ac4-5ec0-a756-0e84b4543472
SHA-256 188bd4fc222c9615540884920caf37ea88bcbea7488e1fb98709e357dd096666 Trojanised terraform-provider-awsbeta_v1.0.0 FLATROOF 50 indicator--666b68e3-9a33-5cab-ae32-5fb059ff6f23
SHA-256 451b586ec9d3c997b319986a1177829653e8ae641c953c05ede6a38616f2da97 safari_updater Bash loader FLATROOF 50 indicator--e4e6306f-18ec-560f-96c4-cd5e7458aa33
SHA-256 62e988e9affcd000657bef4db47eb2e85c9a4cc42f4832780a02e19624e36e38 HiraginoSans-Regular.woff encrypted FLATROOF container FLATROOF 50 indicator--5a0a93d8-c8c3-5939-920a-c8488ac6af42
SHA-256 3c254614de8c1a2f213c526b0e5072d43ffeb7cc340d9a4a6ebaa16592b3bbe0 Decrypted FLATROOF (macOS ARM64) FLATROOF 50 indicator--b4895a2e-58bf-5d7e-b03c-f22216d7b7de
SHA-256 4ba58fba8e1293e1d980726323bda0fcd3cc1e5781a99e86638a4a7641b6ffd6 ROOFDECK imagent (macOS) ROOFDECK 50 indicator--18980c8e-269c-568c-b9ec-4cfcacad57a3
SHA-256 e1c71374814e5d907afb913108090b8abf21ae2131c0880f013a3b9108a9d0fc ROOFDECK update.exe (Windows) ROOFDECK 50 indicator--dd73ffe0-c484-55d6-8a31-8cd7ffa0870e
Domain registry[.]hashicorp-terraform[.]io Lookalike Terraform registry FLATROOF 50 indicator--12646562-1573-5026-946e-dec5e946c32a
Domain registry[.]hashicorp-aws[.]com Lookalike Terraform registry FLATROOF 50 indicator--58a7c194-90ea-568a-a429-615fedbb635f
Domain registry[.]hashicorp-aws[.]io Lookalike Terraform registry FLATROOF 50 indicator--fdee89fa-5259-59bf-bafd-4a7e53d2083f
Domain diagnose[.]hashicorp-terraform[.]io safari_updater download host FLATROOF 50 indicator--3d9fc9f7-9547-5056-8ba9-f9a7b059fef0
Domain supportaru[.]serveftp[.]com FLATROOF payload host FLATROOF 50 indicator--0c66ce7b-dcf9-582f-ad2e-47942a9f4970
Domain stage-fashion365[.]vercel[.]app FLATROOF payload mirror FLATROOF 50 indicator--066454ac-9b46-585d-a29b-e0341dbf3c3f
URL hxxps://raw[.]githubusercontent[.]com/bluearuhost/hospitalrun-frontend/refs/heads/main/public/fonts/version1/ FLATROOF payload mirror (GitHub) FLATROOF 50 indicator--3e1d3a2c-88d1-5d04-abdf-64f6a84cf715
Domain arusupport-region1-webhook[.]online FLATROOF C2 webhook FLATROOF 50 indicator--8c12dcd1-8202-5b96-bca6-85d620387234
Domain delay[.]servehttp[.]com ROOFDECK C2 ROOFDECK 50 indicator--d9fda8e0-80a2-5e8b-9b4e-e54182ced2d7
URL hxxps://pastebin[.]com/raw/3yptBDhL ROOFDECK signed C2 dead drop ROOFDECK 50 indicator--89514b70-b072-5e16-ab51-e3d269b633f2
IPv4 176[.]97[.]114[.]232 Served ROOFDECK (MacOS.Backdoor.GetShell) ROOFDECK 50 indicator--5208ee91-8b44-517c-8304-02ee34274a13

ATT&CK techniques

The steps of the Attack Flow, in order. Steps 8 and 12 have no ATT&CK technique; their STIX ID is the procedure that describes them.

Step Action Technique Tactic STIX ID
1 Tampered Homebrew download T1195 Supply Chain Compromise Initial Access attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7
2 Wallet team mapped T1591.004 Identify Roles Reconnaissance attack-pattern--cc723aff-ec88-40e3-a224-5af9fd983cc4
3 Fake Project Director, HR and CEO personas T1585 Establish Accounts Resource Development attack-pattern--cdfc5f0a-9bb9-4352-b896-553cfa2d8fd8
4 Approach via job platform and chat app T1566.003 Spearphishing via Service Initial Access attack-pattern--f6ad61ee-65f3-4bd0-a3f5-2f0accb36317
5 Assignment repo runs on setup T1204.002 Malicious File Execution attack-pattern--232b7f21-adf9-4b42-b936-b9d6f7df856e
6 pyenv replaced with malicious build T1554 Compromise Host Software Binary Persistence attack-pattern--960c3c86-1480-4d72-b4e0-8c242e84a5c5
7 C2 and trace removal (trace removal is T1070.004, in the step’s description) T1071 Application Layer Protocol Command and Control attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6
8 Internal AI tool used as a springboard None (procedure: Pivot between engineers’ machines through an internal AI tool) Lateral Movement procedure--9288b3e8-debe-5a94-b2ab-77ffa18d0a8c
9 Container deployment token stolen T1528 Steal Application Access Token Credential Access attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a
10 Container deployed to reach signing service T1610 Deploy Container Execution attack-pattern--56e0d8b8-3e25-49dd-9050-3aa252f5aa92
11 Direct transfers from hot wallets T1657 Financial Theft Impact attack-pattern--851e071f-208d-4c79-adc6-5974c85c78f3
12 EIP-7702 delegation abuse None (procedure: Hot wallet takeover through EIP-7702 delegation) Impact procedure--3c0971bd-72eb-5901-8ea0-ea68f1a8879f
13 Delegations outlive the withdrawal pause T1657 Financial Theft Impact attack-pattern--851e071f-208d-4c79-adc6-5974c85c78f3

Posted by:

Dylan Thomas

Dylan Thomas, Do Only Good Everyday