The canonical, chain-agnostic technique registry for attacks on decentralised infrastructure. Each technique is a mechanism-defined class of real primitives observed across node implementations, with evidence, instances, and a permanent citable ID.
NRDAX - decentralised infrastructure attack registry
The fixed family taxonomy techniques are classified under.
CVE-2024-52919 (GHSA-qwp9-p9rr-h729): addr flood → CAddrMan 32-bit nIdCount overflow → assertion abort
CVE-2018-3972 (TALOS-2018-0637): Levin array-of-arrays (0x8D) → epee read_ae POD memcpy → memory corruption
The simulateTransaction RPC handler executes the BPF VM synchronously on the calling Tokio worker thread (no spawn_blocking interposed), and because sigVerify defaults off and simulation is gas-free, an attacker can submit CU-maximizing transactions against pre-loaded programs at no cost. Each concurrent request pins a shared executor thread for the full simulation duration, so per-worker throughput degrades proportionally to concurrent request count, exhausting the bounded async worker pool and starving all other RPC handlers sharing it. The fix-class is interposing async offload (spawn_blocking / dedicated thread pool with backpressure) plus request-side CU/cost accounting for simulate calls, not just on-chain compute budgets.
CVE-2013-5700: empty BIP37 bloom filter → modulo-by-zero in CBloomFilter::Hash() → crash
QUIC-LEAK / CVE-2025-54939: LSQUIC pre-handshake `packet_in` memory leak from coalesced Initial packets (CVSS 7.5 AV:N/AC:L/PR:N/UI:N/A:H, CWE-401+CWE-770; affected LSQUIC < 4.3.1, fixed 4.3.1 / OpenL
CVE-2024-35202: blocktxn with txns not committed to the block merkle root → FillBlock called twice → assertion + node exit (Bitcoin Core <25.0)
CVE-2025-46597: cmpctblock declaring >1GB short-ids → 32-bit size-calc overflow
CVE-2024-32972: eth GetBlockHeaders amount=0 → count-1 underflows to UINT64_MAX → bypasses maxHeadersServe → serves all headers to genesis → memory exhaustion (geth <1.13.15)
Count Underflow Header Serving Amplification
Alien Attack (SlowMist 'peer-pool pollution'): a same-family but DIFFERENT-chain peer completes the chain-agnostic RLPx ECIES handshake + devp2p Hello and is admitted to the eth handshake; the chain c
quiche QUIC CRYPTO-frame flood (CVE-2024-1765): flood of QUIC long-header packets each carrying a CRYPTO frame (type 0x06) whose offset escalates by a fixed stride (4096) — leaving the crypto reassemb
Crypto Frame Reassembly Buffer Exhaustion
Declare Transaction Compilation CPU Exhaustion
quic-go HTTP/3 QPACK decompression-bomb memory exhaustion (CVE-2025-64702): a flood of QUIC v1 short-header (1-RTT) packets, each carrying a STREAM frame (type 0x0b) on a fresh client bidi stream whos
CVE-2023-26248 / GHSA-mqr9-hjr8-2m9w: Content Censorship in IPFS via Kademlia DHT abuse. The libp2p Kademlia DHT (go-libp2p-kad-dht (Go; as shipped in go-ipfs/kubo), affected go-libp2p-kad-dht <= 0.20
DNSSEC Validation Bypass Cache Poisoning
CVE-2018-17144: a block whose tx spends one outpoint twice (duplicate inputs); the 0.14 pre-relay optimization (PR#9049) skipped the duplicate-input check → assert(!coin.IsNull()) crash (0.14.x) / sup
msquic duplicate-transport-parameters VersionInfo leak (CVE-2024-26190): flood of QUIC v1 Initial packets (distinct SCID / new connection each), every Initial carrying a CRYPTO frame (type 0x06) whose
Duplicate Transport Parameter Memory Leak
CVE-2023-34451 (GHSA-w24w-wp77-qffm): the mempool's list + map index each other and can desync so the SAME tx appears multiple times in the list and can no longer be fully removed (only a restart clea
cosmos-sdk server/grpc/server.go grpc.NewServer w/o grpc.MaxConcurrentStreams -> grpc-go default effectively unbounded + no SETTINGS_MAX_CONCURRENT_STREAMS signalled; attacker holds many HTTP/2 stream
Ethash Cache Generation Memory Exhaustion
CVE-2021-42219: go-ethereum v1.10.9 (and earlier pre-Merge ethash-verifying geth) — an unauthenticated remote peer floods a node with an excessive amount of block/header messages; to verify each block
EVM Opcode/Precompile Semantics Divergence
debug_traceCall compute amplification (geth: debug API is DoS-prone, do not expose)
Expensive Debug RPC Compute Amplification
Forged Commit Future Height Light Client Attack
CVE-2024-52920 class: oversized GETDATA processing load
CVE-2023-42319: geth <=1.13.4 --http --graphql; a query with N aliased logs(filter:{fromBlock:0}) ops -> unbounded per-alias full-chain scan -> memory blowup
GraphQL Nested Query Depth CPU Exhaustion
NullRabbit measurement (gRPC/h2 multiplex DoS).
IC quic_transport half-open QUIC handshake memory pin (IC_QUIC_HALFOPEN_PIN): a burst of QUIC v1 Initial packets (distinct SCID each) whose CRYPTO frame declares a large TLS handshake length (4096) bu
Neodyme ND-FD1-MD-02: QUIC INITIAL flood → per-handshake x25519 + ed25519 sign-tile CPU exhaustion (compute-bound, distinct from the connection-slot flood)
CVE-2025-24883: RLPx auth with an all-zero (off-curve) EC pubkey — geth <1.14.13 skips the secp256k1 point-validity check → handshake crypto crash (fixed 159fb1a)
Handshake Crypto Validation Bypass Crash
CVE-2015-3641: header length field pre-allocates the receive buffer before the body → per-connection OOM
CVE-2023-26964 (RUSTSEC-2023-0034): the Rust h2 crate < 0.3.17 does not release stream memory immediately on RST_STREAM and — pre-0.3.17 — has NO bound on streams in the pending-accept-but-remotely-re
Incomplete Packet Timer Overflow CPU Burn
Integer Overflow Decompression Infinite Loop
CVE-2026-34219 (+CVE-2026-33040): gossipsub ControlPrune backoff≈u64::MAX → Instant/Duration overflow panic
CVE-2021-3121 (gogoproto 'skippy peanut butter'): unknown length-delimited field with a negative-length varint → pre-1.3.2 skip code does iNdEx+=length with no length<0 check → index out of bounds → p
CVE-2024-52915: INV with 50k items → 50k getheaders replies / send-buffer blowup
CVE-2026-41584 (GHSA-452v-w3gx-72wg): a V5/NU5 tx whose Orchard action rk is the IDENTITY point [0x00;32] — a canonical point the spec allows, so it passes parse + hash() — but Orchard proof verificat
CVE-2025-54605: flood of PoW-invalid blocks logged unconditionally → log/disk fill
CVE-2025-46598: non-standard tx with many legacy-sighash inputs → quadratic validation CPU, no peer penalty
CertiK Skyfall: Publish RPC disassembles a malformed Move module (empty code_unit) → index panic → RPC crash
GHSA-hrhf-2vcr-ghch (ASA-2025-003): a BitArray whose declared Bits does not match its Elems count (len(Elems) != ceil(Bits/64)) is processed in an invalid state and gossiped to peers before validation
Malformed Field Gossip Before Validation
CVE-2026-41585 (GHSA-29x4-r6jv-ff4w): Zebra's JSON-RPC HTTP middleware treated a failure to read the incoming HTTP request body as an unrecoverable error, aborting the process instead of returning an
CVE-2026-22868 (CVSS 7.5): a batch of EIP-4844 type-3 blob txs announced then delivered (PooledTransactions) with structurally-valid KZG sidecars whose commitment/proof (over blob A) mismatch the carr
CVE-2022-23328 (go-ethereum, CVSS 7.5, all versions <1.10.13): an attacker node sends 5120 PENDING high-gas-price txns from ONE account that each fully spend the account's FULL BALANCE, in one eth Tra
Mempool Sender Spoofing Resource Exhaustion
GHSA-x5vx-95h7-rv4p (cosmos-sdk <=0.47.15/<=0.50.11): x/group PercentageDecisionPolicy.Allow does yesCount.Quo(totalPower) with no totalPower==0 guard; a proposal on a group whose weight is driven to
CertiK Skyfall HamsterWheel: crafted-CFG Move module defeats id_leak_verifier fixpoint → infinite re-analysis → CPU halt
CVE-2020-26264: a crafted LES GetProofsV2 storage-proof request (non-empty AccKey for a non-existent account) dereferences a nil account trie in the les server's GetProofsV2 handler → panic/crash (get
Nondeterministic Execution Consensus Split
quiche optimistic-ACK congestion-window growth (CVE-2025-4820): a QUIC peer completes a handshake, initiates a congestion-controlled transfer toward itself, then sends ACK frames (type 0x02 / 0x03) ac
Optimistic ACK Congestion Window Manipulation
CVE-2024-52914: orphan-tx re-resolution O(outputs × 100 orphans) of expensive txs → multi-hour CPU stall
quinn-proto out-of-order stream reassembly memory exhaustion (GHSA-4w2j-m93h-cj5j / RUSTSEC-2026-0185, CVSS 7.5 AV:N/AC:L/PR:N/UI:N/A:H, CWE-770; affected quinn-proto < 0.11.15, fixed 0.11.15). An una
CometBFT BlocksyncChannel(0x40) oversized BlockResponse (up to 9000 CommitSigs, ~900KB): the Block decode + ValidateBasic at https://github.com/cometbft/cometbft/blob/v0.38.22/blocksync/reactor.go is
CVE-2026-49866: gossipsub oversized IHAVE/IWANT control-message arrays (huge messageID lists) → per-ID processing → CPU DoS
Oversized Control-Message Array CPU Burn
Oversized Hex String Parsing CPU Exhaustion
CVE-2019-11636 (Zcash 'Sapling Wood-Chipper'): Zcash 2.x raised the max transaction size from 100 KB to the full block size after Sapling, letting an attacker cheaply build block-filling shielded txs
quic-go QUIC path-validation memory exhaustion (CVE-2023-49295): flood of QUIC v1 short-header (1-RTT) packets each carrying PATH_CHALLENGE frame(s) (type 0x1a + 8B challenge data). Each PATH_CHALLENG
Path Challenge Response Memory Exhaustion
quiche QUIC PATH_CHALLENGE unbounded-queue flood (CVE-2023-6193): flood of QUIC 1-RTT short-header packets on one DCID arriving from CHANGING source paths (rotating loopback 4-tuples = QUIC connection
Path Migration Challenge Queue Exhaustion
Payload Window Overflow Memory Exhaustion
Cardano PeerSharing MsgShareRequest O(N log N) sort CPU amp: sortBy+hashWithSalt over the ~3000-peer known set per request (~170 us), no idle timeout (Codec.hs:160), no per-peer rate limit. One post-h
CVE-2023-40583: unchecked signed peer-record flood (peer-exchange) → go-libp2p peerstore OOM
Peer Record Signature Bypass Impersonation
Timejacking (SlowMist Blockchain Common Vulnerability List; Culubas 2011): N peers advertise a version.timestamp skewed ~+70min (inside the AddTimeData ±70min acceptance window) → each peer's derived
CVE-2024-32984 (GHSA-3999-5ffv-wp2r): rust-yamux (0.13.0 .. <0.13.2) buffers frames-to-send in an unbounded `pending_frames` VecDeque. A remote peer floods Ping frames (each enqueues a Pong reply) and
Pre-Handshake Buffer Reservation Exhaustion
Bitcoin Core BIP-324 v2 transport pre-auth CPU burn: the 64-byte inbound ellswift key triggers secp256k1 ellswift ECDH + HKDF-SHA256 BEFORE any auth/rate-limit; only the soft 125-inbound cap gates, ac
EL-2026-06 (EF public-disclosure): RLPx pre-auth packet flood → CPU/bandwidth exhaustion
CometBFT consensus DataChannel(0x21) ProposalMessage flood: valid-shape Proposal passes ValidateBasic but the RLock+queue path runs before deferred sig-verify — the N1.4 family HEAD (vote-flood + bloc
Premature Disconnect Request Handling Crash
GHSA-p7mv-53f2-4cwj (ASA-2024-011): a Precommit with a non-nil BlockID + an attached vote extension is handled BEFORE the ValidatorIndex is verified → out-of-range ValidatorIndex → index-out-of-range
Premature Processing Index-Out-Of-Range Panic
CVE-2023-40591: post-Hello devp2p PING (0x02) flood → unbounded goroutines → OOM (geth 1.10.0-1.12.0)
Protocol Message Flood Unbounded Goroutine
QUIC Connection ID Retirement Infinite Loop
QUIC Connection Migration Duplicate-ID Crash
s2n-quic stream-limit exhaustion (GHSA-475v-pq2g-fp9g): pre-patch `RemoteInitiated::on_close_stream` directly bumped `max_streams_sync` with NO rate limiting, so every close of a remote-initiated stre
QUIC Unauthenticated Close Frame Disruption
IC ingress-pool per-NodeId quota mis-key (IC_N1_INGRESS_POOL_QUOTA_MISKEY): every HTTP-arriving ingress message buckets under the carrier replica's own NodeId instead of the signing principal (call.rs
IOTA_S1_EVENTFILTER_EXPONENTIAL: iotax_subscribeEvent depth-D balanced Or-tree filter → exponential CPU
GHSA-8wcc-m6j2-qxvm (ASA-2024-0012/0013): deeply-nested protobuf Any → TxDecoder/UnpackAny stack-overflow / exponential CPU+mem in CheckTx (pre-validation)
Recursive Message Deserialisation Stack Overflow
Solana repair-protocol orphan DoS (solana-labs/solana v1.1.16, PR #10290): a legacy no-nonce RepairProtocol::Orphan(ContactInfo, slot) request for a slot > UNLOCK_NONCE_SLOT makes the serving node's s
eth RPC request-flood (full-tx block fetch sustained at high rate)
Scope Permission Bypass Unauthorized Write
Signature Malleability Consensus Manipulation
CVE-2024-52922: cmpctblock announce then stall (never answer getblocktxn) → ~10min delayed propagation
discv4 FINDNODE->NEIGHBORS reflection/amplification (NethermindEth/nethermind#12211): discv4 is Ethereum's connectionless-UDP node-discovery protocol. A ~170 B FINDNODE (packet-type 0x03) makes the no
Spoofed Endpoint-Proof Bypass Amplification
State Sync Proposer Priority Mismatch Chain Split
C04 (COSMOS_SUBSCRIBE_PERCONN_CAP): CometBFT rpc/core/events.go:27 caps NumClients>=MaxSubscriptionClients(100) but clientID=RemoteAddr(ip:PORT) → each TCP conn gets an independent per-client cap → su
CVE-2025-24371 (ASA-2025-001 / GHSA-22qq-3xwm-r5x4): a malicious CometBFT blocksync peer disrupts a node's ability to sync. In blocksync a peer reports its base/latest heights in a StatusResponse; the
CVE-2026-52737 (GHSA-gvjc-3w7c-92jx): a single unauthenticated Zcash P2P peer answers the syncing node's getblocks/FindBlocks with a two-hash inv, then serves a `block` whose coinbase height is above
CVE-2024-52912: version nTime=INT64_MIN → abs64 overflow skews adjusted-network-time → netsplit
Transaction Malleability (SlowMist Blockchain Common Vulnerability List): a tx and a malleated sibling with a byte-different scriptSig (extra OP_NOP) → different txid, identical inputs/outputs/effect;
Tx History Storage Flood Disk Exhaustion
CVE-2024-55563 (Bitcoin Core <= 27.2): transaction-relay jamming via an off-chain protocol attack ('Transaction-Relay Throughput Overflow Attacks against Off-Chain Protocols'; related to CVE-2024-5291
Transaction Validation Logic Consensus Split
Black Valentine (SlowMist Blockchain Common Vulnerability List): geth --http with the personal namespace exposed + an unlocked/unlockable account → remote unauthenticated personal_unlockAccount then e
Unauthenticated Admin Interface Exposure
CVE-2020-5303 (Lavender): unlimited CometBFT P2P connection requests → OOM + activeIDs-map saturation
quic-go connection-ID memory exhaustion (CVE-2024-22189, GHSA-c33x-xqrf-c478): on an established QUIC connection the attacker floods NEW_CONNECTION_ID frames (type 0x18) with an escalating 'Retire Pri
Unbounded Filter Subscription Storage Exhaustion
Sybil (SlowMist Blockchain Common Vulnerability List): a flood of full RLPx+eth-handshake peers each with a DISTINCT node identity occupies the target's inbound peer slots and biases peer selection (e
CVE-2026-35457 (GHSA-v5hw-cv9c-rpg7): libp2p-rendezvous server stores DISCOVER pagination cookies in an unbounded in-memory map (Registrations::cookies) with no size cap / eviction / expiry — a flood
Unbounded Registration Storage Exhaustion
PRYSM_ATTESTER_SLASHING_PUBKEY_BURN (S4): POST /eth/v1/beacon/pool/attester_slashings_v2 decodes one AttesterSlashingElectra whose attesting_indices vector is capped only at the structural MaxValidato
Unbounded Request Body Memory Exhaustion
The node's JSON-RPC handler for batched account-lookup calls (e.g. getMultipleAccounts) imposes no response-size accounting or cost weighting relative to request size, only a flat cap on key count. An attacker submits a small request (~4.8KB) listing well-known large program accounts (Token/BPFLoader2/BPFLoaderUpgradeable), whose ELF/program data stubs are echoed in full, driving a single request to a ~17.8MB response (3,708x amplification) and sustained ~830MB/s egress under parallel workers. The fix-class is response-size-aware rate limiting/cost accounting on batched read RPCs (weighting by bytes returned, not just item count), not a request-count cap.
Unbounded Signature Verification CPU Exhaustion
CVE-2022-23492/CVE-2022-23486: libp2p stream/connection exhaustion (no backpressure) → OOM
NullRabbit source-traced IOTA GraphQL unbounded-subscription flood (operator-gated).
Unbounded Task Spawn Resource Exhaustion
E28/SOL_P07: getProgramAccounts filter-miss CPU scan (agave rpc.rs:2235-2251)
Unindexed Account Scan CPU Amplification
CVE-2023-33297 (drain): un-rate-limited getheaders flood → >100MB/s upload (Bitcoin/Litecoin/Dogecoin)
Unsafe Deserialization Memory Corruption
QUIC SCID hash-collision DoS (CVE-2025-47200): a flood of QUIC v1 Initial packets whose 8-byte Source Connection IDs are crafted to COLLIDE in the server's connection-ID hash table. The server keys ac
CVE-2024-52921: unrequested merkle-mismatched block erases other peers' download state → hinders propagation
CVE-2026-45783 / GHSA-32mq-hpph-xfvr: the libp2p Kademlia DHT (@libp2p/kad-dht (npm, js-libp2p), affected < 16.2.6) accepts and persists PUT_VALUE records with no effective validation, count, or byte
Unvalidated DHT Record Storage Exhaustion
Agave snapshot AppendVec StoredMeta.data_len > MAX_PERMITTED_DATA_LENGTH (10 MiB) survives new_for_startup (sanitize skipped) -> index-gen scan_accounts QuotaExceeded -> .expect("must scan accounts st
CVE-2024-52916: difficulty-1 headers with parent=genesis → mapBlockIndex unbounded growth → memory DoS
CVE-2018-17145 (INVDoS): random-hash INV flood → unbounded tx-tracking memory
Unvalidated Inventory Tracking Memory Exhaustion
CVE-2016-10724: pre-0.13.0 alert messages stored in an unbounded map → memory exhaustion
Vote Signature Late Verification Resource Exhaustion
XML Attribute Parsing Quadratic CPU Exhaustion
XML Namespace Declaration Memory Exhaustion
dnsdist's DoQ/DoH3 receiver allocates per-error bookkeeping state whenever it emits a self-generated FORMERR/REFUSED/SERVFAIL/NOTIMP response, and attaches that state to the QUIC connection object rather than the completed stream/query, freeing it only on full connection teardown. An attacker opens a single DoQ/DoH3 connection and streams a large run of complete, well-formed queries engineered to each trigger a local error response, causing the per-error allocations to accumulate unboundedly for as long as the connection (or its parallel siblings) stays open. The fix-class is scoping/freeing per-error bookkeeping to the query/stream lifetime instead of the connection lifetime, bounding memory growth regardless of connection duration.
Envoy's HTTP/2 HPACK decoder bounds header-block size on ENCODED bytes only, and cookie header bytes bypass the max_request_headers_kb decoded-size accounting entirely. An attacker plants one large cookie value once in the HPACK dynamic table via a literal-with-incremental-indexing field, then re-references that single entry many times per request using 1-byte indexed-header-field octets, so the wire stays tiny while Envoy materializes the full cookie value on every reference. The fix-class is bounding/accounting the DECODED header size (including cookie bytes) rather than just the encoded HPACK block, closing the asymmetric-allocation gap; without it, a few connections/streams balloon decoded-header memory past the process limit and get OOM-killed within seconds.
The HTTP/2 decoder's header-list-size guard is size-based (maxHeaderListSize - frameSize < currentSize) and never trips when each CONTINUATION frame carries zero bytes, so no count limit exists on CONTINUATION frames following an unterminated HEADERS block (END_HEADERS=0). An attacker opens a header block and streams an unbounded sequence of zero-length CONTINUATION frames on one connection, each costing only a 9-byte frame header to send. The decoder keeps parsing every frame, monopolizing a CPU thread and producing a compute-exhaustion DoS at negligible attacker bandwidth.
The HTTP/2 priority parser (RFC 9218 urgency field) throws an unhandled IllegalArgumentException when given an out-of-range value (e.g. u=99), and the request-handling code path lacks a catch/cleanup for this failure, leaving the half-processed request's state permanently retained. An attacker floods the server with malformed PRIORITY_UPDATE frames or priority headers, each triggering the same uncaught-exception path, causing unbounded cumulative memory retention across requests. Effect: gradual heap growth culminating in OutOfMemoryError / DoS. The fix-class is 'catch parser exceptions and ensure per-request cleanup/dispatch on all error paths', distinguishing it from stream-count or flow-control exhaustion techniques.
The QPACK decoder returns QUIC stream- and connection-level flow-control credit for HEADERS bytes belonging to field sections that reference dynamic-table entries not yet inserted (Required Insert Count > inserted count), even though those bytes remain resident in the decoder's blocked-section heap buffer. An attacker sends such blocked field sections and never supplies the corresponding encoder-stream inserts, so the sections never decode or free, while continuing to send more HEADERS traffic using the wrongly-returned flow-control credit. This decouples flow-control accounting from actual buffer occupancy, letting the attacker drive unbounded heap growth in the decoder and exhaust memory/DoS the HTTP/3 stack.
The node-side defect is an insecure default: the HTTP/3 codec's maxHeaderListSize defaults to the near-unbounded RFC 9114 ceiling ((1<<62)-1) whenever a peer omits SETTINGS_MAX_FIELD_SECTION_SIZE, instead of inheriting the safe bounded default already enforced for HTTP/1.1 and HTTP/2. An attacker simply never sends that setting, then transmits a HEADERS/QPACK block containing an enormous COUNT of distinct literal header fields; the codec keeps decoding and buffering each field with no size ceiling. The fix-class is enforcing a safe bounded default (and/or hard cap independent of peer-advertised settings) for field-section size in the HTTP/3 codec, which measurably manifests as unbounded heap growth culminating in OutOfMemoryError/process death.