Skip to content
Five identical validator signature keys emerging from a single compromised red enclosure, together opening a bridge gate as teal value drains across the span into one dark vault
exploitsJuly 24, 20263 min read

AFX Trade $24.15M Bridge Exploit: Compromised Validator Keys Signed a Valid Drain

Dmitry Serdyuk
Dmitry SerdyukCo-Founder & CDO

Updated on July 24, 2026

TL;DR

On July 22, 2026, the third-party bridge operated by AFX Trade, an Arbitrum-based perpetuals venue, was drained of 24,150,000 USDC. Five of the bridge's hot validator keys signed a withdrawal, that signature set cleared the roughly two-thirds consensus the contract requires, the request sat through a short challenge period untouched, and the bridge paid out. The attacker moved the USDC to Ethereum and swapped it for roughly 12,467 ETH, which sits in a single wallet. Security firm Blockaid flagged the incident near 21:30 UTC and put the failure down to operational security. The on-chain verification behaved exactly as designed. That is the whole problem: a bridge whose validators all answer to one operator is a multisig in a trustless costume.


What Actually Happened to AFX Trade?

AFX Trade ran its own bridge to move USDC between Arbitrum and Ethereum, an operator-run system with its own validator set, separate from Arbitrum's native bridge. On July 22 an attacker produced a withdrawal for 24,150,000 USDC and got it approved through that validator set. The funds left the reserve, crossed to Ethereum, and were converted to roughly 12,467 ETH.

Look at the count of signatures: five. Five of the bridge's hot validator signatures met the roughly two-thirds validator consensus the contract requires before it releases funds. The signatures were genuine. The quorum math was real. The contract checked the signatures, counted the weight, waited out a 200-second challenge period, and did what a correct bridge does when a valid quorum asks for money.

Steven Goldfeder of Offchain Labs was quick to draw the line publicly: the Arbitrum native bridge "has not been hacked or exploited in any way," and the breach originated in a third-party protocol. He is right, and the distinction matters for anyone working out what to fix. Nothing in Arbitrum's own settlement path was involved. The exposure sat entirely in how AFX held its signing keys.


Why Did the Bridge Approve a Theft?

A bridge validator is a signer. It watches for a deposit or a withdrawal request, decides the request is legitimate, and signs. Collect enough signatures by weight, and a contract on the other side releases the corresponding funds. The security assumption is simple: an attacker cannot forge enough independent signatures to reach quorum. Break that assumption and quorum stops defending anything. It still counts to two-thirds, and it still approves.

That is what broke here. The signatures came from the real keys. Whoever moved the funds was in possession of enough of AFX's validator signing material to reach two-thirds on their own. The contract cannot tell a compromised key from an honest one. A signature is a signature. The verification you audit on-chain assumes the private keys are held by the parties you trust, and it says nothing about whether that assumption still holds at 21:30 on a Wednesday.

Public reporting has not said how large the validator set is in total, so the exact concentration, five of how many, is not on the record. What is on the record is that five was enough. The uncomfortable part is how little independence those five actually bought. If those keys live in the same operator's infrastructure, on the same hosts, reachable through the same access path, then a single intrusion collapses all five into one. One custody perimeter, five copies of the same failure inside it. Quorum was built to survive a dishonest minority, and most operator-run bridges are exposed to something else entirely: one intruder reaching every signer at once.


The Attack, Step by Step

The path ran straight from key access to a single ETH wallet, so a table shows it more clearly than a diagram would.

StepActionWhat it relied on
1Attacker obtains enough AFX validator signing keys to reach quorumOperator-held hot keys, method not publicly confirmed
2Crafts a withdrawal for 24,150,000 USDC from the bridge reserveThe bridge lets a valid quorum move any amount, no per-tx or rate cap
3Five hot validator signatures approve the requestTwo-thirds consensus satisfied by keys under one perimeter
4Request enters the roughly 200-second dispute windowNo independent watcher challenges it in time
5Bridge contract releases the USDC on-chainVerification passes: real signatures, real quorum
6Funds bridged from Arbitrum to EthereumStandard cross-chain movement
7USDC swapped for ~12,467 ETH into a single walletLiquidity available, no freeze in place

Step 4 is the one defenders should stare at. There was a window of about 200 seconds, and it existed precisely so a bad withdrawal could be challenged before settlement. Nobody challenged it. Whether anyone at AFX was even positioned to challenge it inside 200 seconds is one of the things the public record still does not say.


The Root Cause: Operator Keys Are the Whole Attack Surface

Strip away the cross-chain vocabulary and AFX ran a hot multisig over its reserve. The bridge framing makes it sound like distributed trust. In practice the trust collapsed to one question: can an attacker reach the private keys that produce a quorum? Once the answer was yes, everything downstream, the signatures, the two-thirds check, the dispute window, the settlement, executed faithfully in the attacker's favor.

None of the public reporting identifies how the keys were taken, and no technical postmortem from AFX had appeared as of this writing. Treat the specific method as unconfirmed. What is confirmed is the shape: valid signatures, satisfied quorum, correct settlement. Blockaid's read, that this belongs in the operational security column, fits every observable fact. Worth noting what is still missing: Blockaid flagged the drain close to 21:30 UTC, but what tripped its alert has never been made public. In a story about monitoring, that is the one detail most worth having, and nobody has published it. Key-compromise attacks are patient. An intruder can hold privileged access for weeks or months, learning the signing flow, before they ever move a dollar. By the time the withdrawal hit the chain, the interesting part of this attack was probably already weeks old.

