Securityadvancedarticle30 min read

Poly Network Hack Analysis: $611M and the White Hat Who Returned It All | VCC

On August 10, 2021, a single attacker siphoned approximately $611 million from Poly Network — then the largest crypto hack in history — without breaking any cryptography. The attacker did not forge a signature or crack a private key. They sent a carefully crafted cross-chain message that convinc

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 August 10, 2021, a single attacker siphoned approximately $611 million from Poly Network — then the largest crypto hack in history — without breaking any cryptography. The attacker did not forge a signature or crack a private key. They sent a carefully crafted cross-chain message that convinced Poly Network's Ethereum contract to replace its own trusted Keeper key with theirs. From that moment, the attacker became the trusted authority and instructed the protocol to unlock hundreds of millions of dollars to three attacker-controlled wallets on Ethereum, BSC, and Polygon. Thirteen days later, after an on-chain negotiation conducted entirely through Ethereum transaction messages, the attacker returned nearly every dollar and published the private key to the last locked vault. No major DeFi hack before or since has ended so completely — or so strangely.

What Poly Network Does and Why It Was a Juicy Target

Poly Network is a cross-chain interoperability protocol launched in 2020 by a team linked to Neo and Ontology. Its pitch was simple: let a user lock tokens on Chain A and unlock equivalent tokens on Chain B, without going through a centralized exchange. Under the hood, Poly operated a lock-and-unlock bridge — smart contracts on each supported chain (Ethereum, BSC, Polygon, Neo, Ontology, Zilliqa, and others) coordinated by a relay system that verified cross-chain messages.

By August 2021, Poly held roughly $610 million in total value locked across its bridge contracts. Three properties made it an unusually attractive target. First, it was cross-chain — a successful exploit on one chain's verification logic could be replayed across many chains in minutes. Second, it was custodial in the worst way — user funds sat in lock-proxy contracts that obeyed a single Keeper's authority. Third, it was young — deployed quickly during the 2020–2021 DeFi boom, audited once, and handling volume that had grown 10x in a few months.

Diagram - Poly Network bridge architecture: lock proxies on Ethereum/BSC/Polygon, Poly relayer with Keeper pubkey, and the attacker overwrite path that replaced the Keeper

Timeline: 13 Days From Heist to Happy Ending

The entire saga — theft, negotiation, and recovery — unfolded in less than two weeks, with every twist visible on-chain.

August 10, 2021, ~17:00 UTC — The attacker executed roughly 15 forged cross-chain transactions across Ethereum, BSC, and Polygon. In about 30 minutes, ~$273 million left Ethereum, ~$253 million left BSC, and ~85 million USDC left Polygon. Poly Network tweeted within an hour, published the three attacker addresses, and asked every miner and exchange to blacklist the tainted funds. Tether froze $33 million in USDT minutes later — the first concrete proof that cashing out would not be trivial.

August 11, 00:00–06:00 UTC — An anonymous account claiming to be the hacker posted an on-chain message: "ready to return the funds." Poly Network published three return wallet addresses (one per chain) and asked the attacker to use them. Within hours, roughly $342 million — about half the loot — appeared in those wallets: $256 million on BSC, $3.3 million on Ethereum, and $85 million on Polygon.

August 11–12 — The remaining ~$268 million stayed in a 2-of-2 multisig that required passwords from both Poly and the attacker. Neither side could move it alone. Poly announced a $500,000 bug bounty and offered the attacker a job as Chief Security Advisor — both declined with a terse "not interested, I never responded to Poly."

August 12–18 — Both sides negotiated through messages embedded in Ethereum transaction input data — a plaintext chat room visible to the entire internet. Poly pleaded for the private key. The attacker embedded philosophical asides, denied profit motives ("I did it for fun"), called the situation "a funny game," and at one point threatened to delay the return. Meanwhile, the attacker deposited stolen DAI and USDC into Curve.fi on Ethereum (three failures due to revert/slippage, success on the fourth) and ~$119 million into Ellipsis Finance's 3EPS pool on BSC — testing whether DEX liquidity offered a cash-out path.

