Research / Incident analysis

/how they got in · 01

How they got in: Bitget, September 2026

Bitget says an attacker moved about $387.5 million out of part of its hot and warm wallets on September 25, 2026 (UTC+8), by sending fraudulent withdrawal commands to its own wallet system. A plain reading of the two preliminary reports, where they differ, and what other exchanges can check.

Kahu Labs ResearchOctober 1, 2026Updated October 2, 2026Incident analysis19 min read
Bitgetincident analysishot walletwithdrawal securitythird-party security productsweb shelllateral movementcrypto exchange securityMITRE ATT&CK
The short version

Early on September 25, 2026 (UTC+8), crypto left part of Bitget's hot and warm wallets [1]. Bitget's latest estimate is about $387.5 million, up from its first figure of $351.6 million, and Bitget says the revision is a fuller count of the same incident's transfers, adding Zcash and TRON assets left out of the first estimate, with no further transfers [5][4].

Two preliminary reports, from Mandiant and SlowMist, describe two compromised third-party security products in Bitget's environment [1][2]. Bitget says those compromises ultimately enabled access to its wallet environment [3]. Mandiant says the attacker moved from one of the products to Bitget's production wallet job server and deployed malicious packages there [1]. SlowMist recovered a custom withdrawal tool that forged risk-control parameters and then invoked the wallet system's withdrawal process [2].

Bitget says private-key compromise has been ruled out based on its investigation to date, and that its cold wallets were not affected [6]. Mandiant's report relays Bitget's account that it saw no evidence of key compromise [1].

If you run an exchange, here's one check for this week: list every security tool that can reach a wallet or signing host, then find out who can log in to it, from where, and what it can run.

A note on sources, and what this piece is.

This piece reads three kinds of material. The first is Bitget's own public statements [3][4][5][6][7]. Bitget's incident page displays September 30 at 00:00 UTC as its last update; that displayed timestamp does not establish when each statement on the page was added [7]. The second is two reports that became available on September 30 [6]: a Mandiant status report with a cover date of September 28 [1], and a SlowMist progress report current as of September 29 [2]. The third is named press and analyst reporting [8][9][10] and, for the short comparison, cited public accounts of earlier incidents [17][18][19].

Kahu Labs did not take part in the investigation. We haven't seen Bitget's systems or logs, and we didn't trace the transactions ourselves. When a report says something was verified, the verification is the investigators'. The reports are Mandiant's and SlowMist's work, and Bitget's statements are Bitget's account. The reading and the recommendations here are ours.

Both investigations were still going when the reports were written [1][2]. Treat them as a snapshot. Where they differ, we show both versions and don't choose.

Every statement in /what failed carries one of three labels. Source statement: means an explicitly attributed statement by Mandiant, SlowMist, or Bitget, not independent confirmation by Kahu Labs. Public reporting: means a named press or analyst account, or a cited public account of an earlier incident. Our inference: means Kahu Labs' reasoning and recommendations from the record. The reports describe what happened, and they don't list Bitget's controls. So our recommendations are suggestions for any exchange, and a crossed boundary in this piece doesn't mean the reports found a missing control.

The reports call the two security products Product A and Product B, and neither names the attacker [1][2]. We follow them. Public reporting: Bitget CEO Gracy Chen has said in public that a North Korean group was likely behind the theft, and Elliptic assesses a link to North Korea as "highly likely," citing, among other things, on-chain links to earlier DPRK-attributed thefts [10]. Those are claims by Chen and by Elliptic. Bitget's Academy explanation says it will not speculate on attribution without verified investigative findings [6], and we don't name anyone either.

A note on dates. The reports use UTC+8, which puts the theft on September 25 [1][2]. Bitget's notices use UTC, where the same moment falls on the evening of September 24 [4][6]. It's one event. Times below are UTC+8 unless marked.

/what happened

The doors.

Think of every system a company runs as a door. Known as: attack surface. The doors in this story were two third-party security products in Bitget's environment [1][2][3]. Our inference: Security tools often need wide reach and high privileges to do their job, which makes them worth attacking. The reports do not describe the products' full intended roles or access permissions. Mandiant does report that the attacker used appliance B to reach the production wallet job server [1].

First, a word on wallets. Exchanges typically keep most funds offline in cold wallets and a working balance online in hot wallets, so withdrawals can go out quickly. Warm wallets sit in between. Known as: hot, warm and cold wallets. Bitget says it runs all three tiers and that only part of the hot and warm layers was affected [4][6].

01 Activity on Product A, from August 31.

