Reproduced Exploit
Superform: A strategist sandboxed by a strategy-specific hooks root (that excludes the transferErc20
Chain
Other
Category
untagged
Date
Jan 1970
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: 63076-strategisthooksroot-permissions-may-be-circumvented-by-any-s. The historical source/toolchain is unavailable; this entry is documentation only and claims no executable Forge PoC.
Vulnerability classes: vuln/theft
Reproduction: a faithful minimal reproduction of the vulnerable finding — the vulnerable function is reproduced verbatim (marked
@>) with faithful minimal doubles; local deploy, no fork.
Root cause#
A strategist sandboxed by a strategy-specific hooks root (that excludes the transferErc20 hook) escapes the sandbox by supplying a valid GLOBAL Merkle proof + empty strategy proof; validateHook returns true before enforcing the strategy root, so the globally-permitted transferErc20 hook executes and drains 1000 STOLEN-USDC from the vault to the attacker.
// First try to verify against the global root if provided
if (lengthGlobalProof > 0 && !globalHooksVetoed) {
// Only validate against global root if it exists
if (_globalHooksRoot != bytes32(0) && MerkleProof.verify(globalProof, _globalHooksRoot, leaf)) { // @> global proof short-circuits to `true` BEFORE any strategy-root enforcement — a sandboxed strategist escapes
return true;
}
Why it's exploitable here#
A strategist sandboxed by a strategy-specific hooks root (that excludes the transferErc20 hook) escapes the sandbox by supplying a valid GLOBAL Merkle proof + empty strategy proof; validateHook returns true before enforcing the strategy root, so the globally-permitted transferErc20 hook executes and drains 1000 STOLEN-USDC from the vault to the attacker.
Attack path#
Marked-line walkthrough (Playground)#
The EVM Playground pins each step to the exact executed source line in 0x671d353a77…:
- L38 — Hash up the Merkle proof: Setup: loops over
proof, hashing pairwise to rebuild a Merkle root up from the leaf. - L41 — Return reconstructed Merkle root: Setup: returns the computed root so
MerkleProof.verifycan compare it against a stored root. - L63 — Vault token balance ledger: Setup:
balanceOftracks the USDC the sandboxed strategist will try to drain from the vault. - L136 — Read strategy-specific hooks root: Reads the per-
strategyhooks root that is meant to sandbox this strategist to a limited hook set. - L161 — Build leaf for requested hook: Builds the Merkle
leaffor the hook the strategist wants to run, e.g. the fund-movingtransferErc20. - L183 — Global proof short-circuits check: Root cause: a valid GLOBAL-root proof returns true here before the strategy-specific root is ever enforced, escaping the sandbox.
- L184 — Grant hook via global branch:
return truefrom the global branch permitstransferErc20, letting the sandboxed strategist drain 1000 USDC.
PoC#
Registry (Foundry, local deploy — verbatim vulnerable source + harm-asserting test + negative control):
cd 63076-strategisthooksroot-permissions-may-be-circumvented-by-any-s_exp
forge test -vvv
The browser Playground replays the same synthetic opcode-for-opcode and measures the harm: A strategist sandboxed by a strategy-specific hooks root (that excludes the transferErc20 hook) escapes the sandbox by supplying a valid GLO. Both gates are green (registry forge test PASS + Playground _verify-poc VERDICT: PASS).
Sources & further analysis#
Reproductions & code
- No executable Forge reproduction is claimed; the historical source/toolchain was unavailable for this finding.
- AuditVault finding: 63076-strategisthooksroot-permissions-may-be-circumvented-by-any-s.
- Upstream DeFiHackLabs PoC directory: src/test.
Alerts & third-party analyses
- DeFiHackLabs incident explorer: [search "Superform: A strategist sandboxed by a strategy-specific hooks root (that excludes the transferErc20"](https://defihacklabs.io/explorer/index.html?q=Superform%3A%20A%20strategist%20sandboxed%20by%20a%20strategy-specific%20hooks%20root%20(that%20excludes%20the%20transferErc20).
- Web3Sec X hacked database: search.
- Rekt leaderboard: [search](https://rekt.news/?s=Superform%3A%20A%20strategist%20sandboxed%20by%20a%20strategy-specific%20hooks%20root%20(that%20excludes%20the%20transferErc20).
- Solodit incident search: [search](https://solodit.xyz/issues?search=Superform%3A%20A%20strategist%20sandboxed%20by%20a%20strategy-specific%20hooks%20root%20(that%20excludes%20the%20transferErc20).
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.