Bridge and cross-chain vulnerabilities in disclosed reports

Bridges hold concentrated value and validate messages produced on a chain they cannot themselves verify — the highest-severity surface in the space.

Reports indexed
95
Total paid
$1.8M
Critical
1
Largest payout
$1.8M

A bridge is a message verifier attached to a vault. Everything that has gone wrong with bridges is one of those two halves failing: the verifier accepts a message it should not have, or the vault releases funds the verifier never authorised.

The verifier failures are the interesting ones. Merkle proofs validated against an attacker-supplied root, signature thresholds counted without deduplicating signers, guardian sets rotated without invalidating the old set, and message handlers that check the payload but not the source chain or the source contract.

The vault failures tend to be simpler and just as expensive: mint functions reachable without a corresponding lock, replay protection keyed on a value the attacker chooses, and emergency withdrawal paths whose access control was never revisited after launch.

What reviewers look for

  • Proof verification against a root the caller can influence
  • Signature thresholds that do not deduplicate or order signers
  • Message IDs that are not globally unique across chains
  • Mint authority reachable without a verified lock event
  • Guardian or validator rotation that leaves the previous set valid

Curated highlights

The largest disclosed payouts in this group, with our own summary of each. Every report links back to the original disclosure.

criticalBridge exploitEVM-Solidity$1.8M

Bridge withdrawal proof accepts empty Merkle path

A flawed proof verification mechanism in an L2 canonical bridge contract permitted withdrawal validation using an empty Merkle proof array. When no proof elements were supplied, the verification function failed to iterate and directly compared the unhashed withdrawal leaf against the target root. By matching a fake withdrawal leaf payload with a valid historical or relayable state root, an attacker could forge arbitrary withdrawal events and drain escrowed funds from the bridge.

L2 Canonical BridgeimmunefiJun 2, 2022Open
mediumBridge exploitEVM-Solidity$0

The Graph: If L1GraphTokenGateway's `outboundTransfer` is called by a contract, the entire `msg.value` is blackholed, whether the ticket got redeemed or not

The Graph's L1GraphTokenGateway.outboundTransfer, when bridging GRT to Arbitrum, passes the caller's own address as both the submission-refund and value-refund destination for the underlying retryable ticket. This is harmless for EOA callers because Ethereum and Arbitrum addresses are congruent, but a contract caller (e.g., a multisig) typically has no L2 counterpart able to withdraw the refund, permanently stranding the excess submission fee. The judge ruled this a Medium value-leak (not direct theft), noting the L2 ticket-creation-failure path no longer applies under Arbitrum Nitro but the refund-stranding behavior for contracts remains real.

The Graphcode4renaAug 7, 2026Open
mediumBridge exploitEVM-Solidity$0

Centrifuge Protocol V3.1: Stranded ETH on batched `crosschainTransferShares` call

Centrifuge's VaultRouter exposes a payable crosschainTransferShares function that silently zeroes out msg.value whenever the gateway is in batching mode. In that batched path the gateway is already funded separately, so the router neither forwards nor refunds the attached ETH, leaving it stranded in the router balance with only a privileged, attribution-free sweep as recovery. The condition is reachable through a normal deposit-plus-bridge batch flow, making it a repeatable loss path for users who attach value to what appears to be a benign call. The accepted fix adds an ETHNotAcceptedInBatch guard that reverts whenever batching is active and value is attached, so no ETH can be silently trapped.

Centrifuge Protocol V3.1sherlockNov 17, 2025Open
mediumBridge exploitEVM-Solidity$0

Centrifuge Protocol V3.1: `Gateway.withBatch()` lacks message count validation enabling permanent DOS via an excessive number of messages in a batch

Centrifuge's cross-chain Gateway allows anyone to call withBatch() and collect an unbounded number of messages into a single outbound batch, with no validation on message count. An attacker can bundle hundreds of cheap UntrustedContractUpdate messages together with critical ones such as UpdateHoldingAmount. On the receiving chain, Gateway.handle() loops through every message, and the cumulative gas cost exceeds the block gas limit, so the whole batch reverts and becomes permanently stuck because the protocol has no split or skip mechanism. This permanently blocks pool holding-amount synchronization and spoke-to-spoke share transfers. The fix, merged in PR #43, adds a governance-configurable maxBatchMessages limit enforced during _endBatching().

Centrifuge Protocol V3.1sherlockNov 17, 2025Open
mediumBridge exploitEVM-Solidity$0

Malda: Unenforced maxFee and ttl Parameters in sendMsg Function

Malda's EverclearBridge.sendMsg forwards decoded cross-chain intent parameters to everclearFeeAdapter.newIntent without enforcing that maxFee and ttl are both zero, which the Everclear netting pathway requires. A rebalancer (the privileged caller) can therefore create intents with non-zero maxFee/ttl that get misrouted to the solver pathway, which is unsupported at launch. The concrete consequences are potential denial-of-service on cross-chain liquidity rebalancing, unexpected solver fees, and forfeited netting cost savings, rather than direct token theft. Sherlock upheld the issue as medium and the protocol team fixed it in pull request #143 by adding require checks for both fields.

MaldasherlockAug 14, 2025Open
mediumBridge exploitEVM-Solidity$0

Malda: If Across Bridging fails, all funds intended for bridging will become locked

Malda's Rebalancer contract integrates the Across bridging protocol by setting itself as the depositor when calling depositV3Now. Across's documented behavior is to refund expired or unfilled deposits to the depositor back on the origin chain, which in this integration is the Rebalancer itself. Because the Rebalancer has no code path to route those returned tokens back into the lending market, any failed bridging attempt permanently strands the funds. The finding was validated by the Sherlock judge and fixed via a rescue helper in PR #126.

MaldasherlockAug 14, 2025Open

All reports in this group

Chains where this class shows up

Related vulnerability category pages