SlowMist's earliest sign of malicious activity, in the logs available to it, is August 31 [2]. SlowMist calls the flaw affecting a service on one Product A node a zero-day [2]. The term generally refers to exploitation of a previously unknown vulnerability [20]. The report does not disclose when the vendor learned of this flaw or when a fix became available. The attacker ran a hidden script under that service, used a command to read an environment variable holding a database password, and connected to the database [2]. SlowMist saw similar hidden-script activity on two other nodes, on September 23 and September 25 [2]. It says these findings show the affected services had been compromised before any assets were transferred out [2].

An environment variable is a setting a program can read while it runs. Here, one held a password. The report doesn't say which database the password opened, or whether it mattered later [2].

August 31 is the earliest activity SlowMist found in the material it was given, and the report doesn't call it the first day of the intrusion [2]. It also doesn't say whether older logs exist.

02 A second product, and an employee's identity.

Mandiant's forensic findings indicate that on September 24 the attacker gained unauthorized privileged access to both appliances, A and B [1]. Mandiant says the attacker installed a web shell on appliance B and established a command-and-control connection [1]. Known as: web shell, a small program that lets someone send commands to a server through a web interface. Known as: command and control, or C2, for the steering channel.

SlowMist describes Product B in different terms. In the early hours of September 25, the attacker accessed Product B's management platform using an internal employee's identity [2]. Starting at 00:07, the attacker made three attempts in a row to insert system commands into a task's parameters so the platform would write malicious files [2]. The attacker then submitted code through the platform's web execution endpoint, attempting to change server settings, write a file for relaying communications, and upload and assemble malicious program files in batches [2]. SlowMist describes these as attempts and doesn't say which ones succeeded.

Neither report says how the attacker came to be using that employee's identity, or whether Mandiant's web shell and SlowMist's account describe the same activity [1][2]. Bitget's own summary says the attacker may have used a flaw in a third-party security product to obtain high-level internal credentials [6]. Its incident page puts it without the hedges: a zero-day in a third-party security product gave the attackers access to critical internal management systems, and forged identity information looked genuine, so the access registered as normal logins [7]. Neither report connects Product A to Product B.

03 From an appliance to the wallet job server.

Mandiant says the attacker used that persistent access on appliance B to move to Bitget's production wallet job server and deploy malicious packages there [1]. Known as: lateral movement, getting from one compromised system to the next. Mandiant's summary is that the attacker compromised network and security appliances and used them to distribute malicious packages and gain control over the wallet job server [1].

SlowMist names a wallet application host among the affected systems and says it is still investigating how the attacker moved between them [2]. The reports don't say whether the wallet job server and the wallet application host are the same machine.

04 A withdrawal tool built for Bitget's system.

SlowMist recovered a highly customized withdrawal tool from files the attacker had deleted [2]. It was tailored to the wallet system's withdrawal logic. It forged risk-control parameters in its code, built withdrawal requests, and invoked the withdrawal process [2]. Known as: risk controls, the checks a system runs to decide whether a withdrawal looks safe. A host log shows the malicious program starting to run and steal at 01:49 [2]. The report doesn't publish which parameters were forged or how Bitget's checks work, so we won't guess at them.

Bitget's own account is close to this. It says the attacker appears to have sent fraudulent withdrawal commands to the wallet system, which carried out transfers that bypassed existing risk controls [6]. Its incident page adds that the attackers wrote forged withdrawal commands directly into the wallet system, which processed them as normal withdrawals, bypassing risk-control verification before withdrawal records were generated, and that the attackers deleted traces after the transfers [7]. Our inference: The record points at the path that requests withdrawals more than at key storage. That reading leans on Bitget's statement that key compromise has been ruled out to date [6], and the reports don't describe how Bitget's signing works.

05 Transfers over almost three hours.

The earliest transfer SlowMist has verified on-chain arrived at 02:31:00: 93 TRX to the attacker's address, then 0.84 ETH on Ethereum 11 seconds later [2]. The records it compiled run to 05:23:11 the same morning, about 2 hours and 52 minutes, across several blockchains [2]. Mandiant, relaying Bitget, says Bitget's security monitoring detected the unauthorized transfers at 02:31, and that they ran alongside legitimate internal wallet operations on Ethereum until about 05:23 [1].

After the transfers had begun, the attacker also tried to change withdrawal records directly in the wallet database and to start withdrawal tasks on the host itself [2]. Two fabricated BTC withdrawal orders entered processing and returned errors. The logs then show the attacker reviewing logs, checking order status, and trying again, all after 05:22 [2]. The report does not explain why the two BTC orders returned errors or establish which control, if any, caused those responses.

06 What Bitget did.

