BlackHartBlackHart
Hacks Feed/Gravity Bridge

Gravity Bridge

May 30, 2026·Ethereum·Bridge validator-set takeover
$5.4M
total loss
StatusConfirmed
View current Gravity Bridgescore →

An attacker took over Gravity Bridge's validator set on Ethereum and drained about $5.4 million. Gravity is a bridge between Ethereum and the Cosmos-based Gravity chain, and its Ethereum contract releases funds only when validators holding two thirds of the voting power sign off. The attacker got enough of the real validators to sign a change that shrank the set from 58 validators to 34, concentrating control, then used that concentrated set to sign withdrawals that emptied the bridge's USDC, ETH, USDT and gold-backed PAXG. The funds were swapped to ETH and moved through ChangeNow and Binance. The attacker still holds about 2,059 ETH.

Other bridges and protocolssafe
The Gravity Bridge contract code itselfsafe(No code bug; the validator signing authority was subverted.)
Funds held in the Gravity Bridge on Ethereumdrained(About $5.4M drained: 4.35M USDC, 274 ETH, 434K USDT, 14.16 PAXG.)
Recovery of drained fundsunknown(Swapped to ETH; about 2,059 ETH still held, a portion already through ChangeNow and Binance.)
What the score saw

Gravity Bridge is not one of the protocols we publish a live safety score for, so we had no prior reading on it. The weakness here is the kind our model weighs heavily for bridges: the validator set that guards the funds could be reconfigured by the validators' own signatures alone, with no waiting period, no separate guardian, and no emergency stop. Once enough signing keys are subverted, there is nothing on-chain to slow the attacker down.

Exploit anatomy

Gravity's Ethereum contract the bridge trusts whatever its stored validator set signs. A wallet that had been a legitimate Gravity relayer in early 2025, then went quiet for about 280 days, woke up and called updateValset, shrinking the validator set from 58 to 34 with enough signatures from the old set to pass the two-thirds threshold. About 28 hours later the concentrated set signed withdrawals that drained the bridge into a single recipient wallet, after which the funds were swapped to ETH and consolidated at a holding wallet and partly sent through ChangeNow and Binance.

FUND FLOWROOT CAUSE / ENABLERS
Stage 1 · TAKEOVER
Dormant relayer wallet
woke after ~280 days
0xf3ec82f0...2eb1e8
called updateValset
Gravity Bridge
valset shrunk 58 to 34
0xa4108aa1...f2d906
old set signed past 2/3
Subverted signing authority
0xf3ec...b1e8
key compromise
2/3 power is the only gate
old 58-set signed the shrink to 34
valset takeover
No timelock on valset change
updateValset takes effect instantly, no guardian, no emergency stop
Stage 2 · DRAIN
Recipient wallet
4.35M USDC, 274 ETH, 434K USDT, 14.16 PAXG
0x7b582033...2da1f9
$5,400,000 claimed, +28h
Concentrated set signed withdrawals
34-validator set met 2/3 power on four withdrawal batches; no per-period cap
Stage 3 · SWAP
Tokens swapped to ETH
to ETH
stablecoins, PAXG and WETH consolidated
No outflow velocity cap
a single batch removed 4.35M USDC at once
missing control
Stage 4 · LAUNDERING
Holding wallet
~ 2,059 ETH still held
0x4d3ca32e...7C7A47
partly via ChangeNow and Binance
No realtime valset-change alerting
~28h between the shrink and the drain went unflagged
missing control
Untouched

Safe. The Gravity Bridge contract code itself, and other bridges and protocols, were not affected.

Mechanism

Validators' signing infrastructure was subverted, so two thirds of the 58-set signed updateValset to shrink it to 34 and concentrate power, then that set signed withdrawals that drained the bridge. The contract behaved exactly as designed.

Source
blackhart.io/hacks/gravity-bridge-valset-takeover
verified on-chainfunds to ChangeNow and Binance, ~2,059 ETH still held
Full forensic detail

Step-by-step reconstruction, root cause, counterfactuals, remediation, and disclosure timeline.

