Reproduced Exploit
ParaSpace — [H-01] Data corruption in NFTFloorOracle; Denial of Service
1. Remove feeder B (middle): last feeder C is swapped into B's slot. 2. feederPositionMap[C].index still says 2 while array length is 2. 3. removeFeeder(C) reads feeders[2] → out of bounds revert; C stuck forever.
Chain
Other
Category
untagged
Date
Nov 2022
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: 25723-h-01-data-corruption-in-nftfloororacle-denial-of-service-cod. Standalone Foundry PoC and full write-up: 25723-h-01-data-corruption-in-nftfloororacle-denial-of-service-cod_exp in the
evm-hack-registrymirror.
Vulnerability classes: missing index update · data-corruption · DoS
Reproduction: self-contained Foundry PoC with only
forge-std— no fork. Full trace: output.txt.
AuditVault taxonomy: lang/solidity · platform/code4rena · severity/high · sector/lending · genome: missing-modifier · data-corruption/price-manipulation · dos-resistance
Key info#
| Impact | HIGH — swap+pop without map fixup makes further feeder removals OOB-revert |
| Protocol | ParaSpace |
| Vulnerable code | NFTFloorOracle._removeFeeder — no index update after swap |
| Bug class | Incomplete swap-and-pop bookkeeping |
| Finding | Code4rena 2022-11-paraspace · #25723 (H-01) · reporter csanuragjain |
| Compiler | ^0.8.24 (PoC) |
TL;DR#
- Remove feeder B (middle): last feeder C is swapped into B's slot.
feederPositionMap[C].indexstill says 2 while array length is 2.removeFeeder(C)readsfeeders[2]→ out of bounds revert; C stuck forever.
The vulnerable code#
feeders[feederIndex] = feeders[feeders.length - 1]; // @> VULN: no map update for moved feeder
// FIX: feederPositionMap[feeders[feederIndex]].index = feederIndex;
feeders.pop();
Diagrams#
Impact#
Malfunctioning/malicious feeders cannot be removed after any middle-index removal; oracle integrity breaks over normal operations.
Remediation#
After swap, set feederPositionMap[feeders[feederIndex]].index = feederIndex before pop.
Sources#
- AuditVault #25723
- Code4rena 2022-11-paraspace
code-423n4/2022-11-paraspace@c6820a2paraspace-core/contracts/misc/NFTFloorOracle.sol
Sources & further analysis#
Reproductions & code
- Standalone PoC + full trace: 25723-h-01-data-corruption-in-nftfloororacle-denial-of-service-cod_exp (evm-hack-registry mirror).
- AuditVault finding: 25723-h-01-data-corruption-in-nftfloororacle-denial-of-service-cod.
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.