Bitget's own timeline, updated September 30, gives its response in UTC [6]. Converted to UTC+8, it reads like this. At 03:05 its reconciliation system flagged a significant discrepancy, and its risk-control system automatically blocked withdrawal requests across the platform. At 03:14 Bitget raised its highest-level emergency response, and containment began at 03:40. At 04:40, because key compromise hadn't yet been ruled out, the wallet team started moving funds to cold wallets. At 05:44 Bitget shut down wallet withdrawal services, signing included, and isolated withdrawal-related access [6].

Since then, Bitget says, it has isolated the affected systems, remediated the underlying vulnerability, revoked and reissued internal login credentials, restructured access to highly sensitive systems, and started requiring multiple approvals for critical operations [6]. It also says it notified the vendor and disabled the affected function pending completion of a fix [6]. Its incident page says the relevant vulnerabilities have been patched and the vendor is assisting with remediation [7]. From these statements we can't tell whether the vendor has shipped a fix. Bitget reported the incident to law enforcement on September 25 (UTC) and notified financial intelligence units [6]. It says its User Protection Fund covers the loss; its first notice put the fund at over $464 million [4][6].

/the timeline

Times are UTC+8 on September 25, 2026, unless a date is shown. Subtract eight hours for UTC; anything before 08:00 falls on September 24 in UTC. Rows without a time keep the precision the source gives.
WhenWhat the source reportsSourceType
Aug 31Earliest malicious activity in the logs SlowMist had: a zero-day affecting a service on a Product A node; a database password read from an environment variable[2] 2.1Source statement
Sep 23Similar hidden-script activity on another node[2] 2.1Source statement
Sep 24, no time givenPrivileged access to appliances A and B; web shell and C2 on B (Mandiant)[1] p. 2Source statement
Sep 25, no time givenSimilar hidden-script activity on a third node; Bitget engages Mandiant, and SlowMist is invited[2] 1, 2.1; [1] p. 2Source statement
Early hoursAccess to Product B's management platform with an internal employee's identity[2] 2.1Source statement
00:07First of three attempts to inject commands into Product B task parameters; code later submitted through the web execution endpoint[2] 2.1Source statement
01:49A host log shows the malicious program starting to run and steal[2] 2.2Source statement
02:31Bitget's security monitoring detects unauthorized transfers (Mandiant, relaying Bitget; Bitget's first notice gives 18:31 UTC)[1] p. 2; [4]Source statement
02:31:00Earliest transfer SlowMist verified: 93 TRX, then 0.84 ETH 11 seconds later; Bitget's updated timeline lists 18:31 UTC as the first unauthorized transfers[2] 2.3; [6]Source statement
After transfers began, no time givenAttempted changes to withdrawal records in the wallet database and attempts to start withdrawal tasks on the host; two fabricated BTC orders enter processing and return errors[2] 2.3Source statement
03:05Reconciliation flags a discrepancy; risk control blocks withdrawal requests platform-wide[6]Source statement
03:14Highest-level emergency response[6]Source statement
03:40Containment begins[6]Source statement
04:40Wallet team starts moving funds to cold wallets[6]Source statement
After 05:22The attacker reviews logs, queries order status, and makes further BTC withdrawal attempts[2] 2.3Source statement
05:23:11Last transfer in SlowMist's compiled records (Mandiant: about 05:23)[2] 2.3; [1] p. 2Source statement
05:44Withdrawal services, signing included, shut down[6]Source statement
Sep 30Both reports become available[3]; [6]Source statement

Source statement: Bitget's published timeline places the automatic withdrawal block at 03:05 and the shutdown of signing services at 05:44 [6]; SlowMist's compiled transfer records end at 05:23:11 [2]. Public reporting: Bitget's CEO told The Block the 03:05 block covered user-initiated withdrawals [8]. Our inference: These timestamps do not establish when the underlying transactions were requested, signed, or broadcast, or which containment action ended the unauthorized transfers. A backend route outside the user-facing withdrawal block is a possibility to test; the reports do not establish it.

/what the two reports say, and where they differ

Each report's account, side by side. Mandiant's cover is dated September 28; SlowMist's report is current as of September 29.
QuestionMandiant [1]SlowMist [2]
Earliest dated activity it describesPrivileged access to appliances A and B on September 24Malicious activity on Product A on August 31, in the available logs
Product APrivileged access; entry method not describedA zero-day affecting a service on one node; hidden script; database password read
Product BWeb shell; C2 connectionAccess with an employee's identity; attempted command injection into task parameters; code through a web execution endpoint
Path to the wallet systemLateral movement from appliance B to the production wallet job serverStill under investigation
On the wallet systemMalicious packagesA custom withdrawal tool that forged risk-control parameters; running from 01:49 per a host log
Detection and transfersBitget's monitoring detected transfers at 02:31; unauthorized transfers until about 05:23Earliest verified transfer at 02:31:00; compiled records to 05:23:11
StatusInvestigation ongoingStill investigating how the attacker moved between systems

