
IPv4 옵션(IHL > 5)을 포함한 패킷을 인터페이스에서 드롭하여 CVE-2026-98432 TCP 핸드셰이크 use-after-free를 완화하는 XDP/eBPF 프로그램입니다.
커널의 TCP 핸드셰이크에서 IPv4 옵션을 처리할 때 발생하는 use-after-free인 CVE-2026-98432를 완화하기 위한 작은 XDP 프로그램입니다. 대부분의 호스트에서 이 버그는 IP 옵션을 포함한 수신 SYN에 의해서만 트리거될 수 있으므로(아래 NetLabel/CIPSO 예외 참조), 이 프로그램은 옵션이 있는 IPv4 패킷이 커널의 네트워크 스택으로 전달되기 전에 드롭합니다.
패킷의 IHL(헤더 길이) 필드가 5보다 크면, 즉 IPv4 헤더가 20바이트보다 길면 IP 옵션이 있는 것입니다.
[!WARNING] 이것은 NetLabel/CIPSO를 사용하는 호스트를 보호하지 못할 수 있습니다 (SELinux 또는 Smack에서
CIPSOV4매핑을 사용하는 경우). 그러한 호스트에서는 커널이 스스로 IP 옵션을 붙일 수 있으므로, 일반적인 SYN으로도 버그에 도달할 수 있습니다. 그런 경우에는 패치된 커널이 더 신뢰할 수 있는 해결책입니다.netlabelctl map list를 사용하면 호스트가 CIPSO를 사용하는지 판별하는 데 도움이 됩니다.CIPSOV4유형의 항목이 있으면 사용 중임을 시사합니다.
| 패킷 | 동작 |
|---|---|
| 옵션이 있는 IPv4 (IHL > 5) | XDP_DROP |
| 옵션이 없는 IPv4 | XDP_PASS |
| 그 외 모든 것 (IPv6, ARP, …) | XDP_PASS |
| 잘렸거나 잘못된 헤더 | XDP_PASS |
VLAN 태그가 붙은 프레임도 처리합니다. 이 프로그램은 IPv4 여부를 확인하기 전에 최대 두 개의 VLAN 태그(802.1Q 및 802.1ad/QinQ)를 건너뜁니다. 태그가 두 개를 초과하는 프레임은 그대로 통과시킵니다.
Linux 호스트에서:
clang 및 llvmlibbpf-dev (bpf/bpf_helpers.h용)linux-headers-$(uname -r) 또는 linux-libc-dev)iproute2 (ip link용), 그리고 선택적으로 bpftoolDebian / Ubuntu:
sudo apt install clang llvm libbpf-dev linux-libc-dev iproute2 bpftool
Fedora:
sudo dnf install clang llvm libbpf-devel kernel-headers iproute bpftool
make
이 명령은 drop_ipv4_opt.o를 생성합니다.
eth0을 사용 중인 인터페이스 이름으로 바꾸세요(ip link 참조).
가장 빠른 네이티브(드라이버) 모드:
sudo ip link set dev eth0 xdpdrv obj drop_ipv4_opt.o sec xdp
모든 인터페이스에서 동작하지만 더 느린 제네릭(SKB) 모드:
sudo ip link set dev eth0 xdpgeneric obj drop_ipv4_opt.o sec xdp
커널이 모드를 선택하도록 하기(지원되면 네이티브, 아니면 제네릭):
sudo ip link set dev eth0 xdp obj drop_ipv4_opt.o sec xdp
ip link show dev eth0 # look for "xdp" / "prog/xdp id N"
sudo bpftool net show dev eth0
sudo ip link set dev eth0 xdp off
특정 모드로 연결했다면 xdpdrv off 또는 xdpgeneric off를 사용하세요.
다른 호스트에서 IP 옵션이 포함된 패킷을 보내세요. 예를 들어 Record Route 옵션을 사용하는 경우:
ping -R <target-ip>
프로그램이 연결된 상태에서는 이러한 ping에 응답이 없습니다. 일반 ping <target-ip>는 여전히 동작합니다.
MIT. LICENSE를 참조하세요.