
Rust-Detektor und lokales Labor für CVE-2026-98432, einen Linux-IPv4-TCP-Use-after-free in inet_opt/ireq_opt: statische ELF-Analyse, kprobe-Erreichbarkeitsprüfungen und ein Race-Trigger.
inet_opt / ireq_opt)Forschungs-PoC und lokales Labor für einen Use-after-free im Linux-Kernel, der von einem einfachen IPv4-TCP-Listener aus erreichbar ist. Dies ist ein Fehlerdetektor/-auslöser, kein Exploit.
7.0.0-38-generic) verwundbar:
inet_sock_destruct() und tcp_v4_reqsk_destructor() geben die Optionen mit
kfree() statt mit kfree_rcu() frei.kfree-Pfad ist zur Laufzeit erreichbar (kprobes).free -> use-Ereignisse (via=reqsk) gesehen und konnten sie nicht
zuverlässig reproduzieren.tcp2kaslr endet ebenfalls beim Fehlerauslöser; spätere Stufen sind
nicht veröffentlicht.CONFIG_KASAN deaktiviert und die KFENCE-Sampling ist ausgeschaltet.tcp2kaslr)MPTCP ist nicht erforderlich. Der bewiesene Pfad ist einfaches IPv4-TCP:
ireq_opt).accept()t das Child, setzt SO_LINGER(0) und schließt es.
inet_sock_destruct() gibt die Optionen mit kfree() frei.Unser früherer Auslöser war in zweierlei Hinsicht falsch: Der Victim hat das
Child nie akzeptiert/geschlossen (free_sock=0), und wir haben ein RST gesendet, anstatt uns auf das Server-Close zu verlassen.
Der aktuelle Code ergänzt die korrekten Teile:
listen --accept-close — accept + SO_LINGER(0) + close.--sync — ACK + doppeltes SYN gleichzeitig, kein RST, Record-Route-Optionen.Der Upstream-Fix lautet genau:
- kfree(rcu_dereference_protected(inet->inet_opt, 1));
+ kfree_rcu(rcu_dereference_protected(inet->inet_opt, 1), rcu);
und dieselbe Änderung in tcp_v4_reqsk_destructor().
| Pfad | Was |
|---|---|
rust-poc/ | der native Rust-PoC: statische ELF-Analyse, kprobes, Trigger-Modi |
lab/ | Alpine + PHP Loopback-Opfer für die alten lokalen Tests |
scripts/ | lokale Repro-Helfer, Helfer für autorisierte Audits |
docs/FINDINGS.md | was getestet wurde, was bestätigt wurde, was nicht |
docs/EXPLOITATION-NOTES.md | Umfang: nur Bug-Trigger, kein RCE |
docs/evidence/ | bereinigte Beispiel-Evidenz |
cd rust-poc
cargo build --release
# static analysis (no root)
./target/release/cve-2026-98432 static
# runtime reachability (root, tracefs)
sudo ./target/release/cve-2026-98432 runtime
# correct local vector: accept+close server + --sync trigger
cd ..
PASSES=1 ./scripts/repro-sync.sh 8083
repro-sync.sh startet das --accept-close-Opfer auf 127.0.0.1:8083, führt den
Sync-Trigger mit sudo aus und gibt free_sock, use_build und das UAF-
Urteil aus. Ein sauberer Lauf ist kein Beweis für Sicherheit: Die Rate liegt bei etwa 1e-7 pro
Versuch und die Ereignisse treten gehäuft auf.
Wenn artifacts/ fehlt, greifen static/runtime auf /boot zurück; das
Legacy-Skript scripts/cve-2026-98432.sh --static kann die Kernel-Artefakte erzeugen.
Mit KASAN meldet der Kernel einen slab-use-after-free in
inet_csk_route_req / ip_options_build mit dem Free-Stack in
inet_sock_destruct / inet_release. Die tcp2kaslr-Harness erreicht dies in
etwa 134k Versuchen mit KASAN; auf einem normalen Kernel wurde dieselbe Race nur
zweimal in ~48M Versuchen beobachtet.
Testen Sie nur Kernel und Hosts, die Ihnen gehören oder für die Sie ausdrücklich autorisiert sind zu testen. Der Trigger ist eine Kernel-Race und kann den Host zum Absturz bringen. Verwenden Sie eine Wegwerf-VM mit einem Snapshot.
offline-ant/tcp2kaslr — Bug-Trigger, KASAN-Nachweis, Analyse:
https://github.com/offline-ant/tcp2kaslripv4: free inet_opt and ireq_opt after an RCU grace period
(Eric Dumazet), kfree → kfree_rcu in net/ipv4/af_inet.c und
net/ipv4/tcp_ipv4.c.MIT. Siehe LICENSE.