The two dates are more than three weeks apart, and they describe different things: when Mandiant's forensics place privileged access to the appliances, and the earliest activity SlowMist found in the logs it had [1][2]. Neither report presents its date as the start of the whole intrusion, and neither explains the other.

The Product B accounts differ in kind. Mandiant describes a web shell and remote control; SlowMist describes an employee's identity, attempted command injection, and a web execution endpoint [1][2]. The reports don't say whether these are the same activity described at different levels of detail.

Mandiant's "malicious packages" and SlowMist's withdrawal tool might be the same thing or might not [1][2]. Neither report says.

Bitget's campaign page says the attackers "did not use common viruses or malware" and describes use of legitimate identities and routine operational procedures [7]. Mandiant describes a web shell and malicious packages [1], and SlowMist describes a hidden script and a custom withdrawal tool it calls a malicious program [2]. Bitget's page also says an investigation has confirmed the full attack chain [7], while SlowMist's report says it is still investigating movement between systems [2]. Bitget's campaign page uses different wording about malware and investigation completeness. Its scope and update history are not clear enough to establish a direct contradiction with the earlier reports. We retain each account with its source and date, and treat the detailed attack chain as unresolved in the public record.

Bitget's own statements differ on detection. Its first notice says its security systems detected unauthorized transfers at 18:31 UTC, which is 02:31 UTC+8 [4], and its incident page says the same [7]. Its updated timeline lists 18:31 UTC as the time of the first unauthorized transfers and puts detection at 19:05 UTC, or 03:05 UTC+8 [6]. We don't know which signal each account refers to, and we don't treat the difference as a measure of response time.

Public reporting: Chen told The Block the first two transfers were small tests below the risk-control threshold that raised no alerts, and gave them as 0.184 ETH and 193 TRX [8]. SlowMist gives 93 TRX and 0.84 ETH [2]. Public reporting: Chen also put 17 larger transactions, worth about $361 million, between 02:58 and 04:09 UTC+8 [8]. SlowMist's compiled records run to 05:23:11 [2], and the two windows may cover different sets of transfers. We can't tell from public material which figures are right, and nothing below depends on them.

The loss figure moved too: $351.6 million in Bitget's first notice [4], about $387.5 million after a fuller count that added Zcash and TRON assets [5], and about $388 million on its Academy page [6]. Bitget's incident page calls $388 million final verified figures [7], while the Academy page says the estimate may be updated [6]. Mandiant gives Bitget's estimate as a range of $351.6 million to $387.5 million [1].

/what failed

Ten blocks follow. Most name a boundary the record shows the attacker got past; the last two cover the time it took to stop signing and the limits of the logs. Each block says what the record shows and why it matters, and adds a practitioner layer. Every statement carries its own label. The reports show outcomes and don't list Bitget's controls, so a crossed boundary here doesn't mean a control was missing. Every recommendation is our inference.

01 Security appliances with privileged reach.

Source statement: Mandiant says an attacker gained privileged access to two third-party security appliances and placed a web shell on one [1].

Source statement: Bitget says compromised third-party security products ultimately enabled unauthorized access to its wallet environment [3].

Our inference: Security tools often sit where they can see and act on many systems, so their management side deserves the same care as the systems they protect. The reports do not describe these products' full intended roles or access permissions; Mandiant does describe appliance B as a path to the production wallet job server [1].

Why it matters Our inference: Whoever controls the tool that watches the doors may be able to open them from the inside.

For practitioners

Our inference: Mandiant's web shell on appliance B fits ATT&CK T1505.003 Server Software Component: Web Shell [13]. The report doesn't name the C2 protocol, so we assign no C2 technique.

Our inference: The edge-device guidance set on CISA's site covers network edge devices and appliances [11], and ASD's executive guidance in that set asks for management interfaces that aren't directly reachable from the internet and for centralized monitoring [12]. The reports don't say whether Products A and B are edge devices or faced the internet, so treat that guidance as a reference point. Reach appliance management planes only from dedicated admin hosts, and send their logs to a store where the appliance can add events but can't change or delete them.

02 A zero-day in a security product's own service.

Source statement: SlowMist says a service on a Product A node was affected by a zero-day vulnerability [2].

Source statement: Bitget says it notified the vendor and disabled the affected function pending completion of a fix [6].

