CVE-2024-26853
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: igc: XDP_REDIRECT-də freymin iki dəfə qaytarılmasının qarşısının alınması XDP_REDIRECT zamanı bir freym ötürülə bilmədikdə (məsələn, növbənin dolu olması səbəbindən), xdp_return_frame_rx_napi çağırılarak onun azad edilməsi zəruridir. Lakin bu, ndo_xdp_xmit funksiyasının çağıran tərəfinin məsuliyyətidir (məsələn, kernel/bpf/devmap.c faylındakı bq_xmit_all funksiyasına baxın) və buna görə də həmçinin igc_xdp_xmit (igc drayverinin ndo_xdp_xmit funksiyasıdır) daxilində onu çağırmaq yaddaşın korlanmasına (memory corruption) səbəb olacaqdır. Əslində, bq_xmit_all uğurla ötürülmüş sonuncu freymdən sonra bütün freymləri qaytara biləcəyini gözləyir. Buna görə də, ötürülməmiş ilk freym üçün dövrü dayandırın (break), lakin igc_xdp_xmit daxilində xdp_return_frame_rx_napi funksiyasını çağırmayın. Bu, digər Intel drayverlərində (məsələn, igb) eyni şəkildə tətbiq edilmişdir. Buna alternativ olaraq rədd edilən iki variant mövcud idi: 1. Bütün freymlər ötürülmüş kimi num_frames qaytarmaq və onları igc_xdp_xmit daxilində azad etmək. Texniki cəhətdən işləyə bilsə də, bu, geri qaytarılan dəyərin ifadə etməli olduğu məna ilə (yəni UĞURLA ötürülmüş paketlərin sayı) uyğun gəlmir. 2. Ardıcıl olmayan atılmış paketləri dəstəkləmək üçün kernel/bpf/devmap.c və bütün drayverləri yenidən qurmaq. Mürəkkəb olmasından əlavə, əvvəlki freym atıldıqda növbəti freymin ötürülmə ehtimalı az olduğundan, bu, əhəmiyyətli bir qazanım olmadan performansda mənfi təsir göstərə bilərdi. Yaddaşın korlanması, bir neçə saniyədən sonra kernel panic-ə səbəb olan aşağıdakı skriptlə təkrar istehsal edilə bilər. Skript əsasən i225 NIC-in ötürə biləcəyindən daha çox trafik yaradır və bunu XDP_REDIRECT vasitəsilə virtual interfeysdən fiziki interfeysə yönləndirir ki, burada freymlər atılır. #!/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 << EOF > 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 sudo ip link set veth2 xdp obj redirect.bpf.o cat << EOF > pass.bpf.c SEC("prog") int pass(struct xdp_md *ctx) { return XDP_PASS; } char _license[] SEC("license") = "GPL"; EOF clang -O2 -g -Wall -target bpf -c pass.bpf.c -o pass.bpf.o sudo ip link set $INTERFACE xdp obj pass.bpf.o cat << EOF > trafgen.cfg { /* Ethernet Header */ 0xe8, 0x6a, 0x64, 0x41, 0xbf, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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 0b01000000, 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
Necə düzəltmək olar
- linux linux_kernel6.1.82, 6.6.22, 6.7.10 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 5.13 ≤ v < 6.1.82, 6.2 ≤ v < 6.6.22, 6.7 ≤ v < 6.7.10, 6.8 | 6.1.82, 6.6.22, 6.7.10 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.