File size: 14,886 Bytes
215671c fadaaab 215671c fadaaab 215671c 0db859a 215671c 0db859a fadaaab 215671c fadaaab 0db859a fadaaab 0db859a fadaaab 0db859a fadaaab 0db859a fadaaab 215671c fadaaab 215671c 0db859a 215671c fadaaab 215671c fadaaab 215671c fadaaab 215671c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | ---
license: apache-2.0
library_name: scikit-learn
tags:
- cybersecurity
- blockchain
- network-security
- validator-security
- anomaly-detection
- intrusion-detection
- ddos
- cve
datasets:
- NullRabbit/nr-bundles-public
metrics:
- roc_auc
- f1
---
# 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 9 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=False` with no verdict.
## Training data — 47 public-CVE attack primitives, 9 chains, 1434 bundles
**This is the public-CVE cut** (`public-cve-replication` only): 966 attack + 468 benign
bundles (`pcap + responses + manifest`), 53 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 |
|---|---|---|---|
| `btc_addr_overflow_flood` | Bitcoin / Dogecoin / Litecoin · p2p | [CVE-2024-52919](https://bitcoincore.org/en/2025/04/28/disclose-cve-2024-52919/) | public-cve-replication |
| `btc_alert_flood` | Bitcoin · p2p | [CVE-2016-10724](https://nvd.nist.gov/vuln/detail/CVE-2016-10724) | public-cve-replication |
| `btc_blocktxn_double_fillblock` | Bitcoin · p2p | [CVE-2024-35202](https://bitcoincore.org/en/2024/10/08/disclose-blocktxn-crash/) | public-cve-replication |
| `btc_bloom_divzero` | Bitcoin · p2p | [CVE-2013-5700](https://nvd.nist.gov/vuln/detail/CVE-2013-5700) | public-cve-replication |
| `btc_cmpctblock_overflow` | Bitcoin · p2p | [CVE-2025-46597](https://bitcoincore.org/en/2025/10/24/disclose-cve-2025-46597/) | public-cve-replication |
| `btc_cmpctblock_stall` | Bitcoin · p2p | [CVE-2024-52922](https://bitcoincore.org/en/2024/11/05/cb-stall-hindering-propagation/) | public-cve-replication |
| `btc_getdata_flood` | Bitcoin · p2p | [CVE-2024-52920](https://bitcoincore.org/en/2024/07/03/disclose-getdata-cpu/) | public-cve-replication |
| `btc_headers_genesis_spam` | Bitcoin · p2p | [CVE-2024-52916](https://bitcoincore.org/en/2024/07/03/disclose-header-spam/) | public-cve-replication |
| `btc_headers_oom` | Bitcoin · p2p | [CVE-2019-25220](https://bitcoincore.org/en/2024/09/18/disclose-headers-oom/) | public-cve-replication |
| `btc_inv_buffer_blowup` | Bitcoin · p2p | [CVE-2024-52915](https://bitcoincore.org/en/2024/07/03/disclose-inv-buffer-blowup/) | public-cve-replication |
| `btc_inv_eviction_jam` | Bitcoin · p2p | [CVE-2024-52913](https://bitcoincore.org/en/2024/07/03/disclose_already_asked_for/) | public-cve-replication |
| `btc_invalid_block_logfill` | Bitcoin · p2p | [CVE-2025-54605](https://bitcoincore.org/en/2025/10/24/disclose-cve-2025-54605/) | public-cve-replication |
| `btc_invdos_flood` | Bitcoin · p2p | [CVE-2018-17145](https://invdos.net/) | public-cve-replication |
| `btc_mutated_block` | Bitcoin · p2p | [CVE-2024-52921](https://bitcoincore.org/en/2024/10/08/disclose-mutated-blocks-hindering-propagation/) | public-cve-replication |
| `btc_orphan_cpu` | Bitcoin / Dogecoin / Litecoin · p2p | [CVE-2024-52914](https://bitcoincore.org/en/2024/07/03/disclose-orphan-dos/) | public-cve-replication |
| `btc_oversized_recv_buffer` | Bitcoin · p2p | [CVE-2015-3641](https://bitcoincore.org/en/2024/07/03/disclose_receive_buffer_oom/) | public-cve-replication |
| `btc_tx_maprelay` | Bitcoin · p2p | [CVE-2013-4627](https://nvd.nist.gov/vuln/detail/CVE-2013-4627) | public-cve-replication |
| `btc_tx_quad_sighash` | Bitcoin · p2p | [CVE-2025-46598](https://bitcoincore.org/en/2025/10/24/disclose-cve-2025-46598/) | public-cve-replication |
| `btc_version_selfnonce` | Bitcoin · p2p | [CVE-2025-54604](https://bitcoincore.org/en/2025/10/24/disclose-cve-2025-54604/) | public-cve-replication |
| `btc_version_timestamp_overflow` | Bitcoin · p2p | [CVE-2024-52912](https://bitcoincore.org/en/2024/07/03/disclose-timestamp-overflow/) | public-cve-replication |
| `p2p_getheaders_drain` | Bitcoin / Dogecoin / Litecoin · p2p | [CVE-2023-33297](https://nvd.nist.gov/vuln/detail/CVE-2023-33297) | public-cve-replication |
| `cometbft_bitarray_mismatch` | Cosmos · cometbft-p2p-secretconn | [GHSA-hrhf-2vcr-ghch](https://github.com/cometbft/cometbft/security/advisories/GHSA-hrhf-2vcr-ghch) | public-cve-replication |
| `cometbft_blockpart_mismatch` | Cosmos · cometbft-p2p-secretconn | [GHSA-r3r4-g7hq-pq4f](https://github.com/advisories/GHSA-r3r4-g7hq-pq4f) | public-cve-replication |
| `cometbft_voteext_panic` | Cosmos · cometbft-p2p-secretconn | [GHSA-p7mv-53f2-4cwj](https://github.com/cometbft/cometbft/security/advisories/GHSA-p7mv-53f2-4cwj) | public-cve-replication |
| `cosmos_gogoproto_skippy` | Cosmos · rpc-broadcast-tx | [CVE-2021-3121](https://osv.dev/vulnerability/CVE-2021-3121) | public-cve-replication |
| `cosmos_group_divzero_halt` | Cosmos · rpc-group-module-tx | [GHSA-x5vx-95h7-rv4p](https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-x5vx-95h7-rv4p) | public-cve-replication |
| `cosmos_p2p_conn_flood` | Cosmos · tcp-p2p-conn-flood | [CVE-2020-5303](https://github.com/tendermint/tendermint/security/advisories/GHSA-v24h-pjjv-mcp6) | public-cve-replication |
| `cosmos_protobuf_nest_bomb` | Cosmos · rpc-broadcast-tx | [GHSA-8wcc-m6j2-qxvm](https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-8wcc-m6j2-qxvm) | public-cve-replication |
| `geth_devp2p_ping_flood` | Ethereum · devp2p-rlpx | [CVE-2023-40591](https://github.com/ethereum/go-ethereum/security/advisories/GHSA-ppjg-v974-84cm) | public-cve-replication |
| `geth_eth_receipt_flood` | Ethereum · devp2p-rlpx | [EL-2024-20](https://reports.immunefi.com/ethereum-protocol-or-attackathon/37466-bc-medium-evil-client-oom-crash-fast-p2p-crash) | public-cve-replication |
| `geth_getblockheaders_count_zero` | Ethereum · devp2p-rlpx | [CVE-2024-32972](https://github.com/ethereum/go-ethereum/security/advisories/GHSA-4xc9-8hmq-j652) | public-cve-replication |
| `geth_rlpx_auth_flood` | Ethereum · devp2p-rlpx | [EL-2026-06](https://notes.ethereum.org/gDWKW5RtSym02t2aGYkmSQ) | public-cve-replication |
| `geth_snap_trienode_dos` | Ethereum · devp2p-rlpx | [CVE-2021-41173](https://github.com/ethereum/go-ethereum/security/advisories/GHSA-59hh-656j-3p7v) | public-cve-replication |
| `geth_tcp_handshake_flood` | Ethereum · devp2p-rlpx | [EL-2024-06](https://reports.immunefi.com/ethereum-protocol-or-attackathon/37120-bc-insight-remote-handshake-based-tcp-30303-flooding-leads-to-an-out-of-memory-crash) | public-cve-replication |
| `monero_levin_array_memcorrupt` | Monero · levin-p2p | [CVE-2018-3972](https://www.talosintelligence.com/vulnerability_reports/TALOS-2018-0637) | public-cve-replication |
| `monero_portable_storage_oom` | Monero · levin-p2p | [PR#7190](https://github.com/monero-project/monero/pull/7190) | public-cve-replication |
| `monero_rpc_conn_exhaustion` | Monero · http-rpc | [CVE-2025-26819](https://nvd.nist.gov/vuln/detail/CVE-2025-26819) | public-cve-replication |
| `sol_tpu_quic_handshake_flood` | Solana · tpu-quic | [ND-FD04-LO-01](https://neodyme.io/reports/Firedancer-v0.4.pdf) | public-cve-replication |
| `sol_tpu_quic_initial_cpu` | Solana · tpu-quic | [ND-FD1-MD-02](https://neodyme.io/reports/Firedancer.pdf) | public-cve-replication |
| `sol_tpu_quic_slowloris` | Solana · tpu-quic | [ND-FD04-IN-02](https://neodyme.io/reports/Firedancer-v0.4.pdf) | public-cve-replication |
| `sui_disassemble_panic` | Sui · json-rpc | [CertiK Skyfall](https://medium.com/certik-skyfall/blockchain-rpc-vulnerabilities-why-memory-safe-blockchain-rpc-nodes-are-not-panic-free-9fbb990115e0) | public-cve-replication |
| `sui_move_recursion` | Sui · json-rpc | [CVE-2023-36184](https://nvd.nist.gov/vuln/detail/CVE-2023-36184) | public-cve-replication |
| `sui_verifier_hamsterwheel` | Sui · json-rpc | [CertiK Skyfall HamsterWheel](https://medium.com/certik-skyfall/the-hamsterwheel-an-in-depth-exploration-of-a-novel-attack-vector-on-the-sui-blockchain-522f80623bc7) | public-cve-replication |
| `gossipsub_prune_backoff_overflow` | libp2p · libp2p-gossipsub | [CVE-2026-34219](https://github.com/libp2p/rust-libp2p/security/advisories/GHSA-xqmp-fxgv-xvq5) | public-cve-replication |
| `gossipsub_subscribe_flood` | libp2p · libp2p-gossipsub | [CVE-2026-46679](https://github.com/advisories/GHSA-4f8r-922h-2vgv) | public-cve-replication |
| `libp2p_signed_peer_record_flood` | libp2p · libp2p-gossipsub | [CVE-2023-40583](https://github.com/advisories/GHSA-gcq9-qqwx-rgj3) | public-cve-replication |
| `libp2p_stream_exhaustion` | libp2p · libp2p-gossipsub | [CVE-2022-23492](https://github.com/advisories/GHSA-j7qp-mfxf-8xjw) | public-cve-replication |
Distribution: **966** `public-cve-replication` attack bundles — **47 distinct primitives
across 9 chains** (Bitcoin, Cosmos, Dogecoin, Ethereum, libp2p, Litecoin, Monero, Solana, Sui) — plus **468** 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.9563.** `corpus_sha256 known-class-v10-publiccve`.
- **Leave-one-chain-out — binary ROC-AUC (HARD zero-shot transfer, *not* a deployment metric):** Dogecoin 1.000 / Litecoin 1.000 / Sui 1.000 / Ethereum 0.996 / Cosmos 0.964 / Bitcoin 0.897 / libp2p 0.887 / Monero 0.770 / Solana 0.625. Chains with few public-CVE primitives have the fewest cross-chain near-neighbours; the companion [`nr-bundles-public`](https://huggingface.co/datasets/NullRabbit/nr-bundles-public) dataset 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 `original` RPC-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
```python
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.
## Licensing
Apache-2.0 (see `LICENSE`). Attribution appreciated.
## Citation
```bibtex
@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](https://doi.org/10.5281/zenodo.18406828)),
the dataset `NullRabbit/nr-bundles-public`, and [nullrabbit.ai](https://nullrabbit.ai).
## Contact
NullRabbit Labs — [huggingface.co/NullRabbit](https://huggingface.co/NullRabbit) · [nullrabbit.ai](https://nullrabbit.ai)
|