Public reporting: BleepingComputer reported that the attackers breached Bitget after exploiting "a zero-day flaw in third-party security products," and its article describes two appliances compromised with zero-day exploits [9].

Our inference: The reports tie a zero-day only to Product A, so we treat the broader wording as unconfirmed. When no fix is available, buyers can still limit how far a compromised product can reach and watch for unusual behavior. The reports do not establish the vendor's fix timeline.

Why it matters Our inference: Every product you add brings its own flaws into your attack surface.

For practitioners

Our inference: The hidden script run under the service process fits T1059 Command and Scripting Interpreter [13]. T1190 Exploit Public-Facing Application would apply only if the service was reachable from the internet, which SlowMist doesn't say [13]. We found no public CVE in the sources we reviewed.

Our inference: Baseline each appliance's process tree and outbound connections, and alert on child processes the vendor doesn't document.

03 A database password in an environment variable.

Source statement: SlowMist says the attacker read an environment variable containing a database password and connected to the database [2]. It doesn't say which database or what it held.

Our inference: A compromised process gets whatever that process can reach. Moving the password into a secrets manager doesn't change that by itself; narrow permissions and short-lived credentials limit what a stolen one is good for.

Why it matters Our inference: When the service fell, the password it used was within reach too.

For practitioners

Our inference: This fits T1552 Unsecured Credentials [13]. ATT&CK has no sub-technique for environment variables, so we stop at T1552.

Our inference: Scope database accounts per workload, issue short-lived credentials bound to the workload's identity, and alert when a service account connects from somewhere it normally doesn't.

04 A management platform that accepted commands and code.

Source statement: SlowMist says the attacker tried three times to inject system commands through Product B's task parameters, then submitted code through the platform's web execution endpoint [2].

Our inference: The reports do not describe Product B's full intended role, managed hosts, or permission model. A console account that is authorized to run code can expose the systems and privileges available to that execution path. Login access alone does not establish equivalent server access.

Why it matters Our inference: Review each console role's permitted actions, target hosts, and execution identity, as well as independent controls around sensitive systems.

For practitioners

Our inference: Command injection through task parameters fits T1059 Command and Scripting Interpreter [13].

Our inference: Validate task parameters on the server, build commands from structured inputs, turn off execution endpoints you don't use, and log every task with its identity and parameters to a store outside the tool.

05 An employee's identity on an admin console.

Source statement: SlowMist says the attacker accessed Product B's management platform using an internal employee's identity [2].

Source statement: Bitget's incident page says forged identity information looked genuine, so its systems treated the attackers' access as normal logins [7].

Source statement: Bitget says the attacker may have obtained high-level internal credentials through a flaw in a third-party product, and that it has since revoked and reissued internal login credentials and restructured access [6].

Our inference: The usual controls here are phishing-resistant MFA, admin sessions bound to managed devices, and a fresh check before privileged actions. The reports don't say which of these Bitget had, or how the identity was obtained.

Why it matters Our inference: To a console, a stolen identity looks like a colleague.

For practitioners

Our inference: This fits T1078 Valid Accounts [13]. ASD's edge-device guidance calls for phishing-resistant MFA across edge devices [12].

Our inference: Keep admin sessions short, require step-up authentication for task creation and code execution, and alert on admin activity that doesn't match the account's usual device, location, or role.

06 A path from a security appliance to a wallet server.

Source statement: Mandiant says the attacker moved laterally from appliance B to the production wallet job server [1].

Our inference: Some route existed between that appliance and that server. Segmentation that allows only named traffic from appliances to wallet hosts narrows the network routes. Identity systems, deployment tooling, and other management systems can be routes too.

Why it matters Our inference: Each route from a security tool to a wallet host is one more way to reach the money.

For practitioners

Our inference: Mandiant doesn't name a technique. It says the appliances were used to distribute malicious packages [1], so T1570 Lateral Tool Transfer is our closest mapping [13].

Our inference: Deny traffic by default from appliance networks to signing and wallet tiers, keep explicit allow-lists, and test from the appliance side. ASD's guidance describes segmentation as limiting pathways for unauthorized access and lateral movement [12], and NIST's zero trust architecture starts from the premise that network location alone grants no trust [16]. Map the paths that don't cross the network boundary too, such as shared identity providers and deployment accounts.

07 Code that wasn't Bitget's, on a wallet host.

Source statement: Mandiant says malicious packages were deployed on the wallet job server [1].

Source statement: SlowMist says a host log shows a malicious program running from 01:49, and that it recovered the attacker's tool from files the attacker had deleted [2].

