Worked example · 2026-05
Verus ⇄ Ethereum Bridge — missing source-amount validation (checkCCEValues) — 2026-05-18
Summary
Verus operates a trust-minimised bridge between the Verus chain and Ethereum. The Ethereum-side contract accepts cross-chain imports authorised by a notary-signed Verus state root: it verifies that a Cross-Chain Export was committed on the Verus side (via a Merkle proof against the notarised root) and that the serializedTransfers blob submitted on Ethereum matches the committed hash, then decodes the blob and releases the corresponding assets from its reserves.
On 2026-05-18, an attacker exploited the fact that the bridge never checked source-side economic backing. Per Blockaid's root-cause analysis, the attack proceeded as follows:
- The attacker constructed a 0.02 VRSC transaction whose
vout[1]was a Verus Cross-Chain Export committing tokeccak(payout_blob)— but with empty source-side totals (totalamounts/totalburned/totalfees). The Verus protocol legally accepts this transaction; nothing on the source side is malformed. - The Verus notaries dutifully signed the resulting state root (8/15 valid signatures — no key compromise, no notary collusion).
- The attacker then called
submitImports()on Ethereum with aserializedTransfersblob whosekeccakmatched the committed hash. The bridge verified the notarised root, the Merkle proof, and the hash binding — all of which were genuinely valid — then decoded the blob and paid out 1,625 ETH + 103.57 tBTC + ~147,659 USDC from its reserves.
The missing check lives in checkCCEValues: the function that should have validated that the export's source-side totals actually back the requested payouts. Blockaid characterises the fix as ~10 lines of Solidity. The attacker swapped the drained assets into ~5,402 ETH; the funds were reported sitting in plain sight on Etherscan, unmoved, shortly after the incident.
Blockaid is explicit about what the incident is not: it is not an ECDSA bypass, not a notary-key compromise, and not a parser or hash-binding bug. Every component the bridge was designed to verify worked correctly. The vulnerability is the absence of a source-amount-conservation check — the bridge trusted the destination-side payout instruction without ever confirming it was backed on the source side.
Why this is structurally significant
T10.002 (Message-Verification Bypass) has, after this case, at least three distinguishable sub-classes that share a downstream primitive (the bridge releases value against a message it should have rejected) but differ entirely in where the verification predicate fails:
Trusted-root-initialisation sub-class (Nomad, 2022-08). A contract upgrade set the trusted root to
0x00, which matched the sentinel for "untrusted". The verification function consequently accepted every message. The flaw was in the initialisation of verification state.Signature/account-validation sub-class (Wormhole, 2022-02). A deprecated signature-verification path on the Solana side did not validate the guardian-account address, allowing a forged VAA. The flaw was in who the proof was checked against.
Economic-value-binding sub-class (Verus, this case). Every cryptographic check — signatures, Merkle proof, hash binding — passed. The flaw was that none of those checks bound the payout to the source-chain economic totals that were supposed to fund it. The proof was valid; what the proof committed to was economically empty. This is the conservation-invariant sub-class: the bridge verified message authenticity but not message solvency.
The three sub-classes have different detection loci. Nomad's lives at the post-upgrade smoke-test layer (simulate an invalid message after every upgrade). Wormhole's lives at the pre-deployment audit of the signature-verification path. Verus's lives at the invariant-specification layer: the auditor must articulate and verify the cross-chain conservation invariant (sum of destination payouts ≤ sum of source burns/locks for the same export), which is a semantic property of the bridge, not a structural property of any single proof. This is the hardest sub-class to catch in audit because every line of verification code is individually correct — the defect is a missing line, and the missing line encodes a protocol-level economic invariant rather than a local correctness property.
Timeline (UTC)
| When | Event | OAK ref |
|---|---|---|
| Pre-2026-05-18 | Verus ⇄ Ethereum bridge operates legitimately; Ethereum-side contract verifies notarised Verus state roots, Merkle proofs, and keccak256(serializedTransfers) == hashReserveTransfers hash binding on each import |
(standing T10.002 surface) |
| 2026-05-18 (~14h pre-exploit) | Attacker EOA 0x5aBb91…5777 funded with 1 ETH via Tornado Cash |
(pre-attack funding / opsec signal) |
| 2026-05-18 | Attacker constructs a 0.02 VRSC transaction whose vout[1] is a Cross-Chain Export committing to keccak(payout_blob) with empty source-side totalamounts / totalburned / totalfees; Verus protocol legally accepts it; notaries sign the state root (8/15 valid) |
T10.002 execution (source-side commitment to an unbacked export) |
| 2026-05-18 | Attacker calls submitImports() on Ethereum with a serializedTransfers blob matching the committed hash; bridge verifies root + Merkle proof + hash binding (all valid), decodes blob, releases 1,625 ETH + 103.57 tBTC + ~147,659 USDC from reserves |
T10.002 execution (destination-side payout against unbacked message) |
| 2026-05-18 | Attacker swaps drained assets into 0x65Cb8b…25F9 |
T5 outflow / staging |
| 2026-05-18 | Blockaid identifies the exploit and reports it on X with root-cause analysis (missing source-amount validation in checkCCEValues); PeckShield independently confirms the ~$11.58M figure |
(third-party detection / forensic surface) |
What defenders observed
- Pre-event (verification-predicate layer): the bridge's import-verification path verified message authenticity (notary signatures, Merkle proof) and message integrity (hash binding) but contained no source-side conservation check.
checkCCEValuesdid not validate that the export'stotalamounts/totalburned/totalfeesbacked the requested payouts. This was a standing T10.002 surface from deployment. Defender lesson: a bridge's verification suite must include a solvency invariant, not only authenticity and integrity checks — "the message is genuine and well-formed" is necessary but not sufficient; "the message is backed on the source side" is the missing predicate. - At-event (on-chain signal): a
submitImports()call released 1,625 ETH + 103.57 tBTC + ~147,659 USDC against a source-side export whose committed totals were empty. A bridge-monitoring indexer enforcing the conservation invariant (destination payout vs source-export totals for the same export ID) would have flagged the payout in real time. The disproportion between the ~$10 VRSC source-side cost and the ~$11.58M destination payout is itself the signal. - At-event (funding signal): the attacker EOA was funded with exactly 1 ETH via Tornado Cash ~14 hours before the exploit. A fresh, mixer-funded EOA interacting with a bridge's privileged import path is an elevated-risk pattern, though not by itself actionable (it is a common, legitimate privacy pattern as well).
- Post-event: the drained assets were swapped into ~5,402 ETH and reported sitting unmoved on Etherscan, consistent with a staging position rather than an immediate laundering chain. The Verus team had not publicly confirmed the incident at the time of initial third-party reporting — detection and disclosure were driven by Blockaid and PeckShield, not first-party telemetry.
What this example tells contributors writing future Technique pages
- T10.002 needs a documented economic-value-binding sub-class. Existing canonical cases (Nomad trusted-root-init, Wormhole signature-account validation) both fail at a structural verification step. Verus fails at a semantic one: every structural check passes, but no check binds the payout to source-side economic backing. Contributors should record which sub-class a new T10.002 case belongs to, because the audit and detection guidance diverges entirely.
- "Verified everything it knows how to verify" is a distinct failure mode from "verification was bypassed." In Nomad and Wormhole the verification predicate was defeated; in Verus the verification predicate was incomplete. Forensic write-ups that describe Verus as a "verification bypass" obscure this — Blockaid's framing ("NOT a parser/hash-binding bug; IS a missing source-amount validation") is the precise one and should be preserved.
- The conservation invariant is the load-bearing audit property for reserve-backed bridges. Any bridge that releases assets from a reserve against a cross-chain instruction must verify that the instruction is backed by an equal-or-greater source-side burn/lock for the same transfer. This is a protocol-economic invariant, not a local-correctness one, and is the kind of property most likely to be missing precisely because every individual line of verification code looks correct.
- Cost-to-extraction ratio is a structural signal worth recording. Verus: ~$10 input → ~$11.58M output. The near-zero attacker cost is diagnostic of a value-binding gap (the attacker mints authorisation for free on the cheap source side) rather than a key-compromise or social-engineering vector (which carry real acquisition cost). The ratio belongs alongside notional-vs-realised loss as a T10 structural metric.
Public references
[blockaidverus2026]— Blockaid (@blockaid_) root-cause thread on X, 2026-05-18: source↔destination economic-value-binding gap; missing source-amount validation incheckCCEValues; same class as Wormhole-2022 / Nomad-2022.[theblockverus2026]— The Block, "Ongoing exploit drains $11.6 million from Verus-Ethereum bridge: Blockaid": https://www.theblock.co/post/401571/verus-ethereum-bridge-exploit[thedefiantverus2026]— The Defiant, "$11.58M Drained in Ongoing Exploit on Verus-Ethereum Bridge": https://thedefiant.io/news/hacks/verus-ethereum-bridge-exploit-11-5-million-ri18bt[beincryptoverus2026]— BeInCrypto, "Crypto Hack Wave Hits Verus Bridge as May DeFi Losses Mount": https://beincrypto.com/verus-bridge-exploit-may-defi-hacks/[bitcoincomverus2026]— Bitcoin.com News, "Crypto Bridge Exploits Hit $328.6M in May as PeckShield Tracks 8 Major Incidents": https://news.bitcoin.com/crypto-bridge-exploits-328-million-may-2026-peckshield/- Attacker EOA:
0x5aBb91B9c01A5Ed3aE762d32B236595B459D5777 - Holding wallet:
0x65Cb8b128Bf6e690761044CCECA422bb239C25F9
Discussion
Verus completes the v0.1 T10.002 reference set by adding the economic-value-binding (conservation-invariant) sub-class alongside Nomad (trusted-root-initialisation) and Wormhole (signature/account-validation). The three cases together establish that "message-verification bypass" is an umbrella for at least three structurally distinct predicate failures, and that the most dangerous of these — the Verus sub-class — is the one in which no individual verification step is wrong. The defect is the absence of a protocol-economic invariant (payouts ≤ source backing) that no single proof encodes.
The case pairs naturally with the April 2026 Hyperbridge incident (examples/2026-04-hyperbridge-merkle-proof-counterfeit-mint.md): both are reserve-/mint-side bridge failures where the cryptographic machinery functioned as designed and the attacker's leverage was a gap in what the verified message was bound to. Hyperbridge's gap was proof-to-message binding (an old valid proof accepted for a different message); Verus's gap is message-to-source-backing binding (a valid message accepted without source-side economic backing). Contributors building out the T10 bridge cohort should treat "binding gaps" — proof-to-message, message-to-source-backing, message-to-origin (CrossCurve, in examples/2026-q1-q2-crosschain-bridge-otc-cohort.md) — as a coherent family of failures distinct from key-compromise (T10.001) and replay (T10.003).
The Blockaid forensic thread is unusually precise for a same-day disclosure: it enumerates exactly what the bridge verified correctly, names the specific function (checkCCEValues) and the missing predicate, sizes the fix (~10 lines), and explicitly rules out the failure modes the incident is not. PeckShield's independent confirmation of the ~$11.58M figure satisfies the v0.1 standard of triangulation across at least two independent forensic providers.