August 19 — Poly sent 160 ETH (~$480,000) to the attacker address labeled "Poly Network Exploiter 2" — the on-chain bounty, confirmed on Etherscan — despite earlier reports that the attacker "declined" it. The ambiguity (did the attacker solicit it or did Poly push it?) was never fully resolved.

August 23, 2021 (Day 13) — The attacker published the private key for the remaining $141 million (the last locked tranche) via an on-chain message, calling the saga "one of the most wild adventures in our lives" and declaring they were "quitting the show." Poly recovered the final funds and announced that all user assets had been fully recovered — a 100% recovery rate that remains unique among nine-figure bridge hacks.

Timeline - 13-day Poly Network hack timeline from exploit (Aug 10) through partial return, on-chain negotiation, and full recovery (Aug 23)

The Numbers: Where $611 Million Came From and Where It Went

At the time of the hack (ETH ~$3,150, BNB ~$350), the $611 million broke down by chain and by token in a pattern that reveals the attacker’s strategy: target the deepest stablecoin liquidity first.

ChainStolen (approx)Key tokens
Ethereum~$273M (10 token types)ETH (2,858), WBTC (1,032), USDT (~$11M), USDC, DAI (~$16M), UNI, SHIB (~$300M SHIB — illiquid), FEI, etc.
BSC~$253MBUSD, BNB, BTCB, ETH, USDT, USDC — $119M routed to Ellipsis 3EPS pool
Polygon~$85M85,089,719 USDC (single token, cleanest theft)
Total~$611M$610–613M depending on price snapshot

The attacker’s three EOAs and their funding trail tell a second story:

  • Ethereum EOA: 0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963
  • BSC EOA: 0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71
  • Polygon EOA: 0x5dc3603C9D42Ff184153a8a9094a73d461663214
  • Initial funding: privacy coin Monero → exchanged for BNB, ETH, MATIC — the only step that touched opaque rails; everything after was on transparent chains
  • Frozen by issuer: $33M USDT (Tether) — textbook example of centralized stablecoin risk cutting both ways
  • Bounty: 160 ETH (~$480K) sent Aug 19 to exploiter address (Etherscan-confirmed)
  • Final recovery: ~100% — Poly declared “fully recovered” Aug 23 after private-key reveal; no user haircut, unlike Ronin (27% not recovered at the time) or Nomad (~90% not recovered).

A useful contrast: Poly was hacked again on July 1–2, 2023, when an attacker minted $42 billion in paper value across 57 tokens on 11 chains — but because Metis had no BUSD/BNB liquidity and projects like Revomon pulled theirs, only ~$10 million was realizable. The 2021 hack succeeded because the loot was liquid stablecoins; the 2023 attempt failed because it was unbacked inflatables. Same protocol, opposite economics.

Root Cause: A Privileged Function Exposed to an Untrusted Path

The poly network hack was not a zero-day in ECDSA or a reentrancy bug. It was a confused-deputy / access-control failure — a privileged admin function that should only be callable by Poly's own governance was reachable through the untrusted cross-chain message path that any user could trigger.

The Two Contracts That Matter

On Ethereum, Poly’s bridge hinged on two contracts:

  • EthCrossChainManager — the entry point for cross-chain messages. It receives a Merkle-proof-verified header + payload from the source chain, decodes the target method, and calls it via low-level call.
  • EthCrossChainData — storage for consensus state, including the Keeper’s public key — the single key whose signature the Manager trusts to authorize unlocks. The Keeper is the bridge’s root of trust.

The intended flow for a legitimate user bridging 1,000 USDC from BSC → Ethereum was: lock 1,000 USDC on BSC → relayer submits proof to verifyHeaderAndExecuteTx() on Ethereum → Manager decodes unlock(1,000 USDC → user address) → verifies Keeper’s signature → calls unlock proxy → user receives 1,000 USDC.