Our inference: On a server whose job is moving money, the aim is that only known, approved software runs and that anything new raises an alarm. Allow-listing and file integrity monitoring serve that aim. How well they work depends on coverage and configuration, and on what approved interpreters can still be made to run.

Why it matters Our inference: Malicious code on a wallet host can misuse the permissions and credentials available to its execution context. The resulting reach depends on authorization, isolation, and independent policy or signing controls.

For practitioners

Our inference: Deleting the tool fits T1070.004 Indicator Removal: File Deletion [13].

Our inference: Build wallet hosts from fixed images, tie every change to an approved ticket, check package signatures, and ship host telemetry off the box so a deleted file doesn't take the evidence with it. Signed packages don't stop misuse of software that's already approved.

08 A withdrawal path that accepted forged risk inputs.

Source statement: SlowMist says the tool forged risk-control parameters, built withdrawal requests, and invoked the withdrawal process [2].

Source statement: Bitget says the fraudulent commands bypassed existing risk controls, and that private-key compromise has been ruled out based on its investigation to date [6].

Source statement: Bitget's incident page says the attackers wrote forged withdrawal commands directly into the wallet system, which processed them as normal withdrawals, bypassing risk-control verification before withdrawal records were generated [7].

Public reporting: Bitget's CEO told The Block the first two transfers sat below the risk-control threshold and raised no alerts [8].

Our inference: The record points at the request side: what the system was told to do. If risk checks take their inputs from the same place that builds the request, whoever controls that place can shape the checks. Bitget places the bypass before withdrawal records were generated [7], but neither Bitget nor the reports say where the checks ran or how they were built, so we raise it as a design question for any exchange.

Why it matters Our inference: Signing protects funds only as well as the decision about what gets signed.

For practitioners

Our inference: The attempted changes to withdrawal records fit T1565.001 Data Manipulation: Stored Data Manipulation, as an attempt [13].

Our inference: CCSS v9.0 treats key material access (1.04) and key material usage (1.05) as separate aspects, and at its higher levels 1.05.8 asks that fund destinations and amounts be verified through approved channels before key material is used [14]. We use it as a design reference; it says nothing about Bitget's certification.

Our inference: Start from a withdrawal worker you assume is compromised and list everything its credentials can do: submit requests, change records, create approval evidence, change policy, call the signer. Then bind approval to the exact transaction, its destination, amount, asset, and network, and check it again right before signing, so a changed, replayed, or expired approval fails. OWASP's transaction authorization guidance makes the same points for user-facing transactions: protect transaction data from modification, check that each execution was properly authorized, and limit authorization credentials in time and to one operation [15]. Applying it to a hostile backend is our extension.

Our inference: A separate policy service helps only if the compromised worker can't also reach its credentials, administrators, policy store, input data, or deployment pipeline. Add rate and velocity limits per wallet and destination, alerts on first-time destinations, and out-of-band approval for large or unusual withdrawals.

Our inference: Earlier thefts have also turned on what signers were asked to sign, through different mechanisms. We'll read each case in its own post.

Public reporting: In the Bybit theft of February 2025, which the FBI attributed to North Korea and put at about $1.5 billion [17], Safe{Wallet} said a compromised developer machine led to a disguised malicious transaction proposal [18]. At WazirX, where attackers took over $230 million from a multisig wallet in July 2024, the exchange said its signers could see transaction details only in its custody provider's web interface, because their hardware wallets were blind signing [19]. This is WazirX's description of its signing workflow; we do not determine responsibility for that incident here.

09 The withdrawal block and signing shutdown.

Source statement: Bitget's timeline shows an automatic withdrawal block at 03:05 and signing shut down at 05:44 [6].

Source statement: Mandiant says unauthorized transfers continued until about 05:23 [1], and SlowMist's compiled records end at 05:23:11 [2].

Public reporting: Bitget's CEO told The Block the 03:05 block covered user-initiated withdrawals [8].

Our inference: The published times do not establish when transfer requests were made, signed, or broadcast, or which containment action ended the unauthorized transfers. SlowMist's last compiled transfer precedes Bitget's reported signing shutdown by approximately 21 minutes. That interval is not a measure of response time or proof that new signatures were produced after the withdrawal block.

Why it matters Our inference: Detection helps limit losses when it triggers effective containment. Teams should test how quickly they can stop unauthorized requests and new signatures, and account separately for transactions that are already signed or broadcast.

For practitioners

Our inference: Build a way to halt hot-wallet signing that does not depend on the withdrawal API, can be triggered by a reconciliation mismatch, and is protected against both misuse and lockout. Drill it with queued approvals, retrying workers, direct signer calls, and one service down; time how long new signatures take to stop.

