Latest from Hypernative
Webinar: Digital Asset Risk for Traditional Finance
September 27, 2026
Detections

How Spoofed Requests Got Bitget's Own Wallets to Sign Away $387M

An attacker used a compromised backend system to push spoofed withdrawals through Bitget's own signing process. The onchain record shows how the requests passed as normal traffic, and where they could have been caught.

Hypernative

On 24 September 2026, between 18:31 and 21:23 UTC, Bitget's own hot and warm wallets sent ~$387M to an attacker. By Bitget's account, the attacker had compromised a backend system in its wallet infrastructure and used it to feed spoofed withdrawal requests into its authorization process. It appears to be the largest crypto theft of 2026 by value so far, and suspected North Korean crypto thefts now pass $1B for the year.

Bitget says its User Protection Fund will cover customer losses and that withdrawals will reopen in stages from 28 September, starting with BTC. Any exchange or custodian whose signer takes a transfer's destination and amount from an internal service, without checking them independently, has the same gap.

‍

What happened

Onchain, Bitget's custody looks tiered. High-volume hot wallets serve customer withdrawals and sign hundreds of transactions an hour. Lower-volume warm wallets hold larger balances and top up the hot tier, and cold storage sits behind both.

On 25 September, CEO Gracy Chen described the cause: "The attacker compromised a critical backend system within our wallet infrastructure, used it to spoof transaction data, and triggered our authorization process to move funds out. Private key compromise has been ruled out." 

The next day, Bitget said the vulnerability was identified and remediated and that Mandiant and others are supporting the investigation, but it hasn't published a technical report. Each attacker transfer is an ordinary, valid transaction from a Bitget wallet, sent to an address the attacker controlled.

Recent estimates place the loss at more than $387M. Bitget revised its figure from $351.6M to $387.5M on 25 September after adding the Zcash and Tron assets, and Hypernative’s onchain analysis of the attacker's transfers matches.

‍

Timeline of the drain

Figure 1: How the drain unfolded, from the first test transfers at 18:31 UTC on 24 September to the phased reopening of withdrawals. Most of the loss left in two waves, 15 minutes apart, that together took 24 seconds of signing. Source: Hypernative analysis of onchain data; Bitget statements.

The attacker tested the route first. At 18:31, two small transfers, 0.84 ETH and 93 TRX, went to fresh addresses 11 seconds apart. The attacker then waited 28 minutes before sending the first large transfer, 34.75M USDT, at 18:58. After that the loss came in two waves.

At 19:01, hot wallets sent $87.6M in seven transfers across five networks in 15 seconds. At 19:16, warm wallets sent $202.8M across five networks in 9 seconds. Those 24 seconds carried ~$290M, about three-quarters of the total. Transfers landing on unrelated chains within the same few seconds suggest a single process inside Bitget was sending requests to every chain's signer at once.

‍

How spoofed requests got signed

Figure 2: Hypernative's reading of the signing path. The attacker's transfers used Bitget's own fee settings; the gas limit doesn't match. Source: Hypernative onchain analysis.

Bitget's CEO has said no private key was stolen, and the onchain data is consistent with that. On all six EVM networks, the attacker's transfers used the same fee settings as Bitget's customer withdrawals sent around the same time but only the gas limit was different. The defense has to check what the signer is being asked to sign.

Figure 3: Four consecutive transactions from Bitget 6 on Ethereum during the incident. Fee settings match on every row, so gas limit is what differentiates the attacker's transfers from customer withdrawals. Source: Hypernative analysis of onchain data.

Every transaction on Ethereum-style networks carries a gas limit, a cap on how much work (and so fee) it's allowed to use. Bitget's system calculates this for each withdrawal, so its values look like 63,000 or 136,620. The attacker's requests arrived with fixed round numbers instead: 100,000, 200,000 or 50,000,000. Everything else about them looked like Bitget's own traffic, so this one signal gave them away, and it's something a system can check automatically before a transaction is signed.

On Bitget 6, the only native ETH sent were the attacker's four transactions: 0.84 ETH, 7,130.86 ETH, 1,879.20 ETH and 223.20 ETH.

The gas-limit signal is strongest on the high-volume hot wallets. Bitget 35, a low-volume warm wallet, uses round gas limits in its routine traffic, and XRPL and Tron transactions have no comparable field.

Where the funds went

Figure 4: Loss by network, priced at the time of each transfer. Zcash is shown dashed as a probable attacker leg. With it included, the ~$386.5M total sits within about $1M of Bitget's revised $387.5M. XRP and TRX are priced from a public hourly feed. Source: Hypernative analysis of onchain data.

XRPL carried the largest share at $157.7M, ahead of Ethereum at $126.5M. With the probable ~$29.4M Zcash leg and Tron's $7M, the three non-EVM networks account for about half of the total. Monitoring built only for EVM chains would have covered the other half.

