# Orbit Chain bridge: forged signatures drain $81M vault

Orbit Bridge withdraw() lacked token/balance validation and signature-to-data binding, letting attacker forge signatures and drain ~$81M in WBTC, ETH, USDT, USDC, DAI.

- Payout: Real-world hack
- Severity: critical
- Program: OrbitChain
- Analysis by: DeFiHackLabs
- Disclosed: 2024-01-01
- Write-up quality: 7/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2024-01/OrbitChain_exp.sol
- Library page: https://bugbountylibrary.com/r/dhl%3A20240101-orbitchain
- Tags: area:web3 domain:web3 impact:funds-loss impact:mass-exploit kind:incident platform:defihacklabs sev:critical tech:evm tech:solidity technique:source-review vuln:access-control vuln:business-logic vuln:signature-replay

**Target:** EVM bridge vault withdraw() and _validate() signature logic
**Root cause:** withdraw() never validated the token parameter, msg.sender authorization, or that amount <= vault balance; _validate() checked signers are owners but not that signatures bound to the withdrawal data, nor enforced a signature threshold.
**Steps:**
1. Attacker deposits small WBTC via Uniswap to Orbit to obtain a valid depositId/context.
2. Craft withdraw() call to OrbitEthVault (0x1Bf68A...) with arbitrary token=WBTC, amount=23087.9 WBTC, fromChain='ORBIT', toAddr=attacker.
3. Supply bytes32s=[sha256(hub,chain,vault), fakeOrbitTxHash] and 7 fabricated v/r/s signatures that pass owner-signer check without binding to data.
4. Call withdraw(hub, 'ORBIT', abi.encodePacked(attacker), attacker, WBTC, bytes32s, uints, '', v, r, s).
5. Vault transfers WBTC to attacker; repeat across tokens (USDT, USDC, DAI, ETH) draining ~$81M.
**How found:** Analysis of the withdraw/_validate logic: signatures validated only for owner identity, not bound to withdrawal payload, and no threshold or balance/token checks — enabling arbitrary forged withdrawals.
**Exploitation:** Attacker pre-funded a small deposit to get a valid depositId, then submitted withdraw() with forged signatures (valid owner keys but not bound to withdrawal details) and no threshold enforcement, specifying arbitrary token and amount exceeding vault balance; vault transferred funds directly to attacker across multiple txs (0x958aee, 0xe0bada, 0x64a6f4, 0x639d27).
**Escalation:** Repeated the same primitive across multiple tokens in the vault (USDT $30M, DAI $10M, USDC $10M, 231 WBTC ~$10M, 9,500 ETH ~$21.5M), laundering via intermediaries and receivers.
**Insight:** In bridge vaults, verify that the signed digest commits to the full withdrawal tuple (token, amount, recipient, chain, depositId) and that the signer count meets threshold; also enforce token whitelist and amount <= vault balance before transfer.
