
Proof-of-concept verificato con KASAN che riproduce CVE-2026-98432, una use-after-free nel kernel Linux IPv4 TCP inet_opt/ireq_opt, con harness di race cross-CPU e controllo su kernel corretto.
Kernel Linux IPv4 TCP inet_opt/ireq_opt use-after-free (CVSS 9.8).
Un SYN con opzioni di intestazione IPv4 fa sì che le sue opzioni vengano salvate sul socket della richiesta.
Al completamento dell'handshake, tcp_v4_syn_recv_sock() passa lo stesso buffer
al socket figlio tramite puntatore, senza copia. Un SYN ritrasmesso su un'altra CPU
lo legge in tcp_v4_send_synack()/inet_csk_route_req() mentre il figlio è
già scomparso (inet_sock_destruct() lo ha liberato con un semplice kfree(), i socket
figli non hanno SOCK_RCU_FREE). La correzione consiste in due chiamate kfree_rcu(), introdotte in
6.6.159 e versioni correlate. Vulnerabile da 4.4.
Il laboratorio avvia un kernel guest, così il kernel host con la patch non è mai il bersaglio:
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 è la riproduzione cross-CPU: flooder di dup-SYN fissato alla CPU1 (creazione del socket
di richiesta + il suo timer), ACK finali sulla CPU0 (creazione del figlio), accept+close del server sulla CPU3 (distruzione del figlio). RPS disattivato, netns attaccante/bersaglio
su una coppia veth, i pacchetti escono come frame Ethernet raw così il kernel
dell'attaccante non invia mai RST che interrompe l'handshake. I kernel -amp aggiungono un ritardo di 5ms
all'interno di inet_csk_route_req tra la lettura di ireq_opt e la sua dereferenziazione
(iniezione di ritardo in stile KCSAN, usata per la riproducibilità solo in questi kernel
di riproduzione, chiaramente contrassegnata nel sorgente).
poc/poc.c contiene anche le varianti timerace, race, migrate e mptcp.
evidence/REPRODUCED-UAF-first-splat.txt — 12 splat in un'unica esecuzione, il primo:
[ 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 — stesso attacco sul kernel con
le due chiamate kfree_rcu() applicate: zero segnalazioni.
Se non puoi ancora applicare la patch, scarta i pacchetti TCP che trasportano opzioni IPv4 in prerouting
(ip protocol tcp ip hdrlength > 5 drop), e imposta
net.ipv4.tcp_migrate_req=0 per la variante di migrazione. La vera correzione è
l'aggiornamento del kernel.