Exploit anatomy

1.
Gravity's Ethereum contract releases funds and changes its validator set only when validators holding two thirds of the voting power sign. There is no on-chain admin, no timelock on validator-set changes, no guardian, and no emergency stop.
2.
A wallet that was a legitimate Gravity relayer in early 2025 went dormant for about 280 days. Before the drain, the validators' signing setup was compromised. Thirty-plus independent validators signing a malicious change by accident is not realistic, so the most likely cause is that their automated signing pipeline was poisoned and they signed without seeing what it did.
3.
On 2026-05-28 the dormant wallet called updateValset, replacing the 58-validator set with a 34-validator set and concentrating voting power. The change was accepted because the old set signed it past the two-thirds threshold.
4.
About 28 hours later, four withdrawal batches signed by the concentrated set drained the bridge: 4,349,701 USDC, 274 ETH, 434,072 USDT, and 14.16 PAXG, all sent to one recipient wallet.
5.
The stolen tokens were swapped to ETH and consolidated at a holding wallet that still held about 2,059 ETH at the time of this report, with a portion routed through ChangeNow and Binance.

Root cause

Gravity's Ethereum contract verifies that withdrawals and validator-set changes carry signatures from the stored validator set worth at least two thirds of the voting power. The signatures are the only authority, and there is no timelock, guardian, or circuit breaker on validator-set changes. The validators' signing infrastructure was compromised so that two thirds of the 58-validator set signed a change that shrank the set to 34 and concentrated power. The attacker then drained the bridge through withdrawals signed by that concentrated set. The contract behaved exactly as designed; the off-chain signing authority was subverted.

// Gravity only checks signature power, not whether a valset change is safe
function updateValset(ValsetArgs newValset, ValsetArgs currentValset, Signature[] sigs) external {
  // ...verify currentValset matches checkpoint...
  checkValidatorSignatures(currentValset, sigs, newCheckpoint, powerThreshold); // 2/3 power
  state_lastValsetCheckpoint = newCheckpoint; // no timelock, no guardian, instant
}

Prevention analysis

Similar incidents

Ronin Bridge (2022)

Attacker obtained enough validator signing keys to authorize withdrawals. The bridge code was correct; the validator set was subverted. Same shape, larger scale.

Harmony Horizon (2022)

Compromise of the multisig signer keys controlling the bridge; the stolen keys met the signing threshold and drained it.

Multichain (2023)

Custodial signer authority over bridge-held assets was exercised to drain them. A signer-side compromise, not a code bug.

Remediation

1.Validators and the Gravity team should rotate every signing key and audit the signing pipeline that produced the malicious valset signatures.
2.Restore the validator set to its legitimate composition through a new, manually reviewed updateValset once the signing infrastructure is known clean.
3.If you bridged assets through Gravity, treat funds that were in the Ethereum contract as at risk; there is no automatic reversal.
4.Recommended for any bridge: add a timelock and a guardian pause on validator-set changes, plus a per-period withdrawal cap, so a single signing compromise cannot drain the bridge instantly.
5.Coordinate with ChangeNow and Binance on the consolidation wallet that still holds about 2,059 ETH.

Timeline

2025-02 toThe wallet later used for the takeover interacts with the Gravity contract as a legitimate relayer.
2025-08-21That wallet's last activity before the attack, then dormant about 280 days.
2026-05-28updateValset shrinks the validator set from 58 to 34, signed past the two-thirds threshold by the old set.
2026-05-30Four withdrawal batches drain about $5.4M (USDC, ETH, USDT, PAXG) to a single recipient, about 28 hours after the valset change.
2026-05-30Funds swapped to ETH and consolidated at a holding wallet (about 2,059 ETH); a portion routed through ChangeNow and Binance.
2026-05-30PeckShield publishes detection and attribution. BlackHart verifies the validator-set shrink, drain amounts, single recipient, and consolidation wallet on-chain and publishes this report.
Continuous adversarial monitoring

Get your protocol scored across 12 dimensions, or request ongoing coverage.