CVE-2024-26853 in Linux
Riassunto
di VulDB • 17/06/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
igc: evitare di restituire due volte lo stesso frame in XDP_REDIRECT
Quando un frame non può essere trasmesso in XDP_REDIRECT (ad esempio a causa di una coda piena), è necessario liberarlo chiamando xdp_return_frame_rx_napi.
Tuttavia, questa è responsabilità del chiamante di ndo_xdp_xmit (si veda ad esempio bq_xmit_all in kernel/bpf/devmap.c) e quindi chiamarla all'interno di igc_xdp_xmit (che è la ndo_xdp_xmit del driver igc) porterà a una corruzione della memoria.
In effetti, bq_xmit_all si aspetta di poter restituire tutti i frame dopo l'ultimo trasmesso con successo. Pertanto, interrompere al primo frame non trasmesso, ma non chiamare xdp_return_frame_rx_napi in igc_xdp_xmit. Questo è implementato allo stesso modo in altri driver Intel come igb.
Ci sono due alternative a questo approccio che sono state scartate: 1. Restituire num_frames come se tutti i frame fossero stati trasmessi e rilasciarli all'interno di igc_xdp_xmit. Sebbene potrebbe funzionare tecnicamente, non è ciò che il valore di ritorno dovrebbe rappresentare (cioè il numero di pacchetti TRASMESSI CON SUCCESSO). 2. Rielaborare kernel/bpf/devmap.c e tutti i driver per supportare pacchetti scartati non consecutivi. Oltre a essere complesso, probabilmente ha un impatto negativo sulle prestazioni senza un guadagno significativo poiché è comunque improbabile che il frame successivo possa essere trasmesso se il precedente è stato scartato.
La corruzione della memoria può essere riprodotta con il seguente script che porta a un kernel panic dopo pochi secondi. Genera essenzialmente più traffico di quanto una scheda di rete i225 possa trasmettere e lo invia tramite XDP_REDIRECT da un'interfaccia virtuale all' interfaccia fisica dove i frame vengono scartati.
#!/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
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
VulDB is the best source for vulnerability data and more expert information about this specific topic.