The laundering route appears to have been ready before the first transfer. About ~$88.3M left Bitget as USDT, USDT0, USDC and XAUt, all assets their issuers can freeze. The USDT reached a swap hub (an EIP-7702 account delegated to MetaMask's smart-account contract) and was being sold for ETH through UniswapX fillers and Uniswap pools 1 minute 48 seconds after it arrived.

Figure 5: Where the proceeds sat at the ~11:30 UTC snapshot on September 25, 2026. ETH totals include proceeds bridged back from other EVM chains. The venues the attacker used after the theft were not exploited. Source: Hypernative analysis of onchain data, and Circle and Tether freeze data.

Proceeds on Base, Optimism, Arbitrum and BSC Chain were bridged back to Ethereum through intent-based bridges, and the Avalanche proceeds returned as USDC through Circle CCTP. The ETH was then split, mostly into round 10,000 ETH lots. 

At Hypernative's snapshot (~11:30 UTC on 25 September), ~68,295 ETH sat in eight wallets that had never sent a transaction, and 102.28M XRP sat in five XRPL accounts, one of which had started peeling off small amounts. The only real exit by then was ~5,032 BNB swapped to Bitcoin through THORChain, and the 20.59M TRX had started dispersing to 13 addresses. That left ~$341M not yet laundered. Since then, the attacker has begun moving the XRP: ~54M had left the original accounts by 26 September.

None of the venues the attacker used was exploited, and their users aren't affected. Uniswap, MetaMask Bridge and Swaps, LI.FI, Across, Stargate, deBridge, Relay, Mayan, Celer, PancakeSwap, THORChain and Circle CCTP appear only as routes taken after the theft. The heavy lookalike-address traffic around the attacker's wallets comes from third-party address poisoning campaigns.

‍

How the theft could have been stopped

Bitget's 24 September notice says its security systems detected unauthorized transfers at 18:31 UTC, the minute of the first test transfers, yet attacker transfers kept being signed until 21:23:11. Looking back at the onchain record, the earliest signal a pre-signing check could have acted on came at 18:31:11, when Bitget 6 sent the 0.84 ETH test to an address with no history using a gas limit that wallet doesn't otherwise use for ETH sends. The controls below are written for exchanges, custodians and anyone else running hot wallets.

‍

1. Bind every transfer to an independent record

The gap: By Bitget's account, the signer trusted an internal service to tell it the destination and amount.

Policy. Sign a hot-wallet transfer only if it matches a customer withdrawal record or a treasury allowlist entry held somewhere the requesting service can't write to. A compromised request path then can't create its own authority.

Monitoring and response. Reconcile signed transactions against the withdrawal ledger in real time, so a transfer with no matching record raises an alert within seconds.

‍

2. Check parameters against what your pipeline would produce

The gap. Requests carried round gas limits that bypassed estimation, and nothing in the request path appears to have compared them with what the pipeline would have set.

Policy. Reject any request whose fields differ from the values your own pipeline would generate for it. On Bitget 6, the only native ETH sends with a 200,000 gas limit were the attacker's, so a check of this kind would have passed customer withdrawals and flagged the 0.84 ETH test at 18:31:11. Sub-threshold test transfers to never-seen addresses are worth an alert of their own.

‍

3. Cap velocity on low-volume tiers

The gap. Low-volume warm wallets sent large transfers on five networks within nine seconds.

Policy. Set outflow limits per time window for each wallet tier and require a second approval above them. A warm-tier cap could have held back most of the $202.8M that left at 19:16, since $139.9M of it was a single XRP transfer.

‍

4. Connect alerts to an automatic pause

The gap. Signing continued for 2h 52m after the first unauthorised transfer.

Monitoring and response. Wire any of the alerts above to pause the affected signer automatically, and give XRPL and Tron wallets the same monitoring as EVM wallets.

Screening & Intelligence. Screen the attacker addresses, which are labelled on Etherscan, and automate freeze decisions. The stablecoins on Ethereum had all been swapped into ETH within 31 minutes of the first large transfer, and none of the ~$88.3M in freezable assets that left Bitget was frozen on its original legs, so a freeze that waits for a manual review arrives after the assets have gone.

‍

The wider pattern

The Bitget theft fits the pattern Hypernative described in Valid Signatures, Invalid Outcomes for Drift, Hyperbridge and KelpDAO: every signature was valid, and nothing checked whether what was being authorised should have been. Exchanges and custodians need to check each transaction against an independent record of what should be signed, before signing and continuously after.

Hypernative's Transaction Guard is built to check transactions before they're signed and executed, Onchain Monitoring & Automated Response to alert and act automatically when an unwanted or malicious transaction is executed onchain, and Screening & Intelligence to let bridges, issuers and exchanges screen counterparties against known attacker addresses.

Reach out for a demo of Hypernative's solutions, and follow Hypernative's blog and social channels for the latest on Web3 security. Secure everything you build, run and own in Web3 with Hypernative.

Proactive security for onchain finance. Website | X (Twitter) | LinkedIn

‍

Stay ahead of the curve, subscribe for the latest in Web3 security