The Two-Step Exploit

Step 1 — Replace the Keeper. The attacker crafted a cross-chain message whose decoded payload was not unlock(...) but putCurEpochConPubKeyBytes(attackerPubKey) — the function that updates the Keeper key itself. This function is supposed to be an internal admin call invoked only during epoch rotation by Poly governance. But because EthCrossChainManager routed any decoded method to EthCrossChainData without checking whether that method should be cross-chain-callable, the attacker’s message passed header verification (via a forged Merkle proof against a low-difficulty header) and overwrote the Keeper pubkey with their own.

Step 2 — Unlock anything. Now the attacker was the Keeper. They crafted arbitrary unlock messages — “unlock 85,089,719 USDC to 0x5dc3…,” “unlock 2,858 ETH to 0xC8a6…” — signed them with their own key, and the Manager verified the “Keeper signature” successfully. Each forged unlock minted or released real tokens from the lock proxies on the destination chain. Repeating this across Ethereum, BSC, and Polygon took ~15 transactions and ~30 minutes for $611M.

Why This Is Worse Than Stealing a Private Key

Stealing a Keeper’s private key requires phishing, malware, or insider access — it is expensive and noisy. Replacing the Keeper’s on-chain public key via a callable admin function is cheaper than any of those: it costs one transaction fee. The vulnerability existed because Poly violated a cardinal rule of bridge design:

Never let the same data path that carries untrusted user transactions also carry trusted consensus-set updates.

Keeper rotation should require a separate, governance-gated multisig (e.g., 3-of-5 or 5-of-9), not a function reachable through the generic verifyHeaderAndExecuteTx pipeline. Poly’s Keeper at the time was effectively 1-of-1 for that code path — a single storage slot that controlled all unlocks, overwritten with a single call.

Diagram - Poly Network root cause: crafted cross-chain message overwrites Keeper pubkey (step 1), then attacker as Keeper forges arbitrary unlocks across 3 chains (step 2)

Why the Attacker Gave the Money Back

No other nine-figure hack has seen such a complete return, so the motive has been debated more than the exploit itself. Three theses, and the synthesis that fits the on-chain evidence:

Thesis 1 — Trapped by traceability. Within hours, every major exchange, miner, and USDT issuer had blacklisted the three EOAs. Tether’s $33M freeze proved that centralized stablecoin issuers could brick funds unilaterally. The attacker’s Curve and Ellipsis attempts show they tried to cash out through DEX liquidity — and only partially succeeded before slippage, reverts, and the blacklist made further exits infeasible. Returning recasts the actor as white-hat and lowers legal exposure versus laundering tainted funds through mixers that were already under heavy blockchain-analytics surveillance.

Thesis 2 — White-hat from the start. The attacker’s on-chain messages leaned into this framing: “for fun,” “for knowledge,” “to expose bridge risk,” “contribute to Poly’s security.” The initial funding via Monero cuts against pure white-hat (why hide the origin if you plan to disclose?), but is consistent with a gray-hat who wanted the option of disappearing if Poly refused to engage.

Thesis 3 — Game theory of the multisig. The remaining $268M in a 2-of-2 multisig was not a security feature; it was a commitment device. Neither Poly nor the hacker could move the funds alone, forcing communication. Poly’s $500K bounty (≈0.08% of loot) and Chief Security Advisor offer were not economics — they were a signal: “we will publicly treat you as white-hat if you cooperate.” The attacker’s “funny game” delay tested whether Poly would defect (e.g., pursue law enforcement) before committing the final key.

