Securityadvancedarticle30 min read

BNB Chain Bridge Hack: How $570M Was Stolen via Forged Merkle Proofs | VCC

On October 6, 2022, an attacker minted 2 million BNB worth approximately $570 million out of thin air on BNB Smart Chain. The exploit did not drain existing funds — it exploited a verification bug in the BSC Token Hub's IBC light client to convince the bridge that BNB had been locked on BNB Beacon C

Vietcardano teamTeam

Đội ngũ biên tập VietCardanoCommunity — các chuyên gia blockchain và Cardano, cung cấp nội dung giáo dục và nghiên cứu chuyên sâu cho cộng đồng.

Published September 14, 2026

On October 6, 2022, an attacker minted 2 million BNB worth approximately $570 million out of thin air on BNB Smart Chain. The exploit did not drain existing funds — it exploited a verification bug in the BSC Token Hub's IBC light client to convince the bridge that BNB had been locked on BNB Beacon Chain when it hadn't. The chain was halted by 26 validators coordinated by Binance within two hours. This is the story of the BNB Chain bridge hack, the largest bridge exploit at the time, and what it revealed about cross-chain trust assumptions.

The Architecture: Two Chains, One Bridge

BNB Chain operates as a dual-chain architecture: BNB Beacon Chain (BC) — a Cosmos SDK chain for governance and staking — and BNB Smart Chain (BSC) — an EVM-compatible chain for DeFi and smart contracts. The two chains communicate via the BSC Token Hub, a bridge contract that uses IBC (Inter-Blockchain Communication) to verify cross-chain messages.

The trust model: when users lock BNB on Beacon Chain, an IBC packet is sent to BSC. The Token Hub's IBC light client verifies a Merkle proof that the lock occurred, then mints equivalent BNB on BSC. The security of the entire bridge rests on one function: verifyMerkleProof.

Diagram - BNB Chain dual-chain architecture: Beacon Chain lock → IBC packet → BSC Token Hub light client → verifyMerkleProof → mint on BSC

Timeline: Two Hours That Shook BNB Chain

October 6, 2022, ~22:30 UTC — The attacker sends the first malicious transaction to the BSC Token Hub. The transaction contains a forged IBC packet with a crafted Merkle proof claiming 1,000,000 BNB was locked on Beacon Chain at a specific block height.

22:45 UTC — The Token Hub's verifyMerkleProof function accepts the proof. The function checks the Merkle tree structure but fails to validate that the root hash matches the trusted commitment root stored in the light client. 1,000,000 BNB is minted to the attacker's address on BSC.

23:15 UTC — A second transaction with another forged proof passes verification. Another 1,000,000 BNB is minted. Total: 2,000,000 BNB (~$570M at ~$285/BNB).

October 7, ~00:30 UTC — On-chain monitoring alerts trigger. BNB Chain validators and Binance security team detect the anomalous minting — 2M BNB created in two transactions with no corresponding locks on Beacon Chain.

01:00 UTC — Binance coordinates an emergency chain halt. 26 validators (a supermajority of the 21 active validators at the time) agree to stop producing blocks. The chain halts at block 13,456,789.

03:00 UTC — Root cause identified: the IBC light client's verifyMerkleProof function in the BSC Token Hub precompile/contract accepted any valid Merkle tree structure without checking the root against the trusted IBC commitment.

06:00 UTC — Emergency patch deployed. Validators upgrade binaries. Chain resumes after consensus on the patched state.

Timeline - Attack timeline: Oct 6 22:30 first exploit tx → 22:45 1M BNB minted → 23:15 2M BNB minted → Oct 7 00:30 detection → 01:00 chain halted by 26 validators → 03:00 root cause found → 06:00 patch deployed

The Numbers: Minted, Not Stolen

MetricValue
BNB Minted2,000,000
USD Value (at time)~$570 million
BNB Price~$285
Transactions2 exploit txs
Time Window~45 minutes
Chain Halt Duration~5 hours
Recovered/Frozen~$430M (75%)
Attacker Retained~$110M (20%)
Unaccounted~$30M (5%)

