CVE-2024-26853 in Linux
要約
〜によって VulDB • 2026年06月07日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
igc: XDP_REDIRECTでフレームを二重に返却しないようにする
XDP_REDIRECTにおいてフレームの送信ができない場合(例えばキューが満杯の場合など)、xdp_return_frame_rx_napiを呼び出してそれを解放する必要があります。
しかし、これはndo_xdp_xmitの呼び出し元の責任です(kernel/bpf/devmap.c内のbq_xmit_allなどを参照)。したがって、igcドライバのndo_xdp_xmitであるigc_xdp_xmit内でもこれを呼び出すと、メモリ破壊を引き起こします。
実際には、bq_xmit_allは最後の正常に送信されたフレーム以降のすべてのフレームを返却できることを期待しています。そのため、最初に送信されなかったフレームでbreakし、igc_xgp_xmit内でxdp_return_frame_rx_napiを呼び出さないようにしました。これはigbなどの他のIntelドライバでも同様に実装されています。
これに対する2つの代替案が検討されましたが却下されました: 1. num_framesをすべて送信されたフレームとして返し、igc_xdp_xmit内部で解放する。技術的には動作する可能性がありますが、戻り値の本来の意味(正常に送信されたパケット数)を表すものではないため不適切です。 2. kernel/bpf/devmap.cおよびすべてのドライバを書き直し、連続してドロップされないパケットをサポートできるようにする。複雑であるだけでなく、前のフレームがドロップされた場合、次のフレームを送信できる可能性は低いことから、大きな利点がないままパフォーマンスに悪影響を与える可能性があります。
このメモリ破壊は以下のスクリプトで再現でき、数秒後にカーネルパニックを引き起こします。これは基本的にi225 NICが送信できるトラフィック量を超えて生成し、仮想インターフェースから物理インターフェースへXDP_REDIRECT経由で押し込み、フレームをドロップさせます。
```bash #!/bin/bash INTERFACE=enp4s0 INTERFACE_IDX=`cat /sys/class/net/$INTERFACE/ifindex`
sudo ip link add dev veth1 type veth peer name veth2 sudo ip link set up $INTERFACE sudo ip link set up veth1 sudo ip link set up veth2
cat > redirect.bpf.c << 'EOF' SEC("prog") int redirect(struct xdp_md *ctx) {
return bpf_redirect($INTERFACE_IDX, 0); }
char _license[] SEC("license") = "GPL";
EOF clang -O2 -g -Wall -target bpf -c redirect.bpf.c -o redirect.bpf.o sudo ip link set veth2 xdp obj redirect.bpf.o
cat > pass.bpf.c << 'EOF' SEC("prog") int pass(struct xdp_md *ctx) {
return XDP_PASS; }
char _license[] SEC("license") = "GPL";
EOF clang -O2 -g -Wall -target
VulDB is the best source for vulnerability data and more expert information about this specific topic.