SlowMist|Oct 31, 2026 13:34
🚨 On October 29, 2026, cross-chain protocol @zkLink_Official was exploited for approximately $783K. The SlowMist Security Team analyzed the incident and uncovered how a transient storage flaw led to forged batch roots and unauthorized withdrawals.
🧩 Attack Flow:
1️⃣ Queried totalBatchesExecuted and selected the next batch (116409) for forgery.
2️⃣ Executed a genuine Linea claim through SyncL2TxHashRelayer, writing finalizeMessageHash into transient storage.
3️⃣ Reused the stale finalizeMessageHash in a second claimMessage call, triggering an attacker-controlled call to EthereumGateway.
4️⃣ Used EthereumGateway.sendMessage to call ZkLink.syncBatchRoot, forging the batch root and advancing totalBatchesExecuted.
5️⃣ Executed 12 withdrawals against the forged root: 1 ETH and 11 ERC-20 transfers using forged Merkle proofs.
⚙️ Root Cause:
Arbitrator.claimMessage allows relayers to specify arbitrary call targets and calldata, while failing to clear or bind finalizeMessageHash to the current invocation. Combined with ZkLink.syncBatchRoot only checking gateway identity without verifying batch proofs, this enabled batch root forgery.
🔒 Recommendations:
When reviewing similar cross-chain relayer projects, pay attention to four areas:
1️⃣ Reset transient storage before each call.
2️⃣ Bind verification values to the current invocation.
3️⃣ Check whether arbitrary users can indirectly leverage trusted callers through public helper contracts or relayers.
4️⃣ Independently verify batch root updates rather than relying solely on caller identity.
Full analysis 👇
https://slowmist.medium.com/one-fish-multiple-meals-analysis-of-the-780k-zklink-exploit-e07d06d4dbd5
Share To
Timeline
HotFlash
APP
X
Telegram
CopyLink