Reproduced Exploit
Sequence — partial session-signature replay / frontrun (H-02)
1. Calls.execute bumps the nonce, validates the session signature, then runs calls. 2. A later call with BEHAVIOR_REVERT_ON_ERROR reverts the entire transaction → nonce not consumed. 3. Session sigs are recovered per call index, not over the full payload. 4. Attacker trims [A,B] + [SigA,SigB] down…
Chain
Other
Category
signature
Date
Oct 2025
Source
AuditVault
EVM Playground
Source-level debugger — step opcodes and Solidity in sync
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.
Source & credit. Reproduction of a public audit finding curated by AuditVault — the original finding: 63761-h-02-partial-signature-replayfrontrunning-attack-on-session. Standalone Foundry PoC and full write-up: 63761-h-02-partial-signature-replayfrontrunning-attack-on-session_exp in the
evm-hack-registrymirror.
Vulnerability classes: vuln/signature/partial-replay · vuln/mev/frontrun · vuln/bridge/replay · vuln/atomicity
Reproduction: self-contained Foundry PoC with only
forge-std. Full trace: output.txt. PoC: test/63761-h-02-partial-signature-replayfrontrunning-attack-on-session_exp.sol.
AuditVault taxonomy: lang/solidity · platform/code4rena · has/github · has/poc · severity/high · sector/account · sector/dex · sector/staking · genome: replay · griefing · frontrun · permit-fork-replay · fot-slippage
Key info#
| Impact | HIGH — multi-call session that reverts on a later BEHAVIOR_REVERT_ON_ERROR leaves per-call signatures reusable; attacker executes a prefix of the payload alone and steals funds / breaks atomicity |
| Protocol | Sequence — Calls.sol + SessionSig.sol |
| Vulnerable code | Nonce bumped before execution (undone on full revert) + per-call hashCallWithReplayProtection not bound to full payload |
| Bug class | Partial signature replay / mempool frontrun of multi-call sessions |
| Finding | Code4rena — Sequence 2025-10 · H-02 · reporter montecristo |
| Report | 2025-10-sequence |
| Source | AuditVault |
| Status | Audit finding. Local synthetic reduction of the session execute + per-call sig path. |
| Compiler | ^0.8.24 (PoC) |
| Repo@commit | code-423n4/2025-10-sequence@b0e5fb15 |
TL;DR#
Calls.executebumps the nonce, validates the session signature, then runs calls.- A later call with
BEHAVIOR_REVERT_ON_ERRORreverts the entire transaction → nonce not consumed. - Session sigs are recovered per call index, not over the full payload.
- Attacker trims
[A,B]+[SigA,SigB]down to[A]+[SigA]and re-submits. - HARM: Call A alone transfers 100 WETH from the wallet to the attacker.
The vulnerable code#
nonce = usedNonce + 1; // @> VULN: undone if a later call reverts the tx
// ...
revert Reverted(i); // full revert → nonce unconsumed
// ...
return keccak256(abi.encodePacked(DOMAIN, space, nonce, callIdx, ...)); // @> VULN: per-call only
Fix: bind each session call signature to the complete payload hash.
Root cause#
Atomic multi-call semantics are enforced only by full-tx revert, but authorization is per-call. When the revert also rolls back nonce consumption, every proper prefix of a signed multi-call remains a valid standalone payload.
Preconditions#
- A multi-call session payload with per-call session signatures.
- At least one later call uses
BEHAVIOR_REVERT_ON_ERRORand fails (or attacker frontruns a subset from the mempool).
Attack walkthrough#
- Session signs
[transfer tokens to attacker, alwaysRevert]both with REVERT_ON_ERROR. - Full execute reverts on call 1; nonce stays 0; wallet still funded.
- Attacker submits only call 0 + Sig0.
- Transfer succeeds; wallet drained.
Diagrams#
Impact#
Financial loss (partial execution of transfers/swaps), state corruption (broken atomicity), and mempool frontrun grief of legitimate multi-call sessions.
Sources#
Sources & further analysis#
Reproductions & code
- Standalone PoC + full trace: 63761-h-02-partial-signature-replayfrontrunning-attack-on-session_exp (evm-hack-registry mirror).
- AuditVault finding: 63761-h-02-partial-signature-replayfrontrunning-attack-on-session.
Alerts & third-party analyses
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.