Our inference: Track signed-but-unbroadcast transactions, pending broadcasts, and automatic top-ups separately from new requests. Halting new signatures does not invalidate an already-valid signature. Further containment depends on the chain and transaction state; the drill should inventory pending work and ensure a restart does not replay stale approvals or refill a wallet being drained.

10 What the logs could show.

Source statement: SlowMist's earliest finding is bounded by the logs available to it, and its disclaimer says its analysis rests on materials supplied up to the report date [2].

Our inference: From the outside, nobody can tell whether there was activity before August 31. The report says what the logs it reviewed showed and doesn't say whether older logs exist.

Why it matters Our inference: An intrusion is dated by the evidence that survives.

For practitioners

Our inference: Forward appliance and management-plane logs to central storage, with append-only ingestion, retention long enough to cover a slow intrusion, and a backup. ASD's executive guidance asks for centralized visibility and backed-up event logs [12], and the set on CISA's site includes an NCSC publication on forensic and monitoring specifications for network devices [11]. Test what happens when logging stops, as well as when entries are deleted.

/what held

Some things held, according to the record.

Bitget says its cold wallets across all chains were not affected, and Mandiant relays the same [1][6]. The reports don't say which control kept that boundary intact. Bitget also says private-key compromise has been ruled out based on its investigation to date [6].

Bitget's reconciliation system flagged the discrepancy, and its risk-control system automatically blocked withdrawal requests across the platform, at 03:05 by Bitget's timeline [6]. Mandiant, relaying Bitget, puts detection by Bitget's security monitoring at 02:31 [1].

Two fabricated BTC withdrawal orders entered processing and returned errors [2]. The report doesn't say why, so we don't credit a control for it.

SlowMist recovered the custom withdrawal tool even though the attacker had deleted it [2]. Bitget Wallet, a separate non-custodial product on separate infrastructure, was not affected, Bitget says [6].

Bitget posted a public notice, named its outside investigators, and made both reports available [3][4][5]. It says its User Protection Fund, which held over $464 million at the time of its first notice, covers the loss [4][6].

/lessons for other exchanges

Questions to ask this week. Each points back to a block above.

  1. List every security appliance and management console that can reach a wallet or signing host, directly or through identity and deployment systems. For each one, who can log in, from where, with what kind of MFA, and what can it run? (Blocks 01, 04, 05 and 06. Edge-device guidance [11][12].)
  2. If one of those tools had an unknown flaw today, what could its service account read and use? Check for passwords in environment variables and config files, and what each one opens. (Blocks 02 and 03. ATT&CK T1552 [13].)
  3. Can your security tools run commands or code on the machines they manage? If so, who can create a task, and is every task logged somewhere the tool can't rewrite? (Block 04.)
  4. Is there any network path from an appliance network to a wallet job server? Test it from the appliance side. (Block 06.)
  5. A new program starts on your wallet job server at 01:49 on a Friday. Who gets paged, and how fast? (Block 07.)
  6. Assume a withdrawal worker is compromised. What can its credentials do, and could it produce every piece of evidence needed to approve its own withdrawal? (Block 08. CCSS 1.05.8 [14]; OWASP [15].)
  7. Where do your withdrawal risk checks get their inputs? Can the host that builds a withdrawal change them? (Block 08.)
  8. Would two small transfers below your alert threshold, from two hot wallets on two chains, show up anywhere? (Block 08. Public reporting [8].)
  9. How long does it take, in practice, to stop unauthorized requests and new hot-wallet signatures, including queued approvals, retries, and direct signer calls? Track signed-but-unbroadcast transactions and pending broadcasts separately. When did you last drill it? (Block 09.)
  10. During an incident, does automatic top-up keep refilling a hot wallet that's being drained? (Blocks 08 and 09.)
  11. How far back do your appliance logs go, where do they live, and who can delete them? (Block 10. [11][12].)

/what we still don't know

The reports leave these open. We list them as unknowns.

How the attacker first reached the Product A service, and whether that service was reachable from the internet.

How Product A and Product B relate, and whether the database password from Product A mattered later.

How the attacker got from appliance B to the wallet job server. SlowMist says it's still investigating how the attacker moved between systems [2].

How the attacker came to be using an employee's identity. Bitget ties it to credentials stolen through the zero-day [7]; the reports don't say.

Whether Mandiant's malicious packages and SlowMist's withdrawal tool are the same thing, and whether the wallet job server and the wallet application host are the same machine.

Which signal each detection time refers to, and why transfers continued after the 03:05 block.

What share of the hot and warm wallet infrastructure was affected. Bitget's latest figure covers transfers from 12 hot or warm wallet addresses [6].

