Reproduced Exploit

Next Generation — Cross-chain signature replay via user-supplied domainSeparator

_verifySig takes domainSeparator from the caller. Two chain deployments both accept the same domain label; independent nonces allow draining EURF on each chain under that domain.

Jan 2025Otheruntagged2 min read

Chain

Other

Category

untagged

Date

Jan 2025

Source

AuditVault

EVM Playground

Source-level debugger — step opcodes and Solidity in sync

evm-hack-analyzer

The attack is replayed in an in-browser EVM preloaded with the exact dumped fork state. The execution tree shows every call; step by Solidity line or by opcode across all depths — source, Stack, Memory, Storage, Balances (native / ERC-20 / NFT), Transient storage and Return value stay in sync. Click a tree node, opcode, or source line to jump. No backend, no live RPC.

Loading fork state…

Source & credit. Reproduction of a public audit finding curated by AuditVault — the original finding: 56703-h-01-cross-chain-signature-replay-attack-due-to-user-supplie. Standalone Foundry PoC and full write-up: 56703-h-01-cross-chain-signature-replay-attack-due-to-user-supplie_exp in the evm-hack-registry mirror.


Reproduction: self-contained Foundry PoC (forge-std only) — no fork. Full trace: output.txt.

AuditVault taxonomy: lang/solidity · platform/code4rena · severity/high · sector/bridge · genome: permit-fork-replay · replay · cross-chain-message


Key info#

ImpactHIGH — domain A accepted on chain B → unauthorized EURF transfers cross-chain
ProtocolNext Generation
Bug classUser-supplied domainSeparator not bound to block.chainid
FindingCode4rena 2025-01-next-generation H-01 · #56703
Reporthttps://code4rena.com/reports/2025-01-next-generation
SourceAuditVault
StatusAudit finding — reproduced as a standalone local synthetic
Compiler^0.8.24 (PoC)

TL;DR#

_verifySig takes domainSeparator from the caller. Two chain deployments both accept the same domain label; independent nonces allow draining EURF on each chain under that domain.

HARM: attacker receives full user EURF balance on both modeled chains.


Root cause#

Domain separator is not computed on-chain with chainid / verifyingContract; no deadline.

Preconditions#

Same CREATE2-style deployment intent across chains; user has matching nonces and balances.

Attack walkthrough#

Execute meta-tx on chain A with DOMAIN_A → replay DOMAIN_A on chain B for independent nonce 0.

Diagrams#

flowchart TD A["User signs under DOMAIN_A"] --> B["fwdA.execute DOMAIN_A"] B --> C["EURF drained on chain A"] A --> D["fwdB.execute DOMAIN_A"] D --> E["EURF drained on chain B"] D --> F["No chainid binding"]

Impact#

Cross-chain unauthorized transfers of EURF via gasless forwarder.

Sources#


Sources & further analysis#

Reproductions & code

Alerts & third-party analyses

  • Web3Sec X hacked database: search.
  • Rekt leaderboard: search.
  • Solodit incident search: search.

These dashboards index community alerts tweets, post-mortems, and independent write-ups. Reach them through the protocol name above to cross-check this reproduction against other analyses.