Synthesis (gray-hat, rational, reputation-constrained). The attacker was likely a skilled DeFi-native actor who discovered the keeper-replacement primitive, executed it as a live proof-of-concept, funded the entry with privacy rails to preserve exit optionality, then found — after the blacklist and the Ellipsis/Curve friction — that the risk-adjusted value of keeping $611M in traceable stables was lower than the value of returning it and claiming the white-hat narrative. The 13-day choreography (partial return quickly to signal good faith, multisig lock to force negotiation, staged bounty, final key reveal) matches a rational actor maximizing reputation under traceability constraints better than it matches either pure theft or pure altruism.

The Laundering Attempts That Failed

Unlike Bybit’s Lazarus Group ($1.46B laundered through Thorchain → BTC → Wasabi/Tornado), Poly’s attacker attempted the simplest cash-out — stablecoin → ETH via DEX pools — and hit three walls.

Wall 1 — Issuer freeze. Tether’s blacklist of the attacker’s USDT addresses froze $33M instantly and signaled that USDC (Circle) could do the same. Every stablecoin-heavy theft must solve the “issuer can brick me” problem; Poly’s did not.

Wall 2 — DEX revert risk under blacklist. The attacker’s three failed addLiquidity calls to Curve.fi’s DAI/USDC/USDT pool before the fourth succeeded show that even permissionless DEXes are not frictionless exits when the input tokens are from a globally flagged address — frontends, routers, and MEV bots all add slippage or revert paths that amplify under attention.

Wall 3 — No mixer was used. Notably, the attacker never sent funds to Tornado Cash (then the standard laundering tool). Whether because the amount was too large to mix efficiently, because the white-hat narrative precluded it, or because moving to Tornado would have destroyed the negotiation leverage, the funds stayed in identifiable EOAs — which is precisely what made the full return possible.

This is why DeFi hack recovery rates bifurcate: stablecoin + DEX-exit hacks (Poly 2021) are highly recoverable if caught fast; ETH-native + cross-chain + mixer hacks (Bybit 2025, Ronin 2022) are not.

Diagram - Poly Network fund flow: $611M stolen across 3 chains → issuer freeze, DEX attempts, multisig lock, and full recovery vs 2023 $42B paper hack (only $10M realizable)

Lessons: 5 Defenses That Would Have Stopped the Poly Network Hack

Every major bridge hacked since 2021 — Ronin ($625M, 5/9 validators compromised), Wormhole ($326M, signature verification bypass), Nomad ($190M, copy-paste initialization) — reproduced some variant of Poly’s failure: a single trusted path with insufficient separation between user actions and consensus updates.

Checklist - 5 defense layers: separate keeper-update path, m-of-n multisig, least-privilege keeper, calldata validation, circuit breaker on anomalous volume

1. Separate keeper-update from the user bridge path. putCurEpochConPubKeyBytes must never be reachable via verifyHeaderAndExecuteTx. Keeper rotation should live in a distinct Governor contract callable only by a timelocked governance multisig — not in the same dispatch table as unlock. Poly patched this by moving keeper updates behind a separate admin role; every bridge built after 2022 does the same.

2. m-of-n keeper set, not 1-of-1. A single Keeper pubkey is a single point of failure. Require 5-of-9 or at least 3-of-5 independent validators, on independent infrastructure, in different jurisdictions. Ronin’s later compromise of 5/9 shows this is necessary but not sufficient — but 1-of-1 is never sufficient.

3. Least-privilege keeper. The Keeper should be able to relay a proof, not define who the Keeper is. Separate the “can submit a proof” role from the “can change the proof-verifier” role. No single role should both propose and approve its own successor.

4. Strict calldata validation + formal verification. Cross-chain payloads must be parsed against an explicit allowlist of (targetContract, method, paramSchema). Unknown methods like putCurEpochConPubKeyBytes should revert at the Manager layer before ever reaching EthCrossChainData. Formal verification of the dispatch logic (Certora, Halmos) would have flagged that an admin method was reachable from an untrusted entry point.