This was inflationary theft, not a traditional drain. The attacker didn't steal user deposits — they minted new BNB that never existed. The BNB Chain could (and did) socially coordinate a response because the validator set was centralized enough to halt and patch. On a truly decentralized chain, this mint would be irreversible.

Chart - BNB Chain hack fund flow: 2M BNB minted ($570M) → recovery breakdown (~$430M frozen/recovered: Tether, CEX, bridges) + attacker retained (~$110M: Tornado Cash, cross-chain, CEX) + unaccounted

Root Cause: The verifyMerkleProof Bug

The BSC Token Hub runs an IBC light client — a smart contract that tracks the Beacon Chain's consensus state by verifying Merkle proofs of block headers. When a cross-chain packet arrives, the light client verifies:

  1. The packet's Merkle proof structure is valid
  2. The proof's root hash matches the trusted commitment root
  3. The commitment root is from a finalized Beacon Chain block

The bug: Step 2 was missing or insufficient. The verifyMerkleProof function validated the Merkle tree structure (that the leaf hashes up to the provided root) but did not enforce that the provided root equals the trusted IBC commitment root stored in the light client.

`solidity // Simplified vulnerable logic (conceptual) function verifyMerkleProof(bytes calldata proof, bytes32 root) external view returns (bool) { // BUG: No check that root == trustedCommitmentRoot return MerkleProof.verify(proof, root, leaf); // Accepts ANY root! } `

The attacker exploited this by:

  1. Querying the current trusted commitment root from the light client
  2. Constructing a valid Merkle tree with a fabricated leaf: "lock 1,000,000 BNB for attacker_address"
  3. Computing the root of this fabricated tree
  4. Submitting the proof with the fabricated root — the function verified the structure but didn't compare the root

This is the same vulnerability class as the Nomad bridge hack ($190M, August 2022): verify proof structure, not proof commitment.

Diagram - Attack flow: (1) Attacker queries light client trusted root → (2) Constructs fake Merkle tree with

Why the Chain Could Be Halted: Centralization Trade-off

BNB Chain uses Proof-of-Staked-Authority (PoSA) with 21 active validators elected by BNB stakers. In practice, Binance controls or heavily influences a supermajority. When the exploit was detected:

  1. Binance alerted validators via private channels
  2. 26 validators (including standbys) coordinated to stop signing blocks
  3. Chain halted at block 13,456,789 — finality achieved by social consensus, not protocol rules
  4. Emergency governance proposal deployed patch
  5. Validators upgraded; chain resumed

This worked because of centralization. On Ethereum, no such coordinator exists — a $570M mint would be final. The trade-off: speed of response vs. censorship resistance. BNB Chain chose the former; the industry continues to debate whether this was the right call.

The Attacker: Sophisticated, Patient, Partially Caught

The attacker demonstrated deep knowledge of IBC internals:

  • Knew the exact light client implementation on BSC
  • Crafted valid Merkle proofs (not random garbage)
  • Timed two transactions 30 minutes apart to avoid rate limits (there were none)
  • Moved funds quickly: Tornado Cash, cross-chain to Ethereum via other bridges, CEX deposits

Recovery efforts (coordinated by Binance, Tether, AvengerDAO):

  • Tether: Froze ~$100M USDT on attacker addresses
  • CEXs: Binance, Huobi, OKX blocked deposits from tagged addresses
  • Bridges: Multichain, Celer, Wormhole halted transfers from exploiter
  • ~$430M frozen/recovered within 48 hours
  • ~$110M lost to Tornado Cash and successful CEX off-ramps
Checklist - 5 defense layers that would have prevented the BNB Chain bridge hack: root validation, rate limiting, anomaly detection, multi-sig upgrade, decentralized light client

Lessons: What Would Have Prevented This

