nr-network-known-class-detector
A binary attack-vs-benign detector for blockchain-node network/resource attacks, trained
entirely on faithful reproductions of publicly-disclosed attacks. Every attack class in the
corpus reproduces a specific public disclosure — a CVE, a GHSA, or a named third-party security
audit — and each carries a provenance.source_class recording how public its sourcing is. Part of
NullRabbit's work on autonomous defence for decentralised networks — watch the outside of the
perimeter.
STATUS: DIAGNOSTIC, not a deployment claim. Trained on synthetic localnet reproductions (lab fidelity), not real production traffic. See Evaluation and Limitations.
Model description
Given the network-layer signal of a short capture window against a blockchain node (packet-rate /
size statistics from the pcap, and amplification / request-response / timing statistics from the RPC
responses), the model emits a calibrated attack probability. It is one multi-family model over the
network-v1 feature manifold — it spans 17 chains, all public-sourced (this published cut is
trained on public-cve-replication primitives only).
Architecture
HistGradientBoostingClassifier+ isotonic calibration (scikit-learn), NaN-native.- pcap aggregates + RPC-response aggregates, degenerate columns dropped by a per-fit robust-column guard. No host-load features (the containerised lab node is root-owned, so host metrics are unreadable).
- Decision threshold 0.5 (calibrated). Inference is scoreability-gated: a record with no network
signal (e.g. an economic/DeFi bundle) returns
scoreable=Falsewith no verdict.
Training data — 130 public-CVE attack primitives, 17 chains, 1963 bundles
This is the public-CVE cut (public-cve-replication only): 1384 attack + 579 benign
bundles (pcap + responses + manifest), 136 chain×primitive instances. Benign traffic
exercises the same methods / wire messages the attacks abuse, at normal scale — so the model
separates attack-use from benign-use, not message type. Every attack reproduces an external public
disclosure with a provenance.public_source URL. (0 original primitives — NullRabbit's own
measurement of vendor-acknowledged RPC amplification, for which no CVE exists — are held in the full
corpus but excluded from this published cut, so the "trained entirely on public disclosures" claim
above is literal.)
| primitive | chain · layer | public source | source_class |
|---|---|---|---|
bitcoin_dup_input_crash |
Bitcoin · p2p | CVE-2018-17144 | public-cve-replication |
bitcoin_tx_relay_jamming |
Bitcoin · p2p | CVE-2024-55563 | public-cve-replication |
btc_addr_overflow_flood |
Bitcoin / Dogecoin / Litecoin · p2p | CVE-2024-52919 | public-cve-replication |
btc_alert_flood |
Bitcoin · p2p | CVE-2016-10724 | public-cve-replication |
btc_blocktxn_double_fillblock |
Bitcoin · p2p | CVE-2024-35202 | public-cve-replication |
btc_bloom_divzero |
Bitcoin · p2p | CVE-2013-5700 | public-cve-replication |
btc_cmpctblock_overflow |
Bitcoin · p2p | CVE-2025-46597 | public-cve-replication |
btc_cmpctblock_stall |
Bitcoin · p2p | CVE-2024-52922 | public-cve-replication |
btc_getdata_flood |
Bitcoin · p2p | CVE-2024-52920 | public-cve-replication |
btc_headers_genesis_spam |
Bitcoin · p2p | CVE-2024-52916 | public-cve-replication |
btc_headers_oom |
Bitcoin · p2p | CVE-2019-25220 | public-cve-replication |
btc_inv_buffer_blowup |
Bitcoin · p2p | CVE-2024-52915 | public-cve-replication |
btc_inv_eviction_jam |
Bitcoin · p2p | CVE-2024-52913 | public-cve-replication |
btc_invalid_block_logfill |
Bitcoin · p2p | CVE-2025-54605 | public-cve-replication |
btc_invdos_flood |
Bitcoin · p2p | CVE-2018-17145 | public-cve-replication |
btc_mutated_block |
Bitcoin · p2p | CVE-2024-52921 | public-cve-replication |
btc_orphan_cpu |
Bitcoin / Dogecoin / Litecoin · p2p | CVE-2024-52914 | public-cve-replication |
btc_oversized_recv_buffer |
Bitcoin · p2p | CVE-2015-3641 | public-cve-replication |
btc_tx_maprelay |
Bitcoin · p2p | CVE-2013-4627 | public-cve-replication |
btc_tx_quad_sighash |
Bitcoin · p2p | CVE-2025-46598 | public-cve-replication |
btc_version_selfnonce |
Bitcoin · p2p | CVE-2025-54604 | public-cve-replication |
btc_version_timestamp_overflow |
Bitcoin · p2p | CVE-2024-52912 | public-cve-replication |
p2p_getheaders_drain |
Bitcoin / Dogecoin / Litecoin · p2p | CVE-2023-33297 | public-cve-replication |
sybil_peer_identity_flood |
Bitcoin · p2p | public disclosure | public-cve-replication |
timejacking_peer_time_skew |
Bitcoin · p2p | public disclosure | public-cve-replication |
tx_malleability_txid_mutate |
Bitcoin · p2p | public disclosure | public-cve-replication |
cometbft_bitarray_mismatch |
Cosmos · cometbft-p2p-secretconn | GHSA-hrhf-2vcr-ghch | public-cve-replication |
cometbft_blockpart_mismatch |
Cosmos · cometbft-p2p-secretconn | GHSA-r3r4-g7hq-pq4f | public-cve-replication |
cometbft_blocksync_height_decrease_stuck |
Cosmos · cometbft-blocksync-reactor | CVE-2025-24371 | public-cve-replication |
cometbft_blocksync_malicious_peer |
Cosmos · cometbft-p2p-secretconn | GHSA-hg58-rf2h-6rr7 | public-cve-replication |
cometbft_mempool_dup_tx_leak |
Cosmos · cometbft-p2p-secretconn | CVE-2023-34451 | public-cve-replication |
cometbft_voteext_panic |
Cosmos · cometbft-p2p-secretconn | GHSA-p7mv-53f2-4cwj | public-cve-replication |
cosmos_gogoproto_skippy |
Cosmos · rpc-broadcast-tx | CVE-2021-3121 | public-cve-replication |
cosmos_group_divzero_halt |
Cosmos · rpc-group-module-tx | GHSA-x5vx-95h7-rv4p | public-cve-replication |
cosmos_p2p_conn_flood |
Cosmos · tcp-p2p-conn-flood | CVE-2020-5303 | public-cve-replication |
cosmos_protobuf_nest_bomb |
Cosmos · rpc-broadcast-tx | GHSA-8wcc-m6j2-qxvm | public-cve-replication |
cosmos_vesting_blocked_address |
Cosmos · cometbft-rpc-http | GHSA-4j93-fm92-rp4m | public-cve-replication |
cosmwasm_validate_basic_address_count |
Cosmos · cometbft-rpc-http | GHSA-m3rh-cvr5-x6q4 | public-cve-replication |
discv4_findnode_amplification |
Ethereum · devp2p-discv4-udp | [public disclosure](NethermindEth/nethermind#12211 — 'Resolve some discovery dos vectors (which hive revealed)': discv4 (UDP node-discovery) DoS mitigation — endpoint-proof bonding tied to the exact UDP IP:port before honouring FINDNODE, plus a 50/50 request/response rate-limit split so NEIGHBORS response bursts can't starve legitimate queries. https://github.com/NethermindEth/nethermind/pull/12211) | public-cve-replication |
geth_alien_peer_pool_pollution |
Ethereum · devp2p-rlpx | public disclosure | public-cve-replication |
geth_auth_zero_pubkey |
Ethereum · devp2p-rlpx | CVE-2025-24883 | public-cve-replication |
geth_blob_kzg_dos |
Ethereum · devp2p-rlpx | CVE-2026-22868 | public-cve-replication |
geth_devp2p_ping_flood |
Ethereum · devp2p-rlpx | CVE-2023-40591 | public-cve-replication |
geth_eth_receipt_flood |
Ethereum · devp2p-rlpx | EL-2024-20 | public-cve-replication |
geth_ethash_memory_exhaustion_dos |
Ethereum · ethereum-eth-devp2p | [CVE-2021-42219](CVE-2021-42219 — https://nvd.nist.gov/vuln/detail/CVE-2021-42219 (MITRE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-42219). go-ethereum v1.10.9 remote DoS: an excessive amount of block/header messages to a node drives repeated ethash cache generation in consensus/ethash/algorithm.go -> memory exhaustion. CVSS 3.1 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H). No vendor GHSA (third-party exploit-doc ref).) | public-cve-replication |
geth_getblockheaders_count_zero |
Ethereum · devp2p-rlpx | CVE-2024-32972 | public-cve-replication |
geth_graphql_aliased_logs_dos |
Ethereum · ethereum-http-graphql | CVE-2023-42319 | public-cve-replication |
geth_les_getproofsv2_dos |
Ethereum · devp2p-rlpx | CVE-2020-26264 | public-cve-replication |
geth_les_skip_negative |
Ethereum · devp2p-rlpx | CVE-2018-12018 | public-cve-replication |
geth_mempool_spend_all_flood |
Ethereum · devp2p-eth-transactions | CVE-2022-23328 | public-cve-replication |
geth_rlpx_auth_flood |
Ethereum · devp2p-rlpx | EL-2026-06 | public-cve-replication |
geth_rpc_unlocked_wallet_drain |
Ethereum · ethereum-http-rpc | public disclosure | public-cve-replication |
geth_snap_trienode_dos |
Ethereum · devp2p-rlpx | CVE-2021-41173 | public-cve-replication |
geth_sybil_identity_flood |
Ethereum · devp2p-rlpx | public disclosure | public-cve-replication |
geth_tcp_handshake_flood |
Ethereum · devp2p-rlpx | EL-2024-06 | public-cve-replication |
geth_tx_future_flood |
Ethereum · devp2p-rlpx | CVE-2022-23327 | public-cve-replication |
monero_levin_array_memcorrupt |
Monero · levin-p2p | CVE-2018-3972 | public-cve-replication |
monero_portable_storage_oom |
Monero · levin-p2p | PR#7190 | public-cve-replication |
monero_rpc_conn_exhaustion |
Monero · http-rpc | CVE-2025-26819 | public-cve-replication |
monero_wallet_rpc_body_size_dos |
Monero · monero-wallet-rpc-http | public disclosure | public-cve-replication |
monero_zmq_eagain_crash |
Monero · monero-zmq-rpc | public disclosure | public-cve-replication |
firedancer_metrics_flood_crash |
Solana · prometheus-metrics-http | [public disclosure](https://github.com/firedancer-io/firedancer/releases/tag/v0.106.11814 — Firedancer v0.106.11814 (Testnet) Bug Fixes: "Fixed an issue where a connection flood to the metrics server could crash the validator." Firedancer's fd_metrics tile serves Prometheus-compatible metrics over HTTP (default 127.0.0.1:7999/metrics; listen address operator-configurable / internet-exposable per the Firedancer bug-bounty guidance). A remote inbound TCP connection flood to the metrics port could crash the whole validator prior to this fix.) | public-cve-replication |
sol_tpu_quic_handshake_flood |
Solana · tpu-quic | ND-FD04-LO-01 | public-cve-replication |
sol_tpu_quic_initial_cpu |
Solana · tpu-quic | ND-FD1-MD-02 | public-cve-replication |
sol_tpu_quic_slowloris |
Solana · tpu-quic | ND-FD04-IN-02 | public-cve-replication |
solana_repair_protocol_dos |
Solana · solana-serve-repair | [public disclosure](https://github.com/solana-labs/solana/releases/tag/v1.1.16 — release note "Avoid possible repair orphan DoS"; fix PR https://github.com/solana-labs/solana/pull/10290 ("Fix run_orphan DOS", merged 2020-05-28), core/src/serve_repair.rs.) | public-cve-replication |
sui_disassemble_panic |
Sui · json-rpc | CertiK Skyfall | public-cve-replication |
sui_move_recursion |
Sui · json-rpc | CVE-2023-36184 | public-cve-replication |
sui_verifier_hamsterwheel |
Sui · json-rpc | CertiK Skyfall HamsterWheel | public-cve-replication |
zcash_sapling_woodchip_tx_flood |
Zcash · zcash-p2p-tx-relay-flood | CVE-2019-11636 | public-cve-replication |
zcash_zebra_addr_vector_preallocation_amplification |
Zcash · zcash-p2p-addr-addrv1-vec | CVE-2026-40881 | public-cve-replication |
zcash_zebra_coinbase_script_preallocation_amplification |
Zcash · zcash-p2p-tx-coinbase-input-script | CVE-2026-44500 | public-cve-replication |
zcash_zebra_equihash_solution_preallocation_amplification |
Zcash · zcash-p2p-headers-block-solution | CVE-2026-44500 | public-cve-replication |
zcash_zebra_headers_message_preallocation_amplification |
Zcash · zcash-p2p-headers-countedheader-vec | CVE-2026-44500 | public-cve-replication |
zcash_zebra_tx_cache_consensus_split |
Zcash · consensus | CVE-2026-34377 | public-cve-replication |
zebra_block_discovery_dos |
Zcash · zcash-p2p-block-discovery | [CVE-2026-44499](CVE-2026-44499 / GHSA-h9hm-m2xj-4rq9 — https://github.com/ZcashFoundation/zebra/security/advisories/GHSA-h9hm-m2xj-4rq9 (also https://nvd.nist.gov/vuln/detail/CVE-2026-44499). Permanent Block Discovery Halt in Zebra via Gossip Queue Saturation and Syncer Poisoning.) | public-cve-replication |
zebra_rpc_premature_disconnect_crash |
Zcash · zcash-jsonrpc-http | [CVE-2026-41585](CVE-2026-41585 / GHSA-29x4-r6jv-ff4w https://github.com/ZcashFoundation/zebra/security/advisories/GHSA-29x4-r6jv-ff4w (Zebra JSON-RPC HTTP middleware: DoS via interrupted/truncated request body from an authenticated client)) | public-cve-replication |
zebra_sighash_single_missing_output |
Zcash · consensus | GHSA-cwfq-rfcr-8hmp | public-cve-replication |
zebra_sync_restart_poisoning |
Zcash · zcash-p2p-inv+block-sync-poison | [CVE-2026-52737](CVE-2026-52737 / GHSA-gvjc-3w7c-92jx — https://github.com/ZcashFoundation/zebra/security/advisories/GHSA-gvjc-3w7c-92jx) | public-cve-replication |
envoy_http2_hpack_cookie_amplification |
http2 · http2-hpack-headers | [CVE-2026-47774](CVE-2026-47774 / GHSA-22m2-hvr2-xqc8 (https://github.com/envoyproxy/envoy/security/advisories/GHSA-22m2-hvr2-xqc8). Envoy HTTP/2 codec (oghttp2/quiche): HPACK header-block limits enforced on ENCODED bytes with no total-DECODED-size limit, plus cookie bytes escaping max_request_headers_kb accounting. Affected Envoy < 1.39; patched 1.35.11 / 1.36.7 / 1.37.3 / 1.38.1. CWE-405 + CWE-770; CVSS 7.5.) | public-cve-replication |
http2_bomb_indexed_ref_window_pin |
http2 · http2-hpack-headers+flowcontrol | [CVE-2026-49975](CVE-2026-49975 ("HTTP/2 Bomb"). HTTP/2 servers (nginx <1.29.8, Apache httpd mod_http2 <2.0.41, Envoy <=1.37.2, Cloudflare Pingora) enforce HPACK limits on ENCODED header-block bytes without bounding the total DECODED header list, and hold each stream's amplified decoded allocation until the stream makes flow-control progress. An attacker seeds the HPACK dynamic table with one generic header then emits thousands of 1-byte indexed references (0x80 | 62=0xBE, ~5,700:1 decoded-size amplification) WHILE advertising a zero-byte flow-control window (SETTINGS_INITIAL_WINDOW_SIZE=0) and dripping 1-byte WINDOW_UPDATE frames, PINNING the amplified allocation (server can't drain it): ~32 GiB pinned in <20 s from ONE connection -> OOM. CWE-405 + CWE-770 + CWE-400.) |
http2_continuation_flood |
http2 · http2-continuation-flood | CVE-2026-33871 | public-cve-replication |
http2_madeyoureset_flood |
http2 · http2-madeyoureset | [CVE-2025-8671](CVE-2025-8671 ("MadeYouReset") / CVE-2025-55163 (GHSA-prj3-ccx8-p6x4) / CERT/CC VU#767506 — https://kb.cert.org/vuls/id/767506 , https://github.com/netty/netty/security/advisories/GHSA-prj3-ccx8-p6x4 . HTTP/2 DoS in which an attacker sends protocol-valid-but-misused control frames (WINDOW_UPDATE increment 0, HEADERS/DATA on a half-closed stream, or PRIORITY with a bad length) that force the SERVER to emit RST_STREAM. The reset stream immediately stops counting against MAX_CONCURRENT_STREAMS (typ. 100) yet the backend keeps processing the request -> unbounded concurrent work -> resource exhaustion (OOM/CPU) -> DoS. Umbrella CVSS 3.1 7.5 HIGH; Netty CVE-2025-55163 CVSS 4.0 8.2 HIGH (patched 4.1.124.Final / 4.2.4.Final). DISTINCT from CVE-2023-44487 Rapid Reset (client-emitted RST): here the RST is server-emitted so client-side rapid-reset mitigations do not apply. Discovered by Tel Aviv University + Imperva. Affects Netty, Apache Tomcat (CVE-2025-48989), Eclipse Jetty (CVE-2025-5115), F5 BIG-IP (CVE-2025-54500), gRPC and many other HTTP/2 stacks (CERT/CC VU#767506).) | public-cve-replication |
http2_malformed_priority_leak_flood |
http2 · http2-priority-leak | [CVE-2025-31650](CVE-2025-31650 (Apache Tomcat) — https://nvd.nist.gov/vuln/detail/CVE-2025-31650 , https://lists.apache.org/thread/j6zzk0y3yym9pzfzkq5vcyxzz0yzh826 . Improper Input Validation / Incomplete Cleanup (CWE-459): incorrect error handling for some INVALID HTTP/2 priority values resulted in incomplete clean-up of the failed request, creating a memory leak; a large number of such requests triggers an OutOfMemoryError → DoS. Vulnerable path: Http2Parser.readPriorityUpdateFrame (and Stream.emitHeader) → Priority.parsePriority(r) throws IllegalArgumentException on an invalid RFC 9218 priority value (e.g. out-of-range urgency u=99), previously un-caught. CVSS 3.1 7.5 HIGH (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H). Affected: Apache Tomcat 9.0.76-9.0.102, 10.1.10-10.1.39, 11.0.0-M2-11.0.5 (and EOL-at-disclosure 8.5.90-8.5.100); fixed 9.0.104 / 10.1.40 / 11.0.6. Fixed by wrapping Priority.parsePriority in try/catch + Http2UpgradeHandler.upgradeDispatch cleanup.) | public-cve-replication |
http2_settings_ack_stream_cap_bypass |
http2 · http2-settings-ack-stream-cap-bypass | [CVE-2025-53506](CVE-2025-53506 (GHSA-25xr-qj8w-c4vf) — https://github.com/advisories/GHSA-25xr-qj8w-c4vf , https://www.openwall.com/lists/oss-security/2025/07/10/13 . Uncontrolled Resource Consumption in Apache Tomcat Coyote HTTP/2: at connection start the server's initial SETTINGS frame reduces SETTINGS_MAX_CONCURRENT_STREAMS to the configured cap (default 100), but Tomcat did not ENFORCE that reduced cap until the client acknowledged the SETTINGS frame (a SETTINGS frame with the ACK flag). A remote unauthenticated client that never sends the ACK immediately opens far more concurrent streams than the cap; Coyote accepts every stream, allocates a request/response processor + buffers per stream, never emits REFUSED_STREAM / GOAWAY, and exhausts memory and threads -> DoS. CVSS 3.1 7.5 HIGH (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H), CWE-400. Affected: Apache Tomcat 11.0.0-M1..11.0.8; 10.1.0-M1..10.1.42; 9.0.0.M1..9.0.106; 8.5.0..8.5.100 (EOL) (patched 11.0.9 / 10.1.43 / 9.0.107). DISTINCT from CVE-2023-44487 Rapid Reset (client RST_STREAM flood), CVE-2025-8671 MadeYouReset (server-emitted RST via a misuse frame) and CVE-2026-33871 CONTINUATION flood (single-stream header-decode pin): this attack sends NO RST_STREAM and NO misuse/CONTINUATION frame — it opens many complete concurrent streams past an un-enforced cap.) | public-cve-replication |
envoy_http3_qpack_blocked_decode_leak |
http3 · http3-qpack | [GHSA-p7c7-7c47-pwch](GHSA-p7c7-7c47-pwch — envoyproxy/envoy: 'HTTP/3 QPACK blocked-decoding memory exhaustion.' Envoy's HTTP/3 QPACK decoder mis-accounts QUIC flow control for BLOCKED header blocks: when a received field section references dynamic-table entries with a Required Insert Count higher than the entries actually inserted (the encoder-stream inserts have not arrived), the block cannot be decoded and is buffered on the decoder heap, yet 'stream-level and connection-level flow-control windows are returned to the peer even though the payload bytes are still resident in heap memory.' The attacker never sends the referenced inserts (blocks never unblock) and, because the credit was returned, progressively feeds more HEADERS payload bytes into this uncontrolled internal buffer, circumventing QUIC flow-control limits -> unbounded memory growth and DoS of the HTTP/3 stack. Severity High, CVSS 7.5 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H); no CVE assigned. Affected Envoy < 1.39; fixed 1.35.13, 1.36.9, 1.37.5, 1.38.3. No auth/privileges required. Advisory: https://github.com/envoyproxy/envoy/security/advisories/GHSA-p7c7-7c47-pwch) | public-cve-replication |
netty_http3_field_section_oom |
http3 · http3-qpack | [CVE-2026-44892](CVE-2026-44892 / GHSA-c2rx-5r8w-8xr2 — netty/netty (io.netty:netty-codec-http3 (Maven)): 'Vulnerable Default Configuration Which Leads to Denial of Service via Unbounded HTTP/3 Header Size.' Netty enforces safe 8192-byte header limits for HTTP/1.1 and HTTP/2, but the HTTP/3 Http3ConnectionHandler follows RFC 9114's unlimited default: when a peer omits HTTP3_SETTINGS_MAX_FIELD_SECTION_SIZE, maxHeaderListSize defaults to the virtually-unbounded (1L << 62) - 1. A peer that omits the setting and sends a HEADERS block with an enormous number of header fields makes the codec buffer field data until the JVM exhausts heap -> OutOfMemoryError (availability DoS, severity High, CVSS 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H; CWE-400 (Uncontrolled Resource Consumption); CWE-1188 (Insecure Default Initialization)). Fixed 4.2.15.Final (default replaced with a hardcoded 8192-byte cap Http3CodecUtils.DEFAULT_MAX_FIELD_SECTION_SIZE). Affected >= 4.2.0.Final, <= 4.2.14.Final. Advisory: https://github.com/netty/netty/security/advisories/GHSA-c2rx-5r8w-8xr2) | public-cve-replication |
ipfs_dht_sybil_censorship |
ipfs · libp2p-kad-dht | CVE-2023-26248 | public-cve-replication |
go_libp2p_oversized_rsa_key_cpu_burn |
libp2p · libp2p-security-handshake | CVE-2023-39533 | public-cve-replication |
gossipsub_ihave_iwant_flood |
libp2p · libp2p-gossipsub | CVE-2026-49866 | public-cve-replication |
gossipsub_prune_backoff_overflow |
libp2p · libp2p-gossipsub | CVE-2026-34219 | public-cve-replication |
gossipsub_subscribe_flood |
libp2p · libp2p-gossipsub | CVE-2026-46679 | public-cve-replication |
libp2p_autonatv2_nil_map_crash |
libp2p · libp2p-autonatv2 | public disclosure | public-cve-replication |
libp2p_conn_resource_exhaustion |
libp2p · libp2p-connection-setup | CVE-2022-23487 | public-cve-replication |
libp2p_dht_putvalue_disk_exhaustion |
libp2p · libp2p-kad-dht | CVE-2026-45783 | public-cve-replication |
libp2p_rendezvous_cookie_exhaustion |
libp2p · libp2p-rendezvous | CVE-2026-35457 | public-cve-replication |
libp2p_rendezvous_namespace_oom |
libp2p · libp2p-rendezvous | CVE-2026-35405 | public-cve-replication |
libp2p_signed_peer_record_flood |
libp2p · libp2p-gossipsub | CVE-2023-40583 | public-cve-replication |
libp2p_stream_exhaustion |
libp2p · libp2p-gossipsub | CVE-2022-23492 | public-cve-replication |
yamux_ping_flood_pending_frames_oom |
libp2p · libp2p-yamux | CVE-2024-32984 | public-cve-replication |
yamux_syn_oversized_body_panic |
libp2p · libp2p-yamux | CVE-2026-32314 | public-cve-replication |
namada_multisig_256key_sig_overflow |
namada · cometbft-rpc-http | GHSA-82vg-5v4f-f9wq | public-cve-replication |
namada_tx_repeated_sections_hash_blowup |
namada · cometbft-rpc-http | GHSA-f8qm-hmm3-fv7f | public-cve-replication |
nimiq_dht_get_first_record_poison |
nimiq · libp2p-kad-dht | CVE-2026-46541 | public-cve-replication |
nimiq_dht_sig_length_panic |
nimiq · libp2p-kad-dht | CVE-2026-40092 | public-cve-replication |
nimiq_proposal_signer_oob |
nimiq · libp2p-gossipsub | CVE-2026-32605 | public-cve-replication |
substrate_h2_rapid_reset |
polkadot · substrate-rpc-http2 | [CVE-2023-26964](CVE-2023-26964 (RUSTSEC-2023-0034 / GHSA-f8vr-r385-rh5r) — https://nvd.nist.gov/vuln/detail/CVE-2023-26964, https://rustsec.org/advisories/RUSTSEC-2023-0034.html . HTTP/2 Rapid Reset (CVE-2023-44487 class) resource-exhaustion DoS in the Rust h2 crate < 0.3.17: a flood of HEADERS/RST_STREAM frames grows the pending-accept-reset stream queue unbounded in memory -> OOM. CVSS 3.1 7.5 HIGH (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H), CWE-770. Consumed by substrate/polkadot via hyper on the RPC & prometheus HTTP servers; bumped 0.3.16 -> 0.3.17 in paritytech/substrate#13915 (https://github.com/paritytech/substrate/pull/13915). Fix: hyperium/h2#668 (https://github.com/hyperium/h2/pull/668) adds max_pending_accept_reset_streams + GOAWAY(ENHANCE_YOUR_CALM).) | public-cve-replication |
coredns_doq_stream_slowloris |
quic · quic-transport / dns-over-quic | [CVE-2025-47950](CVE-2025-47950 / GHSA-cvx7-x8pj-x2gw — CoreDNS DNS-over-QUIC (DoQ) memory exhaustion via stream amplification (CoreDNS < 1.12.2): the DoQ server spawns a goroutine per QUIC stream with no stream/goroutine limit and reads the DoQ length prefix + body with blocking io.ReadFull() calls that have no per-stream read deadline; opening many streams and sending 1 byte on each pins goroutines -> OOM. https://github.com/coredns/coredns/security/advisories/GHSA-cvx7-x8pj-x2gw) | public-cve-replication |
dnsdist_doq_concurrent_conn_exhaustion |
quic · quic-transport / dns-over-quic + dns-over-http3 | [CVE-2026-33254](CVE-2026-33254 / PowerDNS Security Advisory 2026-04 (dnsdist) — PowerDNS dnsdist DoQ/DoH3 concurrent-connection memory exhaustion: the DNS-over-QUIC (addDOQLocal) and DNS-over-HTTP/3 (addDOH3Local) frontends commit per-connection state with no cap on the number of concurrent DoQ/DoH3 connections, so an attacker opening many concurrent connections drives unbounded memory growth -> DoS (CWE-770). DoQ/DoH3 are off by default (CVSS 5.3). https://dnsdist.org/security-advisories/powerdns-advisory-2026-04.html) | public-cve-replication |
dnsdist_doq_error_query_mem_leak |
quic · quic-transport / dns-over-quic / dns-over-http3 | [CVE-2026-33595](CVE-2026-33595 / PowerDNS Security Advisory 2026-04 — PowerDNS dnsdist DoQ/DoH3 memory exhaustion via error-triggering queries: over a single DNS-over-QUIC or DNS-over-HTTP3 connection an attacker sends a large run of error-triggering DNS queries; dnsdist attaches per-error bookkeeping to the connection and does not free it until the connection closes, so memory accumulates without bound -> DoS. CWE-400; CVSS 3.1 Medium (~5.3) (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L). DoQ/DoH3 listeners are OFF BY DEFAULT.) | public-cve-replication |
lsquic_initial_prehandshake_leak |
quic · quic-transport-initial-coalescing | [CVE-2025-54939](CVE-2025-54939 (QUIC-LEAK) — Imperva disclosure (https://www.imperva.com/blog/quic-leak-cve-2025-54939-new-high-risk-pre-handshake-remote-denial-of-service-in-lsquic-quic-implementation/); LiteSpeed advisory https://blog.litespeedtech.com/2025/08/18/litespeed-security-update/. LSQUIC ('LiteSpeed QUIC (LSQUIC) Library LSQUIC Engine Packet In Memory Leak') coalesces multiple QUIC packets per UDP datagram and allocates one packet_in per coalesced packet; when trailing coalesced Initial packets fail DCID validation, lsquic_engine.c frees only the first packet's packet_in and never calls lsquic_mm_put_packet_in for the rest -> pre-handshake memory leak that bypasses all post-handshake connection/stream/flow limits -> OOM ( |
public-cve-replication |
msquic_dup_tp_versioninfo_leak |
quic · quic-tls-handshake | [CVE-2024-26190](CVE-2024-26190 / GHSA-2x7m-gf85-3745 — microsoft/msquic: 'Remote Denial of Service Vulnerability' — memory leak from multiple decodes of the QUIC transport parameters TLS extension. A remote unauthenticated peer sends a ClientHello whose TLS extension list contains multiple duplicate quic_transport_parameters extensions (ext type 0x0039), each carrying a version_information transport parameter (TP id 0x11); QuicCryptoTlsReadExtensions did not reject the duplicate, so QuicCryptoTlsDecodeTransportParameters ran once per occurrence, each CXPLAT_ALLOC'ing a fresh VersionInfo (QUIC_POOL_VERSION_INFO) and then zeroing the struct without freeing the prior pointer -> one leaked allocation per duplicate. 'The MsQuic server will continue to leak memory until no more is available, resulting in a denial of service.' CVSS 3.1 7.5 (High; CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H). Affected msquic < 2.1.12 (2.1.x), < 2.2.7 (2.2.x), < 2.3.5; fixed 2.1.12, 2.2.7, 2.3.5 (commit d364feeda0dd). Advisory: https://github.com/microsoft/msquic/security/advisories/GHSA-2x7m-gf85-3745) | public-cve-replication |
quic_conn_id_memory_exhaustion |
quic · quic-transport | [CVE-2024-22189](CVE-2024-22189 / GHSA-c33x-xqrf-c478 — quic-go < 0.42.0: 'QUIC's Connection ID Mechanism vulnerable to Memory Exhaustion Attack'. https://github.com/quic-go/quic-go/security/advisories/GHSA-c33x-xqrf-c478) | public-cve-replication |
quic_go_path_challenge_flood |
quic · quic-transport | [CVE-2023-49295](CVE-2023-49295 / GHSA-ppxx-5m9h-6vxf — quic-go/quic-go: 'Memory Exhaustion Attack against QUIC's Path Validation Mechanism.' An attacker floods the peer with a large number of PATH_CHALLENGE frames (RFC 9000 §8.2 requires a PATH_RESPONSE for each), then prevents those responses from being sent by collapsing the peer's congestion window (selective ACK) and manipulating its RTT estimate — so the un-sendable PATH_RESPONSE frames queue internally without bound, exhausting memory (availability DoS, severity Moderate). No workaround; the fix bounds retained path-validation state. Affected quic-go v0.40.0, <= v0.39.3, <= v0.38.1, <= v0.37.6; fixed v0.40.1, v0.39.4, v0.38.2, v0.37.7. Reported by marten-seemann. Advisory: https://github.com/quic-go/quic-go/security/advisories/GHSA-ppxx-5m9h-6vxf) | public-cve-replication |
quic_go_qpack_decompression_bomb |
quic · http3-qpack | [CVE-2025-64702](CVE-2025-64702 / GHSA-g754-hx8w-x2g6 — quic-go/quic-go: 'HTTP/3 QPACK Header Expansion Memory Exhaustion.' quic-go's HTTP/3 decoder limits the ENCODED HEADERS frame size (1 MB (http3.Server.MaxHeaderBytes) server / 10 MB (http3.Transport.MaxResponseHeaderBytes) client) but not the DECODED field-section size. A crafted QPACK HEADERS block that densely references long static-table entries decompresses to ~50x its encoded size; RFC 9114 requires enforcing SETTINGS_MAX_FIELD_SECTION_SIZE, which quic-go <= v0.56.0 did not, so the decoder allocates the fully-expanded field section unbounded -> memory exhaustion (availability DoS, severity Moderate, CVSS 5.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L). Fixed v0.57.0 (SETTINGS_MAX_FIELD_SECTION_SIZE + incremental QPACK decoding, abort early). Affected quic-go <= v0.56.0. Reported by sfoxio. Advisory: https://github.com/quic-go/quic-go/security/advisories/GHSA-g754-hx8w-x2g6) | public-cve-replication |
quic_optimistic_ack_cwnd_growth |
quic · quic-1rtt-ack | [CVE-2025-4820](CVE-2025-4820 / GHSA-2v9p-3p3h-w56j — https://github.com/cloudflare/quiche/security/advisories/GHSA-2v9p-3p3h-w56j (see also https://blog.cloudflare.com/defending-quic-from-acknowledgement-based-ddos-attacks/ and RFC 9000 §21.4 Optimistic ACK Attack). cloudflare/quiche < 0.24.4 incorrectly grows its congestion window in response to ACK frames that acknowledge packets the peer never received (optimistic / opportunistic ACK), allowing more bytes in flight than the path supports and transmission faster than the path can handle. Fixed in quiche 0.24.4 (dynamic CWND-aware packet-number skipping so a forward ACK for a not-yet-sent packet number is caught).) | public-cve-replication |
quic_scid_collision_hash_dos |
quic · quic-transport | [CVE-2025-47200](CVE-2025-47200 — NCC Group / Fox-IT technical advisory 'Hash Denial-of-Service Attack in Multiple QUIC Implementations'. QUIC servers index the connection table by the peer-chosen Source Connection ID (SCID, 8..20 bytes). Implementations hashing the SCID with a weak non-seeded function (FNV, xxHash, or a multiplicative hash = hash*31 + char) let an attacker pre-compute DISTINCT SCIDs that all collide into one bucket; opening many such connections degrades table insert/lookup from O(1) to O(n) (amortised O(n^2)), burning server CPU. Only SipHash resists it. Affected: xquic <= 1.8.1 (fixed 1.8.2), Apache Traffic Server <= 10.0.3 / 9.2.x <= 9.2.8, ngtcp2 1.10.0 example server (all CVE-2025-47200); kwik <= 0.10.0 (CVE-2025-23020, fixed 0.10.1); lsquic <= 4.0.12 (CVE-2025-24947, fixed 4.2.0); picoquic commit 3827b00 (CVE-2025-24946, fixed b80fd3f). https://www.nccgroup.com/research/technical-advisory-hash-denial-of-service-attack-in-multiple-quic-implementations/) |
public-cve-replication |
quiche_0rtt_packet_len_panic |
quic · quic-transport | public disclosure | public-cve-replication |
quiche_ack_never_sent_cwnd |
quic · quic-1rtt-ack | [CVE-2025-4821](CVE-2025-4821 / GHSA-6m38-4r9r-5c4m — https://github.com/cloudflare/quiche/security/advisories/GHSA-6m38-4r9r-5c4m (NVD: https://nvd.nist.gov/vuln/detail/CVE-2025-4821 ; see also https://blog.cloudflare.com/defending-quic-from-acknowledgement-based-ddos-attacks/ and RFC 9000 §19.3/§21.4). cloudflare/quiche < 0.24.4 incorrectly grows its congestion window in response to ACK frames covering a large range of packet numbers INCLUDING packet numbers that were NEVER SENT (invalid ACK ranges) — allowing more bytes in flight than the path supports and, in the extreme case, growing the window beyond the limit of the internal variable's type, causing an OVERFLOW PANIC. Fixed in quiche 0.24.4 (proper ACK-range validation rejecting ranges over never-sent packet numbers).) | public-cve-replication |
quiche_conn_id_retirement_unbounded |
quic · quic-transport | [CVE-2024-1410](CVE-2024-1410 / GHSA-xhg9-xwch-vr7x — Cloudflare quiche (< 0.19.2; >= 0.20.0, < 0.20.1): 'quiche vulnerable to unbounded storage of information related to connection ID retirement'. https://github.com/advisories/GHSA-xhg9-xwch-vr7x) | public-cve-replication |
quiche_crypto_frame_flood |
quic · quic-transport | [CVE-2024-1765](CVE-2024-1765 / GHSA-78wx-jg4j-5j6g — cloudflare/quiche: 'Unlimited resource allocation by QUIC CRYPTO frames flooding.' A remote peer repeatedly sends an unlimited number of QUIC CRYPTO frames (type 0x06) over an established connection; quiche buffered the CRYPTO reassembly stream without bounding total retained state, so the flood makes memory usage of the quiche server OR client climb for the duration of the connection (availability DoS, CVSS 3.1 5.9). Affected quiche <= 0.19.1, 0.20.0; fixed in 0.19.2, 0.20.1. Reported by Marten Seemann. Advisory: https://github.com/cloudflare/quiche/security/advisories/GHSA-78wx-jg4j-5j6g) | public-cve-replication |
quiche_nonutf8_close_panic |
quic · quic-transport | public disclosure | public-cve-replication |
quiche_path_challenge_queue |
quic · quic-transport | [CVE-2023-6193](CVE-2023-6193 / GHSA-w3vp-jw9m-f9pm — cloudflare/quiche: 'Unbounded queuing of path validation messages.' QUIC path validation (RFC 9000 §8.2) makes the recipient of a PATH_CHALLENGE frame (type 0x1a) reply with a PATH_RESPONSE (type 0x1b) echoing the 8-byte challenge. An unauthenticated remote attacker sends PATH_CHALLENGE frames — changing source address so each path migration forces path validation — and manipulates the connection (e.g. restricting the peer's congestion window) so PATH_RESPONSEs can only be sent slower than PATH_CHALLENGEs are received; quiche stores the path-validation data in an UNBOUNDED queue, so memory grows without limit for the connection's lifetime (availability DoS, CWE-400, CVSS 3.1 5.3 Moderate). Affected quiche 0.15.0 through 0.19.0; fixed in 0.19.1. Advisory: https://github.com/cloudflare/quiche/security/advisories/GHSA-w3vp-jw9m-f9pm) | public-cve-replication |
quiche_payload_overflow_crash |
quic · quic-transport | public disclosure | public-cve-replication |
quiche_retire_cid_loop |
quic · quic-transport | CVE-2025-7054 | public-cve-replication |
quinn_gap_fragment_reassembly_oom |
quic · quic-transport-stream-reassembly | [GHSA-4w2j-m93h-cj5j](GHSA-4w2j-m93h-cj5j (https://github.com/advisories/GHSA-4w2j-m93h-cj5j) / RUSTSEC-2026-0185 (https://rustsec.org/advisories/RUSTSEC-2026-0185.html) — quinn-proto: remote memory exhaustion from unbounded out-of-order stream reassembly. The per-stream Assembler retains out-of-order received STREAM data until a contiguous prefix can be delivered; a peer sending many small STREAM fragments at gapped (non-contiguous) offsets forces un-coalescible entries whose per-fragment overhead grows without bound while never becoming deliverable.) |
public-cve-replication |
quinn_large_client_hello_panic |
quic · quic-transport | public disclosure | public-cve-replication |
quinn_unknown_frame_panic |
quic · quic-transport | CVE-2023-42805 | public-cve-replication |
s2n_quic_crypto_offset_amplification |
quic · quic-transport | [CVE-2026-10740](CVE-2026-10740 / GHSA-9q54-f358-3fqf — aws/s2n-quic: CRYPTO-frame offset amplification. The CRYPTO-frame reassembly buffer lacks maximum-size enforcement, so a CRYPTO frame (type 0x06) carrying an artificially HIGH offset forces the receiver to reserve reassembly buffer up to that offset even though the delivered body is tiny: a single |
public-cve-replication |
s2n_quic_stream_limit_exhaustion |
quic · quic-transport | [GHSA-475v-pq2g-fp9g](GHSA-475v-pq2g-fp9g — AWS s2n-quic <= v1.30.0: 's2n-quic potential denial of service via crafted stream frames' — uncontrolled stream-limit increase when closing remote-initiated streams. https://github.com/aws/s2n-quic/security/advisories/GHSA-475v-pq2g-fp9g) | public-cve-replication |
Distribution: 1384 public-cve-replication attack bundles — 130 distinct primitives
across 17 chains (Bitcoin, Cosmos, Dogecoin, Ethereum, http2, http3, ipfs, libp2p, Litecoin, Monero, namada, nimiq, polkadot, quic, Solana, Sui, Zcash) — plus 579 benign. This published cut contains
no original bundles; the original RPC-measurement primitives live in the full internal corpus
and ship only if the operator explicitly opts in, always under their honest label.
Training procedure (methodology is the contribution)
Per NullRabbit's pre-registration discipline: the corpus is built attack-by-attack from a public
disclosure with provenance.public_source; a Cleanlab data-quality scan gates label-issues and
duplicates before training; a methodology auditor reviews each gate event with sanity floors and
falsification holdouts; honest limitations are stated; cycles — not the final number — are the
contribution. This card + model are regenerated automatically from the cut on each training run, so
the numbers below always match the shipped model.
Evaluation
Diagnostic ML checks (the corpus of faithfully-modelled public attacks is the deliverable; these are
secondary). Reproduced by scripts/known_class_loco_eval.py + scripts/corpus_quality.py.
- Within-corpus held-out — binary attack-vs-benign ROC-AUC, GroupKFold by primitive: 0.9757.
corpus_sha256 known-class-v10-publiccve. - Leave-one-chain-out — binary ROC-AUC (HARD zero-shot transfer, not a deployment metric): Dogecoin 1.000 / Sui 1.000 / Ethereum 0.981 / Litecoin 0.975 / Cosmos 0.961 / Bitcoin 0.908 / Solana 0.892 / libp2p 0.858 / Monero 0.837 / Zcash 0.627. Chains with few public-CVE primitives have the fewest cross-chain near-neighbours; the companion
nr-bundles-publicdataset card reports the stricter held-out-chain 7-class family macro-F1 (0.17 Sui / 0.35 Solana vs ~0.14 floor). Reported honestly, not a deployment claim. - Leave-one-attack-primitive-out within Bitcoin (leak-clean disjoint-benign): all Bitcoin primitives ≥ 0.988. Detection is on traffic shape, not deep wire-semantics.
Intended uses
Research and benchmarking of network/resource-abuse detection on blockchain infrastructure; a worked, public-provenance reference corpus; downstream training. Not a turnkey production IDS.
Limitations
- Synthetic lab fidelity — generated localnet traffic, not a real-world deployment claim. A deployment claim needs a real-traffic validation gate (real mainnet RPC + real attack instances).
- Detection is on traffic shape (volume / rate / size / connection-churn), not deep wire semantics — adequate for these volumetric/crash DoS classes; it would not separate two attacks with identical traffic profiles.
- No host-load features (root-owned container).
- This is the public-CVE cut — every shipped attack class reproduces an external public disclosure.
The
originalRPC-amplification measurements (vendor-acknowledged but not CVE-backed) are excluded from this model; they exist in the full internal corpus and ship only on explicit operator opt-in.
How to use
from predict import load, predict
model = load("model.joblib")
out = predict(model, [{"pcap.packet_rate": 850.0, "resp.amp_ratio_max": 224.0}])
# -> [{"scoreable": True, "score": ..., "verdict": "attack"|"benign", "threshold": 0.5}]
Run python inference_example.py for a worked example on real captured vectors.
Reproduce or train your own. A self-contained, runnable example that trains a family
(mechanism) detector on the openly-available bundles — download → read manifest + Parquet →
featurise → train → evaluate both in-distribution and cross-chain (leave-one-chain-out) — is
in nr-bundle-spec:
examples/train_a_family_detector.py
(and the matching .ipynb).
The leave-one-chain-out number it reports is the earned-autonomy line — where the mechanism
signal genuinely transfers to a chain the detector never trained on, and where it does not (so
the honest move is to gate the detector to chains you have data for). See
docs/integration-bundles-taxonomy-autonomy.md.
Licensing
Apache-2.0 (see LICENSE). Attribution appreciated.
Citation
@software{nullrabbit_network_known_class_2026,
author = {NullRabbit Labs},
title = {nr-network-known-class-detector: a public-provenance blockchain network-attack detector},
year = {2026},
url = {https://huggingface.co/NullRabbit/nr-network-known-class-detector}
}
Related: the open bundle format (nr-bundle-spec), the family taxonomy (mechanism-defined),
the earned-autonomy framework (Zenodo 10.5281/zenodo.18406828),
the dataset NullRabbit/nr-bundles-public, and nullrabbit.ai.
Contact
NullRabbit Labs — huggingface.co/NullRabbit · nullrabbit.ai
- Downloads last month
- 209