
IPv4オプション(IHL > 5)を含むIPv4パケットをインターフェースでドロップし、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 を使用するホストを保護できない可能性があります(
CIPSOV4マッピングを使用する SELinux または Smack)。そのようなホストではカーネル自身が IP オプションを付加できるため、通常の SYN でもこのバグに到達できる可能性があります。そのような環境では、パッチ適用済みのカーネルを使用する方が信頼性の高い修正方法です。netlabelctl map listは、ホストが CIPSO を使用しているかどうかの判断に役立ちます。CIPSOV4タイプのエントリがあれば、使用している可能性が高いです。
| パケット | アクション |
|---|---|
| オプション付き IPv4 (IHL > 5) | XDP_DROP |
| オプションなし IPv4 | XDP_PASS |
| それ以外 (IPv6、ARP など) | XDP_PASS |
| 切り詰められた / 不正なヘッダ | XDP_PASS |
VLAN タグ付きフレームにも対応しています。このプログラムは IPv4 かどうかを確認する前に、最大 2 つの VLAN タグ(802.1Q および 802.1ad/QinQ)をスキップします。3 つ以上のタグを持つフレームはそのまま通過させます。
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 を参照してください。