This is the same failure class as the Humanity Protocol key compromise, where a signer, not the code, was the breach. It rhymes with SquidRouter's module exploit, where a Safe module moved funds without a single owner signature because the authority delegated to it was never as constrained as it looked. And it sits next to the Kelp DAO bridge incident, where a single trusted cross-chain configuration turned into a single point of loss. All three belong with the human factor, where the decisive weakness sat in people and process.


Why This Keeps Happening to Bridges

Bridges concentrate value and concentrate trust, which is why they keep topping the loss tables. AFX did not lose money in isolation. Within about seven hours the Verus Ethereum bridge was drained of $7.54M in a separate attack, pushing the two-bridge total past $31M in a single window. Different bridges, different failures, same lesson: the perimeter around cross-chain custody is thinner than the marketing implies.

Teams treat a clean audit as a finish line, and that belief is the one worth arguing with. An audit certifies the code you showed it, on the day you showed it. It verifies that a valid quorum releases funds and that an invalid one does not. It cannot certify who holds the keys tomorrow, whether those keys share a host, or whether an operator's laptop is one phishing email from signing authority. AFX's contract, as far as anyone has shown, did its job. The audit surface and the breach surface never overlapped.

Audits still matter. They simply cannot cover a signed, valid, quorum-approved withdrawal of an entire reserve, which is a first-class threat that lives outside the code and has to be defended outside the code.


How Should Operators Defend Operator-Run Bridges?

The controls here are custody and runtime, not another pass over the Solidity. In priority order:

  1. Split the keys so one event cannot reach quorum. Independent signers on independent infrastructure, different hosts, different operators, ideally different organizations. Hardware-backed keys (HSM or MPC/threshold signing) so no single machine ever holds a signing key in usable form. Five signatures are only worth five if they can fail independently. Design them to.

  2. Cap what a valid quorum can move. A bridge that lets any approved withdrawal drain the full reserve has no circuit breaker. Enforce a per-transaction ceiling and a rolling withdrawal-rate limit on-chain, sized to normal flow. A request for the entire reserve should be structurally impossible in one shot, quorum or not.

  3. Make the dispute window a real control, not a countdown. The 200 seconds only helps if an independent watcher can see an anomalous withdrawal and challenge it inside the window. Wire automated monitoring to the pending-withdrawal event, alert on any withdrawal above a sane threshold or above the rolling limit, and give an on-call human or an automated guardian the authority to trigger the challenge. Nobody was watching this one.

  4. Instrument the signing flow itself. Alert on validator signatures produced outside expected hosts, times, or request patterns. Key-compromise attacks spend weeks in the environment before the drain. That is weeks of faint signals: a new signing origin, an off-hours request, a validator behaving unlike its peers. Those are catchable if anyone is looking.

  5. Assume the keys will leak and rehearse the response. Pre-stage the freeze path, the pause authority, the exchange and law-enforcement contacts, and the postmortem template before you need them. AFX reportedly offered the attacker a 30% bounty to return the rest, which is the negotiating position of a team that had no faster lever to pull.

Honest scope on our end. An audit would not have caught this. The contract did what it was written to do, and a more careful review would have returned the same clean result. Runtime monitoring is the layer with a chance here: watching the pending withdrawal inside that 200-second window, and alerting the moment a quorum-approved transfer runs past normal flow, is the on-chain surface Tripwire, our runtime monitoring layer, covers. The other half of this problem, spotting a signature produced from an unfamiliar host at an odd hour, sits inside the operator's own infrastructure and needs their access logging and endpoint tooling, not ours. We can watch the chain. We cannot watch someone else's laptops.

We also will not pretend monitoring guarantees a save on a 200-second window against a prepared attacker. It does not. It converts a silent, instant, total loss into an event somebody has a chance to interrupt.

What to watch from here: the ETH still sits in one wallet, and AFX has not published a technical account of how its keys were reached. Until it does, every other team running a bridge on operator-held keys has no way to check whether the same door is open on their side.


Frequently Asked Questions

How much did AFX Trade lose? 24,150,000 USDC, about $24.15 million, taken from AFX's operator-run bridge on Arbitrum on July 22, 2026. The attacker moved the funds to Ethereum and swapped them for roughly 12,467 ETH.

Was the Arbitrum bridge hacked? No. The Arbitrum native bridge was not involved. The breach hit a separate third-party bridge that AFX operated with its own validator set. Offchain Labs confirmed the native bridge was not exploited.

Was this a smart-contract bug? No evidence of one. The signatures were genuine, the two-thirds consensus was met, and the contract released the funds as designed. Blockaid characterized it as an operational security failure, meaning the point of compromise was the validator signing keys. AFX had not published a technical postmortem confirming the exact intrusion method as of this writing, so treat that detail as unconfirmed.

Could an audit have prevented it? An audit reviews the code, and the code behaved correctly here. Preventing this needs key-custody hardening (independent hardware-backed signers), on-chain withdrawal caps and rate limits, and runtime monitoring wired to the dispute window and the signing flow.

Were the funds recovered? Not at the time of reporting. The stolen value was consolidated into a single Ethereum wallet as ETH, and AFX was reported to have offered the attacker a 30% bounty to return the remainder.


Sources / References

Dmitry Serdyuk
Dmitry Serdyuk

Co-Founder & CDO

Full-Stack Operator | Building across security, AI, and digital infrastructure.