
Prova de conceito verificada com KASAN que reproduz o CVE-2026-98432, um use-after-free em inet_opt/ireq_opt do TCP IPv4 do kernel Linux, com harness de corrida entre CPUs e controle de kernel corrigido.
Use-after-free em inet_opt/ireq_opt do TCP IPv4 do kernel Linux (CVSS 9.8).
Um SYN com opções de cabeçalho IPv4 tem suas opções salvas no socket de requisição.
Quando o handshake é concluído, tcp_v4_syn_recv_sock() entrega o mesmo buffer
ao socket filho por ponteiro, sem cópia. Um SYN retransmitido em outra CPU
lê esse buffer em tcp_v4_send_synack()/inet_csk_route_req() enquanto o filho
já não existe mais (inet_sock_destruct() o liberou com um simples kfree(); sockets
filhos não têm SOCK_RCU_FREE). A correção consiste em duas chamadas kfree_rcu(), aplicadas no
6.6.159 e versões relacionadas. Vulnerável desde a 4.4.
O laboratório inicializa um kernel convidado para que o kernel hospedeiro corrigido nunca seja o alvo:
make image
make kernel-amp kernel-fixed-amp
make rootfs
make test-det-vuln # KASAN: slab-use-after-free in inet_csk_route_req
make test-det-fixed # same attack, clean
phase-det é a reprodução entre CPUs: flooder de dup-SYN fixado na CPU1 (criação do socket
de requisição + seu timer), ACKs finais na CPU0 (criação do filho), accept+close do servidor na CPU3 (destruição do filho). RPS desativado, netns do atacante/alvo
sobre um par veth, pacotes saem como quadros Ethernet brutos para que o próprio kernel do atacante
nunca envie RST e derrube o handshake. Os kernels -amp adicionam um atraso de 5ms
dentro de inet_csk_route_req entre obter ireq_opt e desreferenciá-lo
(injeção de atraso no estilo KCSAN, usada para reprodutibilidade apenas nestes kernels de
reprodução, claramente marcada no código-fonte).
poc/poc.c também tem as variantes timerace, race, migrate e mptcp.
evidence/REPRODUCED-UAF-first-splat.txt — 12 splats em uma execução, o primeiro:
[ 9.076253] BUG: KASAN: slab-use-after-free in inet_csk_route_req+0x94/0x370
[ 9.076586] Read of size 1 at addr ffff888002ddaa41 by task poc/85
...
tcp_v4_send_synack+0x212/0x240
tcp_rtx_synack+0xd5/0x280
inet_rtx_syn_ack+0x38/0x60
tcp_check_req+0xb8e/0xde0
tcp_v4_rcv+0x1131/0x15e0
...
Allocated by task 79: tcp_v4_route_req+0x116/0x1b0 (options saved on the SYN)
Freed by task 80: inet_sock_destruct+0x2cd/0x380 (child close(), plain kfree)
evidence/VERIFIED-fixed-kernel-clean.log — o mesmo ataque no kernel com
as duas chamadas kfree_rcu() aplicadas: zero relatórios.
Se você ainda não pode aplicar o patch, descarte pacotes TCP que carregam opções IPv4 no prerouting
(ip protocol tcp ip hdrlength > 5 drop), e defina
net.ipv4.tcp_migrate_req=0 para a variante de migração. A correção real é a
atualização do kernel.