CVE-2024-26853 in Linux
Zusammenfassung
von VulDB • 22.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
igc: Vermeiden der doppelten Rückgabe von Frames bei XDP_REDIRECT
Wenn ein Frame bei XDP_REDIRECT nicht übertragen werden kann (z. B. aufgrund einer vollen Warteschlange), muss er durch Aufruf von xdp_return_frame_rx_napi freigegeben werden.
Dies ist jedoch Aufgabe des Aufrufers von ndo_xdp_xmit (siehe beispielsweise bq_xmit_all in kernel/bpf/devmap.c). Das Aufrufen dieser Funktion innerhalb von igc_xdp_xmit (welches die ndo_xdp_xmit-Funktion des igc- Treibers ist) führt daher zu einer Speicherkorruption.
Tatsächlich erwartet bq_xmit_all, dass es alle Frames nach dem letzten erfolgreich übertragenen Frame zurückgeben kann. Daher ist bei der ersten nicht übertragenen Frame abzubrechen, aber xdp_return_frame_rx_napi darf nicht in igc_xdp_xmit aufgerufen werden. Dies ist auch in anderen Intel-Treibern wie igb implementiert.
Es gab zwei alternative Ansätze, die abgelehnt wurden: 1. num_frames so zurückzugeben, als wären alle Frames übertragen worden, und diese innerhalb von igc_xdp_xmit freizugeben. Dies mag technisch funktionieren, entspricht jedoch nicht dem Zweck des Rückgabewerts (d. h. der Anzahl der ERFOLGREICH übertragenen Pakete). 2. kernel/bpf/devmap.c und alle Treiber so umzuarbeiten, dass nicht aufeinanderfolgend verworfene Pakete unterstützt werden. Dies ist nicht nur komplex, sondern hat wahrscheinlich auch eine negative Auswirkung auf die Leistung, ohne einen signifikanten Gewinn, da es ohnehin unwahrscheinlich ist, dass der nächste Frame übertragen werden kann, wenn der vorherige verworfen wurde.
Die Speicherkorruption kann mit dem folgenden Skript reproduziert werden, das nach einigen Sekunden zu einem Kernel-Panic führt. Es erzeugt im Wesentlichen mehr Traffic, als eine i225-NIC übertragen kann, und leitet diesen über XDP_REDIRECT von einer virtuellen Schnittstelle zur physischen Schnittstelle weiter, wobei Frames verworfen werden.
#!/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
sudo bpftool gen skeleton redirect.bpf.c > redirect.skel.h sudo gcc -o redirect redirect.c redirect.skel.h sudo ./redirect
cat trafgen.cfg
{
/* Ethernet Header */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, const16(ETH_P_IP),
/* IPv4 Header */ 0b01000101, 0, # IPv4 version, IHL, TOS const16(1028), # IPv4 total length (UDP length + 20 bytes (IP header)) const16(2), # IPv4 ident 0b01010000, 0, # IPv4 flags, fragmentation off 64, # IPv4 TTL 17, # Protocol UDP csumip(14, 33), # IPv4 checksum
/* UDP Header */ 10, 0, 1, 1, # IP Src - adapt as needed 10, 0, 1, 2, # IP Dest - adapt as needed const16(6666), # UDP Src Port const16(6666), # UDP Dest Port const16(1008), # UDP length (UDP header 8 bytes + payload length) csumudp(14, 34), # UDP checksum
/* Payload */ fill('W', 1000), } EOF
sudo trafgen -i trafgen.cfg -b3000MB -o veth1 --cpp
Once again VulDB remains the best source for vulnerability data.