Which Ethereum operations before 05:23 were Bitget's own, including its moves to cold wallets from 04:40.

Why the two fabricated BTC orders returned errors.

Whether anything happened before August 31 that the reviewed logs don't show.

How Bitget's signing and approval system is built, and which specific checks the forged commands got past. Bitget says only that they bypassed risk-control verification before withdrawal records were generated [7].

Which products these are, which flaw was used, and whether the vendor has shipped a fix. Bitget says the affected function is disabled pending one [6].

/how we'll update this

Both reports are preliminary. When Bitget, Mandiant, or SlowMist publishes a final report or corrects a figure, we'll update this post, note the date and what changed at the top, and keep the earlier wording in a change log at the bottom. The original evidence was collected on October 1, 2026; we reviewed the public sources again on October 2, 2026.

Bitget says it will release a formal security report with more technical detail [7]. When it does, we'll read it the same way.

If you run security at an exchange and want to talk through any of this, write to hello@kahulabs.com.

/sources

Evidence collected October 1, 2026; accuracy review October 2, 2026. Links go to each publisher's own copy. Kahu Labs did not take part in the investigation; the reports are Mandiant's and SlowMist's work, and Bitget's statements are Bitget's account.

Primary sources

  1. Mandiant (Google Cloud Security), Bitget Incident Response Status Report, cover dated September 28, 2026 Page 2, Background and Preliminary Findings. Hosted by Bitget.
  2. SlowMist, Investigation Progress Report, Bitget (English), findings as of September 29, 2026 Sections 1 and 2.1 to 2.3 (PDF pages 3 to 4) and disclaimer (page 5). Copy at commit 09c5f53 in SlowMist's Knowledge-Base repository.
  3. Bitget, Update On Slowmist and Mandiant Report Support article, stamped 2026-09-30 05:20.
  4. Bitget, [SECURITY NOTICE] Bitget exchange hot wallets Incident, September 24, 2026 Support article, stamped 2026-09-24 21:39 (UTC, per Bitget's incident page [7]). The dash in the original title is shown here as a comma.
  5. Bitget, Bitget Security Latest Incident Update: Fund Tracing and Recovery Bounty Program Support article, stamped 2026-09-25 14:05. Latest Status section.
  6. Bitget Academy, Bitget Security Incident Explained: Timeline, Impact and Security Response Dated 2026-09-27, updated September 30, 2026. Timeline, investigation, response and wallet sections.
  7. Bitget, Bitget Security Incident (Hack): Official Progress Update Incident page displaying last updated 2026-09-30 00:00 UTC; this is not a revision history for each statement. Header, timeline, Security Incident Statement, root cause and FAQ. The dash in the original title is shown here as a colon.

Public reporting

  1. The Block, Brian Danga, Bitget attacker tested risk controls with small transfers before $388 million theft, CEO says September 28, 2026. Interview with CEO Gracy Chen.
  2. BleepingComputer, Sergiu Gatlan, Bitget hacked via zero-day in third-party security products September 30, 2026.
  3. Elliptic, Bitget attack pushes suspected North Korea crypto heists over $1 billion in 2026 September 25, 2026.

Frameworks

  1. CISA, Guidance and Strategies to Protect Network Edge Devices Published February 4, 2025. A set led by CCCS, NCSC-UK and ASD's ACSC.
  2. ASD's ACSC and partner agencies, Mitigation strategies for edge devices: Executive guidance First published October 3, 2024; updated February 4, 2025. Summary of mitigation strategies; network segmentation.
  3. MITRE ATT&CK Enterprise techniques Mappings in this piece are ours. T1505.003 T1059 T1552 T1078 T1570 T1190 T1070.004 T1565.001
  4. CryptoCurrency Certification Consortium (C4), CCSS v9.0 table Aspects 1.04 Key Material Access, 1.05 Key Material Usage, 1.05.8 Spend Verification.
  5. OWASP Cheat Sheet Series, Transaction Authorization Cheat Sheet Sections 2.6 and 2.8 to 2.10.
  6. NIST SP 800-207, Zero Trust Architecture Final, August 2020. Abstract.

Earlier incidents

  1. FBI, North Korea Responsible for $1.5 Billion Bybit Hack Public service announcement I-022625-PSA, February 26, 2025.
  2. Safe{Wallet}, Safe{Wallet} Statement on Targeted Attack on Bybit Post on X, February 26, 2025.
  3. WazirX, Day-Wise Report: WazirX Cyber Attack Incident Blog, updated over time. Account of the July 18, 2024 attack.

Definitions

  1. NIST Computer Security Resource Center, Zero Day Attack Glossary definition; used here only for the general meaning of zero-day.