5. Circuit breaker on anomalous volume. A single unlock of 85M USDC or $273M on one chain should halt the bridge, not succeed. Threshold-based pausing (e.g., any unlock >$2M or aggregate >$10M/hour triggers timelock + manual review) would have limited the blast radius to one transaction. Poly and successors now implement volume-based halts; bridges that still do not are the next Poly.

Frequently Asked Questions

How much was stolen in the Poly Network hack? Approximately $611 million (often cited as $610–613M depending on the price snapshot on August 10, 2021): ~$273M on Ethereum, ~$253M on BSC, and ~85M USDC on Polygon. It was the largest DeFi hack at the time, later surpassed by Ronin ($625M, March 2022) and Bybit ($1.46B, February 2025).

How did the Poly Network hack work? The attacker crafted a forged cross-chain message that called putCurEpochConPubKeyBytes on EthCrossChainData through EthCrossChainManager.verifyHeaderAndExecuteTx() — a privileged function that updates the Keeper’s public key. Because the Manager did not restrict which methods were callable via the cross-chain path, the attacker replaced the legitimate Keeper key with their own. As the new Keeper, they forged arbitrary “unlock” messages and drained ~$611M across 3 chains in ~15 transactions.

Did the Poly Network hacker return the money? Yes — nearly all of it. The hacker returned ~$342M within 24 hours, and the remaining ~$268M was held in a 2-of-2 multisig requiring both Poly and the hacker. After 13 days of on-chain negotiation, the hacker published the private key for the final ~$141M vault (August 23, 2021), and Poly announced full recovery. The hacker declined a $500K bug bounty and a Chief Security Advisor job offer. Poly confirmed that all user assets were restored.

Who was the Poly Network hacker? The identity has never been publicly confirmed. On-chain messages from the attacker claimed white-hat motives (“for fun,” “expose bridge risk”) and denied seeking profit. Blockchain analysts noted the initial funding via Monero (privacy coin) suggested premeditation to hide origin, while the rapid partial return suggested the attacker realized the funds were too traceable to launder — most likely a skilled gray-hat DeFi actor.

What happened to the $42 billion Poly Network hack in 2023? On July 1, 2023, Poly was exploited again — on paper for $42 billion across 57 tokens on 11 chains. But unlike 2021, most of the minted tokens (e.g., $34B in BUSD/BNB on Metis) had no liquidity backing, and projects like Revomon and OpenOcean removed liquidity to block dumps. Only ~$10M was realizable, held across five EOAs on Ethereum. The attacker did not return funds, and the incident is cited as a failure of paper-value accounting rather than a successful nine-figure theft.

Has anything like the Poly Network hack happened since? Yes — cross-chain bridge hacks became the dominant DeFi vector in 2022: Ronin ($625M, compromised 5/9 validators), Wormhole ($326M, guardian signature bypass), Nomad ($190M, initialization bug allowing anyone to pass verification), and BNB Chain Bridge ($570M, forged Merkle proof). All share Poly’s lesson: bridges concentrate trust, so any access-control flaw on the verification path is catastrophic.

Conclusion

The poly network hack endures not because of its size — it has been surpassed twice — but because of its ending. An attacker stole $611 million with a single storage-slot overwrite, tried to launder it through Curve and Ellipsis, found the transparent blockchain and a $33M issuer freeze had made the loot radioactive, and chose — over 13 days of plaintext negotiation visible to the world — to return it. The technical lesson is crisp: never let an untrusted cross-chain path reach a privileged key-update function, and never guard hundreds of millions with a 1-of-1 Keeper. The human lesson is messier: on a public blockchain, the most effective recovery mechanism turned out to be not cryptography but traceability plus a negotiation channel — a 2-of-2 multisig that forced two adversaries to talk until both could agree the wildest two weeks in DeFi history was, in the attacker’s own words, time to “quit the show.”

Tags:

poly network hackpoly network 611 millionwhite hat hacker deficross chain bridge exploitpoly network hack analysis