
Programa XDP/eBPF que descarta pacotes IPv4 que transportam opções IP (IHL > 5) na interface para mitigar a use-after-free no handshake TCP da CVE-2026-98432.
Um pequeno programa XDP para mitigar a CVE-2026-98432, um use-after-free no tratamento do handshake TCP do kernel para opções IPv4. Na maioria dos hosts, o bug só pode ser acionado por um SYN de entrada que carregue opções IP (veja a exceção NetLabel/CIPSO abaixo), então este programa descarta pacotes IPv4 com opções antes que sejam entregues à pilha de rede do kernel.
Um pacote tem opções IP quando seu campo IHL (tamanho do cabeçalho) é maior que 5, o que significa que o cabeçalho IPv4 tem mais de 20 bytes.
[!WARNING] Isto pode não proteger hosts que usam NetLabel/CIPSO (SELinux ou Smack com um mapeamento
CIPSOV4). Nesses hosts, o kernel pode anexar opções IP por conta própria, então o bug pode ser alcançável com SYNs comuns. Um kernel corrigido é a solução mais confiável nesses casos.netlabelctl map listpode ajudar a identificar se um host usa CIPSO: entradas do tipoCIPSOV4sugerem que sim.
| Pacote | Ação |
|---|---|
| IPv4 com opções (IHL > 5) | XDP_DROP |
| IPv4 sem opções | XDP_PASS |
| Qualquer outra coisa (IPv6, ARP, …) | XDP_PASS |
| Cabeçalho truncado / malformado | XDP_PASS |
Frames com tag VLAN também são tratados: o programa ignora até duas tags VLAN (802.1Q e 802.1ad/QinQ) antes de verificar se é IPv4. Frames com mais de duas tags são repassados.
Em um host Linux:
clang e llvmlibbpf-dev (para bpf/bpf_helpers.h)linux-headers-$(uname -r) ou linux-libc-dev)iproute2 (para ip link), e opcionalmente 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
Isto produz drop_ipv4_opt.o.
Substitua eth0 pelo nome da sua interface (veja ip link).
Modo nativo (driver), que é o mais rápido:
sudo ip link set dev eth0 xdpdrv obj drop_ipv4_opt.o sec xdp
Modo genérico (SKB), que funciona em qualquer interface mas é mais lento:
sudo ip link set dev eth0 xdpgeneric obj drop_ipv4_opt.o sec xdp
Deixe o kernel escolher o modo (nativo se suportado, senão genérico):
sudo ip link set dev eth0 xdp obj drop_ipv4_opt.o sec xdp
ip link show dev eth0 # procure por "xdp" / "prog/xdp id N"
sudo bpftool net show dev eth0
sudo ip link set dev eth0 xdp off
Use xdpdrv off ou xdpgeneric off se você anexou nesse modo específico.
A partir de outro host, envie um pacote com uma opção IP, por exemplo com a opção Record Route:
ping -R <target-ip>
Com o programa anexado, esses pings não recebem resposta. Um ping <target-ip> normal continua funcionando.
MIT. Veja LICENSE.