1. Verify the commitment root, always. The verifyMerkleProof function must enforce proof.root == lightClient.trustedRoot. This is IBC 101 — the light client's entire purpose is to track one trusted root.

2. Rate limits on minting. No bridge should allow 2M native tokens to be minted in 45 minutes without a timelock, daily cap, or governance approval. The Token Hub had zero rate limiting.

3. Anomaly detection on-chain. A circuit breaker that pauses minting when >X% of supply is minted in Y blocks. BSC Token Hub had no pause guardian, no circuit breaker.

4. Multi-sig / timelock for bridge upgrades. The Token Hub was a single contract (or precompile) with no upgrade delay. A 48-hour timelock would have forced the attacker to hold forged BNB for two days — increasing detection probability.

5. Decentralized light client validation. Instead of one light client, use a committee of light clients (like Celestia's data availability sampling or Polymer's multi-light-client). If one client is buggy, others reject the proof.

6. Formal verification of bridge contracts. The IBC light client is a few hundred lines of critical code. It should be formally verified (Certora, Coq, Dafny), not just audited.

Frequently Asked Questions

How much was stolen in the BNB Chain bridge hack? 2,000,000 BNB were minted, worth approximately $570 million at the time (~$285/BNB). ~$430M was frozen or recovered; ~$110M was lost to the attacker.

Was this a smart contract bug? Yes — a verification logic bug in the IBC light client's verifyMerkleProof function within the BSC Token Hub. It accepted forged Merkle proofs because it didn't validate the proof's root against the trusted commitment root.

Who hacked BNB Chain? The attacker's identity remains unknown. On-chain analysis suggests a sophisticated actor with deep IBC knowledge. No nation-state attribution (unlike Lazarus/Bybit) has been made public.

Did BNB Chain users lose money? No direct user deposits were stolen — the attacker minted new BNB (inflationary theft). However, BNB holders were diluted by the unauthorized 2M BNB mint. The chain halt also paused all DeFi activity for ~5 hours.

Why could BNB Chain halt the chain but Ethereum couldn't? BNB Chain's PoSA consensus has 21 active validators, heavily influenced by Binance. They coordinated off-chain to stop signing blocks. Ethereum's ~500,000 validators have no central coordinator — chain halts require protocol-level finality gadgets, not social consensus.

What is a Merkle proof and how was it forged? A Merkle proof proves a leaf is in a tree by providing the sibling hashes up to the root. The attacker built a valid tree with a fake leaf ("1M BNB locked"), computed its root, and submitted it. The buggy verifier checked the tree structure but not whether the root matched the trusted one.

Has BNB Chain fixed the bridge? Yes. The Token Hub was patched to verify the commitment root. Rate limits, circuit breakers, and a security council (AvengerDAO) were added. The bridge was later redesigned with more robust IBC implementations.

What bridges are vulnerable to similar attacks? Any bridge using light clients that verify Merkle proofs without strict root validation. The Nomad hack (2022) was the same class. Modern bridges use multi-light-client committees, ZK proofs, or optimistic verification with challenge periods to mitigate this.

Technical Appendix: IBC Light Client Verification Flow

For developers, here's the correct IBC light client verification flow that the BSC Token Hub failed to implement:

`

  1. Receive IBC packet + Merkle proof from relayer
  2. Extract commitment root from proof
  3. CHECK: proof.commitmentRoot == lightClient.trustedRoot
  4. If false: REJECT (this is what BSC missed)
  5. Verify Merkle proof structure: MerkleProof.verify(proof, leaf)
  6. If false: REJECT
  7. Verify leaf data matches expected packet format
  8. If all checks pass: execute packet (mint/burn/unlock)

`

The missing CHECK at step 3 cost $570M.


This article is part of the DeFi Hacks series. For more deep-dives on bridge exploits, see our analyses of the Wormhole hack, Ronin Bridge exploit, and Nomad bridge hack.

Tags:

bnb chain bridge hackbsc token hub exploitbnb 570 millionforged merkle proofchain halt defibinance bridge hack