
Подтверждённый KASAN proof-of-concept, воспроизводящий CVE-2026-98432 — use-after-free в IPv4 TCP inet_opt/ireq_opt ядра Linux, с harness для гонки между CPU и контролем на исправленном ядре.
Использование памяти после освобождения (use-after-free) в inet_opt/ireq_opt для IPv4 TCP в ядре Linux (CVSS 9.8).
SYN с опциями заголовка IPv4 сохраняет свои опции в сокете запроса.
Когда рукопожатие завершается, tcp_v4_syn_recv_sock() передаёт тот же буфер
дочернему сокету по указателю, без копирования. Повторно переданный SYN на другом CPU
читает его в tcp_v4_send_synack()/inet_csk_route_req(), когда дочерний сокет
уже уничтожен (inet_sock_destruct() освободил его обычным kfree(), у дочерних
сокетов нет SOCK_RCU_FREE). Исправление — два вызова kfree_rcu(), вошедшие в
6.6.159 и смежные версии. Уязвимо начиная с 4.4.
Лабораторная среда загружает гостевой kernel, поэтому пропатченный хост-kernel никогда не является целью:
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 — это кросс-CPU воспроизведение: флудер dup-SYN, привязанный к CPU1 (создание
сокета запроса + его таймер), финальные ACK на CPU0 (создание дочернего сокета), accept+close сервера на CPU3 (уничтожение дочернего сокета). RPS выключен, netns атакующего/цели
через пару veth, пакеты отправляются как сырые кадры Ethernet, чтобы собственный
kernel атакующего никогда не сбрасывал рукопожатие через RST. Ядра -amp добавляют 5-мс задержку
внутри inet_csk_route_req между взятием ireq_opt и его разыменованием
(инъекция задержки в стиле KCSAN, используется для воспроизводимости только в этих
repro-ядрах, явно помечена в исходном коде).
В poc/poc.c также есть варианты timerace, race, migrate и mptcp.
evidence/REPRODUCED-UAF-first-splat.txt — 12 splat'ов за один прогон, первый из них:
[ 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 — та же атака на ядре с
применёнными двумя вызовами kfree_rcu(): ноль отчётов.
Если вы ещё не можете применить патч, отбрасывайте TCP-пакеты с опциями IPv4 на этапе prerouting
(ip protocol tcp ip hdrlength > 5 drop) и установите
net.ipv4.tcp_migrate_req=0 для варианта с миграцией. Настоящее исправление — это
обновление ядра.