
KASAN으로 검증된 개념 증명으로, Linux 커널 IPv4 TCP inet_opt/ireq_opt use-after-free인 CVE-2026-98432를 재현하며, 교차 CPU 레이스 하네스와 수정된 커널 대조군을 포함합니다.
Linux 커널 IPv4 TCP inet_opt/ireq_opt use-after-free (CVSS 9.8).
IPv4 헤더 옵션이 있는 SYN은 요청 소켓에 해당 옵션이 저장됩니다.
핸드셰이크가 완료되면 tcp_v4_syn_recv_sock()이 동일한 버퍼를
복사 없이 포인터로 자식 소켓에 넘깁니다. 다른 CPU에서 재전송된 SYN은
자식이 이미 사라진 상태에서 tcp_v4_send_synack()/inet_csk_route_req()에서
이를 읽습니다(자식은 inet_sock_destruct()에서 일반 kfree()로 해제되었으며,
자식 소켓에는 SOCK_RCU_FREE가 없습니다). 수정은 두 번의 kfree_rcu() 호출이며,
6.6.159 및 관련 버전에 반영되었습니다. 4.4부터 취약합니다.
랩은 게스트 커널을 부팅하므로 패치된 호스트 커널이 절대 대상이 되지 않습니다:
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 쌍을 통해 연결되며,
패킷은 원시 이더넷 프레임으로 나가므로 공격자 자신의 커널이 핸드셰이크를
RST로 끊어버리지 않습니다. -amp 커널은 inet_csk_route_req 내부에서
ireq_opt를 가져온 뒤 역참조하기 전에 5ms 지연을 추가합니다
(KCSAN 스타일 지연 주입, 이 재현 커널에서만 재현성을 위해 사용되며
소스에 명확히 표시됨).
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() 호출이
적용된 커널에서 동일한 공격: 보고서 0건.
아직 패치할 수 없다면 prerouting에서 IPv4 옵션을 담은 TCP 패킷을 드롭하고
(ip protocol tcp ip hdrlength > 5 drop), 마이그레이션 변형에 대해서는
net.ipv4.tcp_migrate_req=0을 설정하십시오. 실제 수정은
커널 업데이트입니다.