一个用于缓解 CVE-2026-98432 的小型 XDP 程序,该漏洞是内核在处理 IPv4 选项的 TCP 握手时出现的释放后使用(use-after-free)问题。在大多数主机上,该缺陷只能由携带 IP 选项的入站 SYN 触发(参见下方的 NetLabel/CIPSO 例外情况),因此本程序会在带有选项的 IPv4 数据包被传递到内核网络栈之前将其丢弃。
当数据包的 IHL(首部长度)字段大于 5 时,即表示该数据包带有 IP 选项,这意味着 IPv4 首部长度超过 20 字节。
[!WARNING] 这可能无法保护使用 NetLabel/CIPSO 的主机(SELinux 或 Smack 配置了
CIPSOV4映射)。在这些主机上,内核可以自行附加 IP 选项,因此该缺陷可能 通过普通 SYN 触发。在这些环境中,使用已修补的内核是更可靠的修复方式。netlabelctl map list可帮助判断主机是否使用 CIPSO:类型为CIPSOV4的条目表明其使用了 CIPSO。
| 数据包 | 动作 |
|---|---|
| 带选项的 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。