
IP 옵션을 포함한 IPv4 TCP SYN을 드롭하여 CVE-2026-98432 use-after-free를 완화하는 nftables ingress 규칙 세트로, 소스별 카운터와 로깅을 제공합니다.
CVE-2026-98432에 대한 nftables 완화책: IP 옵션을 포함한 IPv4 TCP SYN을 nftables가 처리할 수 있는 가장 이른 시점에 드롭합니다.
이 CVE는 IPv4 TCP 요청 소켓 경로(ireq->ireq_opt / inet_opt, ip_options_build()에서 읽힘)의 use-after-free입니다. 올바른 수정은 커널 업데이트이며, 이 방법은 커널 업데이트를 적용하기 전까지 노출을 줄이는 것일 뿐입니다.
ireq->ireq_opt는 한 곳, 즉 tcp_v4_init_req()에서 요청 소켓을 여는 SYN의 옵션으로부터 설정됩니다. 경쟁 상태에 있는 재전송 SYN은 거기에 저장된 것만 읽으며, CVE 시나리오에서는 공격자가 Record Route 또는 Timestamp 옵션이 있는 SYN을 전송합니다. 따라서 옵션이 있는 SYN이 문제가 되는 패킷입니다. 요청 소켓 마이그레이션은 동일하게 저장된 ireq_opt를 재사용합니다. 이는 커널 소스와 CVE 텍스트에 근거한 것이지, SYN만으로 충분하다는 CVE 작성자의 진술에 근거한 것이 아닙니다. 보수적인 버전을 원한다면 규칙에서 tcp flags & (syn | ack) == syn 매치를 제거하십시오.
IFACES를 외부 트래픽을 수신하는 NIC로 설정한 다음 sudo nft -f simple.nft를 실행하십시오. 규칙셋은 다음과 같습니다:
define IFACES = { eth0 }
table netdev cve_2026_98432 {
chain ingress {
type filter hook ingress devices = $IFACES priority -500; policy accept;
ip protocol tcp ip hdrlength > 5 tcp flags & (syn | ack) == syn limit rate 5/second burst 10 packets log prefix "CVE-2026-98432 drop: " level warn
ip protocol tcp ip hdrlength > 5 tcp flags & (syn | ack) == syn counter drop
}
}
-500의 netdev ingress는 첫 번째 netfilter 훅으로, prerouting, conntrack, 라우팅보다 앞섭니다. XDP는 여전히 그보다 먼저 실행됩니다.ip hdrlength > 5는 32비트 워드 단위의 IPv4 IHL이며, 5보다 크면 옵션이 있음을 의미합니다.tcp flags & (syn | ack) == syn은 ACK가 없는 SYN입니다.counter가 총계입니다.확인 방법: sudo nft list chain netdev cve_2026_98432 ingress 및 journalctl -k -g 'CVE-2026-98432'.
fancy.nftfancy.nft는 동일한 드롭에 이름이 지정된 총계 카운터와 주소별 카운터를 추가한 것으로, 두 개의 동적 set에 유지됩니다. 또한 IP 옵션이 있는 다른 모든 TCP 패킷(드롭되지 않고 통과됨)을 카운트하고 로그에 기록하며, 로그 라인에 옵션 바이트를 포함합니다(flags ip options, 접두사 CVE-2026-98432 ip-options: ):
| 카운터 | 위치 | 표시 내용 |
|---|---|---|
| total | 이름이 지정된 카운터 dropped_total | IP 옵션이 있는 SYN, 드롭됨 |
| other | 이름이 지정된 카운터 options_other | IP 옵션이 있는 기타 TCP, 통과됨 |
| 소스 IP별 | set by_src | 드롭된 소스 주소별 패킷 및 바이트 |
| 소스 . 목적지별 | set by_pair | (소스, 목적지) 쌍별 동일 정보 |
| 옵션을 사용하는 모든 IP | set options_by_src | 옵션이 있는 모든 IPv4 패킷(TCP, UDP, ICMP... 등 모든 프로토콜)의 소스 주소별 패킷 및 바이트, 드롭된 SYN 포함 |
sudo nft -f fancy.nft
sudo ./cve-log.sh # counters, then follow the kernel log
sudo ./cve-log.sh -c # counters only
sudo ./cve-log.sh -r # reset the total and the per-IP sets
또는 직접:
sudo nft list counter netdev cve_2026_98432 dropped_total
sudo nft list counter netdev cve_2026_98432 options_other
sudo nft list set netdev cve_2026_98432 by_src
sudo nft list set netdev cve_2026_98432 by_pair
sudo nft list set netdev cve_2026_98432 options_by_src
각 요소는 자체 패킷 및 바이트 카운터를 가지며 마지막 히트 후 1시간 뒤에 만료됩니다. 각 set은 최대 65535개의 항목을 보유하며, 가득 차면 새 주소는 추적되지 않지만 패킷은 여전히 드롭됩니다. 소스 주소는 스푸핑될 수 있으므로, IP별 카운터는 패킷이 주장한 것을 보여줄 뿐 실제 전송자를 보여주지는 않습니다.
sudo nft delete table netdev cve_2026_98432로 두 버전 중 하나를 제거하십시오.
어느 것도 재부팅 후 유지되지 않으므로 /etc/nftables.conf에서 파일을 포함시키십시오.
fancy.nft는 테이블을 추가하고 규칙만 재구성하므로, 다시 로드해도
카운터가 유지됩니다. 카운터를 초기화하거나 세트를 변경하려면 먼저
nft delete table netdev cve_2026_98432를 실행하십시오. 카운터는 커널 메모리에 존재하며 재부팅 후에는 유지되지 않습니다.