
XDP/eBPF-программа, которая отбрасывает IPv4-пакеты с IP-опциями (IHL > 5) на интерфейсе для смягчения последствий use-after-free в TCP-рукопожатии (CVE-2026-98432).
Небольшая XDP-программа для смягчения последствий CVE-2026-98432 — use-after-free в обработке IPv4-опций при TCP-рукопожатии в ядре. На большинстве хостов ошибку можно вызвать только входящим SYN, содержащим IP-опции (см. исключение для NetLabel/CIPSO ниже), поэтому эта программа отбрасывает IPv4-пакеты с опциями до того, как они будут переданы сетевому стеку ядра.
Пакет содержит IP-опции, когда его поле IHL (длина заголовка) больше 5, то есть IPv4-заголовок длиннее 20 байт.
[!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 также обрабатываются: программа пропускает до двух тегов VLAN (802.1Q и 802.1ad/QinQ), прежде чем проверить наличие IPv4. Кадры с более чем двумя тегами пропускаются.
На хосте с 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.