
IPv4 TCP inet_opt/ireq_opt use-after-free 취약점 완화 툴킷: 노출 감사, nft SYN-with-IP-options 드롭 규칙, tcpdump 탐지, EL 커널용 kpatch/livepatch 빌더.
IPv4 TCP inet_opt/ireq_opt use-after-free (업스트림 수정 e3f33b0a,
inet_sock_destruct() + tcp_v4_reqsk_destructor()에서 kfree → kfree_rcu).
트리거: IPv4 옵션(ihl > 5)을 포함한 클라이언트 SYN — 옵션이 없으면
경쟁 대상 객체 ireq_opt가 할당되지 않는다. 주장된 원격 루트 익스플로잇은
추가로 MPTCP 리스너를 필요로 한다.
| 파일 | root 필요 | 목적 |
|---|---|---|
cve-audit.sh | 아니오 | 읽기 전용 노출 + 패치 가능성 보고서 |
cve-mitigate.sh | 적용/해제 | IP 옵션이 있는 SYN의 nft 드롭, 선택적 MPTCP 비활성화 |
nft-rules.txt | — | 독립 실행형 규칙셋 (nft -f nft-rules.txt) |
cve-detect.sh | 캡처 모드 | 익스플로잇의 패킷 형태를 탐지하는 tcpdump 센서 |
kpatch-el-build.sh | 빌드/설치 | EL 계열용 검증된 kpatch/livepatch 빌더 |
klp-handcraft-build.sh | 빌드/로드 | kpatch-build를 실행할 수 없는 IBT 커널(EL10)용 수작업 klp 모듈 |
patches/CVE-2026-98432.patch | — | 업스트림 수정, kpatch-build용으로 준비됨 |
tests/run-tests.sh | 아니오 | 하네스 (netns 규칙셋 로드 + 스텁 빌더 e2e) |
./cve-audit.sh # where do I stand?
./cve-mitigate.sh apply --with-mptcp-off # closes trigger + claimed root path
./cve-detect.sh count 30 # anyone probing with IP options?
sudo ./kpatch-el-build.sh --name CVE-2026-98432 \
--expect inet_sock_destruct,tcp_v4_reqsk_destructor \
[--sign priv.pem cert.pem] [--install] \
patches/CVE-2026-98432.patch
# verify: cat /sys/kernel/livepatch/CVE-2026-98432/enabled -> 1
./cve-mitigate.sh status # keep until 100% patched, then:
./cve-mitigate.sh undo
| 대상 | 비고 |
|---|---|
| EL7 (3.10) | 취약하지 않음(트리거 코드는 4.4에서 도입됨); 빌더는 다른 패치에는 여전히 동작함 |
| EL7h/EL8 (4.18) | 취약함; kernel-debuginfo가 /usr/src/debug/kernel-*/linux-*를 제공함; EPEL의 kpatch-build 사용 |
| EL9 (5.14) | 취약함; 커널이 gcc-toolset으로 빌드됨 — 빌더가 일치하는 /opt/rh/gcc-toolset-*를 자동으로 앞에 붙임 |
| EL10 (6.12) | IBT: kpatch-build 0.9.11은 CONFIG_X86_KERNEL_IBT=y 커널을 거부함(dynup/kpatch#1320) — klp-handcraft-build.sh를 사용하세요; Secure Boot/lockdown 환경에서는 모듈 서명이 강제됨 |
| CloudLinux 8/9/10 | 배포판 id가 kpatch-build의 지원 목록에 없으므로 빌더가 항상 -s/-c/-v를 명시적으로 전달함; debuginfo는 rpm -qf /boot/vmlinuz-$(uname -r)와 일치하는 AlmaLinux/CentOS kernel-debuginfo에서 가져옴 |
RHEL에서 debuginfo를 사용하려면 저장소를 활성화해야 합니다. 예:
dnf --enablerepo='*debug*' debuginfo-install -y $(rpm -qf /boot/vmlinuz-$(uname -r))
(청구되지 않은 호스트에서는 subscription-manager repos --enable=rhel-9-appstream-rpms 등).
CONFIG_LIVEPATCH=y + CONFIG_KALLSYMS=y가 있는지..comment 수준 검사는
kpatch-build에 위임됨; toolset 조회는 여기서 수행됨).--expect) — 예상치 못한 세 번째 변경 객체는 하드 실패로 처리됨.sign-file(사용자의 키페어 사용) + modinfo sig_type 재확인;
Secure Boot를 위해 MOK를 통해 인증서를 등록.--install은 /var/lib/kpatch/$(uname -r)/에 배치하고,
kpatch/insmod로 로드하며, 재부팅 후 지속성을 위해 kpatch.service를 활성화함.uname -r을 가진 카나리 VM../kpatch-el-build.sh ... --install; /sys/kernel/livepatch/<name>/enabled == 1 확인.hping3 -S -p <port> --tcp-opts ... 플러드를
가하면서 카나리에서 net.ipv4.tcp_migrate_req=1을 토글;
ip_options_build() 내부에 인위적인 udelay()를 넣은 KASAN 커널 변형은
패치 없이 UAF를 재현하고, 패치가 있으면 조용해야 함.uname -r이 변경되지 않는지 확인하고(라이브패치는 이를 올리지 않음), kpatch list,
dmesg -w에서 taint 및 klp 전환 지연을 관찰
(/sys/kernel/livepatch/<name>/transition이 0으로 소진되어야 함).하네스: AlmaLinux 10.2 VM(커널 6.12.0-211.64.1.el10_2)에서 모든 검사 통과.
실제 nft 규칙셋이 새 netns 내부에 로드되고 나열됨; pcap 필터는
실행 중인 tcpdump에 대해 컴파일됨; 빌더 파이프라인은 실제 .ko 픽스처와
주입된 심볼 피드를 사용하는 스텁된 kpatch-build에 대해 엔드투엔드로 실행됨.
해당 EL10 VM에서 실제 검증 완료:
klp-handcraft-build.sh --load가 라이브패치를 빌드하고 활성화함:
/sys/kernel/livepatch/klp_CVE_2026_98432/enabled=1, 전환 드레인 완료,
sysfs에 inet_sock_destruct,1 + tcp_v4_reqsk_destructor,1 표시됨; 정상
TCP(HTTP 200)는 영향 없음. 서명되지 않은 .ko는 커널을 오염(taint)시킴; Secure Boot
록다운은 이를 거부할 것임(VM은 서명 없이 실행됨).kpatch-build(dynup 0.9.11, 소스에서 빌드)는 EL10에서
"kernel option CONFIG_X86_KERNEL_IBT not supported"와 함께 강제 실패함 — 빌더는
이제 이를 사전 점검하고 수작업(handcraft) 경로를 안내함. 실제 바이너리 diff
kpatch-build 실행은 EL8/EL9에서 여전히 검증되지 않은 상태임.prerouting priority -310 규칙도 같은 이유로 작동함.
사고에서 신뢰하기 전에 EL 카나리에서 정상 경로(happy path)를 한 번 실행해 보십시오.