
Linux 커널 CVE-2026-98432(tcp_v4_syn_recv_sock의 IPv4 옵션 UAF)에 대한 임시 nftables 완화책으로, 재현 가능한 에이전트 스킬
Linux 커널 CVE-2026-98432(CVSS 9.8)에 대한 임시 호스트 완화책을 적용하고, 검증하고, 지속시키고, 나중에 제거하는 에이전트 스킬: IPv4 옵션을 실은 TCP 패킷을 드롭하는 단일 nftables 규칙 — tcp_v4_syn_recv_sock()의 inet_opt/ireq_opt use-after-free에 도달하는 유일한 입력입니다.
알아둘 만한 배경: Anthropic의 Frontier Red Team이 MPTCP 리스너를 노출한 서버를 대상으로 한, 인증 없이 루트 권한을 얻는 동작하는 PoC를 공개적으로 설명했습니다(2026년 10월). 실제 공격 사례는 보고되지 않았습니다. 커널 CNA는 9.8점을 부여하고, 업스트림과 Red Hat은 8.1점(공격 복잡도 높음)을 부여합니다. 벤더 수정은 Ubuntu 커널 6.8.0-149급 백포트입니다 — 실행 중인 커널이 수정 사항을 포함할 때까지 이 규칙이 임시방편입니다. 이 규칙은 한 프로토콜의 한 헤더의 한 필드로 범위가 한정되므로 정상 트래픽은 영향을 받지 않습니다.
이 규칙은 새로운 것이 아닙니다 — 패키징된 선행 기술로 취급하십시오. 아래 "선행 기술"을 참조하십시오. 이 저장소의 기여는 재현 가능한 에이전트 스킬 형태와 프로덕션 함정입니다.
| 경로 | 내용 |
|---|---|
SKILL.md | 스킬 — 프런트매터 트리거, 규칙셋, 검사, 지속성, 함정, 제거 |
files/cve98432.nft | 바로 복사해 쓸 수 있는 nftables 규칙셋(prerouting, 우선순위 −300) |
files/nft-cve98432.service | 바로 복사해 쓸 수 있는 systemd 유닛(지속성) |
cp -R cve-2026-98432-nft-mitigation ~/.claude/skills/ # Claude Code
cp -R cve-2026-98432-nft-mitigation ~/.agents/skills/ # agents-style runtimes
description 프런트매터는 탐색 표면입니다. 에이전트는 CVE-2026-98432, "TCP/IP 수정", 커널 IPv4 옵션 UAF 완화를 요청받거나 벤더 커널이 출시된 후 완화 조치를 제거하라는 요청을 받으면 이 스킬을 선택합니다.
zgrep -c CVE-2026-98432 /usr/share/doc/linux-modules-$(uname -r)/changelog.Debian.gz # Debian/Ubuntu
rpm -q --changelog kernel-core-$(uname -r) | grep -c CVE-2026-98432 # RHEL/Rocky/Alma
> 0 = 수정됨, 완화 조치를 건너뜁니다. (벤더 트래커도 확인하고,
apt-cache policy linux-image-generic으로 설치되었지만 부팅되지 않은 최신 커널도 확인하십시오.)ss -lnMp): 공개된 PoC가 이를 대상으로 하며, Go ≥ 1.24는 이를 허용하는 커널에서 기본적으로 MPTCP로 리스닝합니다. sysctl net.mptcp.enabled=0은 새 소켓에만 영향을 줍니다 — 이미 열려 있는 리스너는 해당 서비스가 재시작될 때까지 MPTCP를 유지합니다 (Go 팀에 따르면 GODEBUG=multipathtcp=0).cat /sys/kernel/security/lsm에 SELinux 또는 Smack이 나열되고 동시에 NetLabel CIPSOV4 매핑을 사용한다면, 해당 환경에서는 IPv4 옵션이 정당합니다 — 이 규칙은 그 경로를 깨뜨릴 수 있습니다. CIPSO 레이블 네트워크에는 적용하지 마십시오 (RFC 7126에서 이 트레이드오프를 논의합니다).files/cve98432.nft와 files/nft-cve98432.service를 설치합니다.nft -c -f /usr/local/sbin/cve98432.nft — 파싱 검사; root가 필요합니다 (비root는 netlink에서 실패: cache initialization failed).systemctl daemon-reload && systemctl enable --now nft-cve98432.servicedestroy table … 줄은 파일의 첫 번째 줄이어야 합니다: 끝에 추가하면 테이블을 생성한 뒤 파괴하여, 서비스가 여전히 종료 코드 0으로 끝나는 동안 빈 규칙셋을 남깁니다.nft list table inet cve98432는 priority -300 (conntrack 이전, 공개된 규칙과 일치)인 체인에 meta l4proto tcp ip hdrlength > 5 counter drop을 보여야 합니다.table inet …는 iptables가 소유하지 않으므로 iptables-restore / ufw / firewalld 도구가 이를 그대로 둡니다 (복원을 한 번 실행하고 다시 목록을 조회하여 확인하십시오).수정된 커널을 설치하고 재부팅한 후 제거: SKILL.md의 섹션 7.
nftables 상태는 네트워크 네임스페이스별입니다. 호스트 규칙은 컨테이너 트래픽이 호스트를 횡단하는 지점에서만 (예: 컨테이너 → 외부) 이를 봅니다; 컨테이너 자체 네임스페이스 내부에 머무는 트래픽(컨테이너 → 자체 loopback/IP)은 호스트의 prerouting을 결코 통과하지 않습니다 — 그러나 커널은 공유되므로, 컨테이너 내부의 코드는 여전히 로컬에서 UAF에 도달할 수 있습니다. 실행 중인 모든 컨테이너에 동일한 규칙셋을 주입하십시오:
# Docker (host-side nsenter keeps the needed capabilities)
for c in $(docker ps -q); do
pid=$(docker inspect -f '{{.State.Pid}}' "$c")
nsenter -t "$pid" -n /usr/sbin/nft -f /usr/local/sbin/cve98432.nft
done
# LXC (privileged CLI as root)
for c in $(lxc-ls -1 2>/dev/null); do lxc-attach -n "$c" -- nft -f /usr/local/sbin/cve98432.nft; done
컨테이너 네임스페이스는 nft 규칙을 유지하지 않습니다 — 컨테이너가 재시작될 때마다 다시 실행해야 합니다(오케스트레이터의 시작 후 단계에 훅으로 연결하세요). 이 정확한 공백에 대한 선행 사례와 스크립트: typhoon1217/cve-2026-98432-mitigation(inject-netns.sh).
표준 소켓으로 충분합니다 — 서버에서 패킷을 조작할 필요가 없습니다: 클라이언트가 setsockopt(IP_OPTIONS)를 통해 IPv4 Record Route 옵션을 설정하고 연결합니다. 일반 연결은 성공하고, 옵션이 있는 연결은 규칙의 카운터가 증가하는 동안 타임아웃되어야 합니다. 바로 사용 가능한 클라이언트: typhoon1217/cve-2026-98432-mitigation의 check-blocked.py / verify-synack.sh. 해당 프로젝트의 주의사항: 자체적으로 완화 조치를 실행하는 클라이언트는 대상의 SYN-ACK 에코도 드롭합니다 — 깨끗한 판정을 위해 완화 조치가 없는 클라이언트에서 테스트하세요.
priority -300의 prerouting: conntrack 이전이므로 드롭된 패킷은 conntrack 상태를 생성하지 않으며, input과 달리 호스트를 거쳐 컨테이너/VM으로 포워딩되는 트래픽도 커버합니다.@nh,4,4 > 5를 ip hdrlength > 5로 정규화합니다 — IHL 필드이며, 도구 자체에서 확인됩니다.typhoon1217/cve-2026-98432-mitigation — 동일한 드롭 규칙 + 컨테이너-netns 주입, CIPSO 주의사항, 검증 클라이언트 (EN/KO)프로덕션 배포에서 정제되었으며, 그곳에서 발생한 실패도 포함합니다: 비루트 nft -c, 끝에서 destroy를 실행하는 순서 버그, \$를 조용히 삼키는 따옴표 없는 heredoc, 그리고 이중 적용 의미론. 문서 전용 저장소 — 런타임 의존성: nft ≥ 1.0 + systemd; 테스트 스위트 없음 (해당 없음).