CVE-2025-22058

Orta

Təsvir

Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: udp: Yaddaş uçotu sızmasının düzəldilməsi. Matt Dowling tərəfindən qeyri-adi UDP yaddaş istifadəsi problemi bildirilmişdir. Normal işləmə zamanı /proc/net/sockstat faylında göstərilən UDP yaddaş istifadəsi sıfıra yaxın qalır. Lakin, bəzən bu rəqəm qəfil 524,288 səhifəyə yüksəlir və heç vaxt azalmır. Üstəlik, tətbiq dayandırıldıqda bu dəyər ikiqat artırdı. Nəticədə, fasiləli paket itkiləri baş verirdi. Problem aşağıdakı skriptlə [0] təkrarlana bilər: 1. /proc/net/sockstat 0 səhifə hesabat verir # cat /proc/net/sockstat | grep UDP: UDP: inuse 1 mem 0 2. Hesabat 524,288-ə çatana qədər skripti işlədin # python3 test.py & sleep 5 # cat /proc/net/sockstat | grep UDP: UDP: inuse 3 mem 524288 <-- (INT_MAX + 1) >> PAGE_SHIFT 3. Soketi bağlayın və rəqəmin azalmadığını təsdiqləyin # pkill python3 && sleep 5 # cat /proc/net/sockstat | grep UDP: UDP: inuse 1 mem 524288 4. (v6.0 versiyasından etibarən lazımdır) proto_memory_pcpu_drain() funksiyasını tetikləyin # python3 test.py & sleep 1 && pkill python3 5. Rəqəm ikiqat artır # cat /proc/net/sockstat | grep UDP: UDP: inuse 1 mem 1048577 Tətbiq SO_RCVBUF üçün INT_MAX dəyərini təyin etmişdir ki, bu da udp_rmem_release() funksiyasında tam ədəd daşmasına (integer overflow) səbəb olmuşdur. Soket close() edildikdə, udp_destruct_common() onun qəbul növbəsini təmizləyir və növbədəki skb->truesize cəmini hesablayır. Bu cəm yerli imzalanmamış tam ədəd (unsigned integer) dəyişənində hesablanır və saxlanılır. Yaddaş uçotunu tənzimləmək üçün ümumi ölçü sonra udp_rmem_release() funksiyasına ötürülür. Lakin, funksiya imzalı tam ədəd (signed integer) arqumenti qəbul etdiyi üçün ümumi ölçü dövr edə (wrap around) və daşmaya səbəb ola bilər. Sonra azad edilən miqdar aşağıdakı kimi hesablanır: 1) Ölçünü sk->sk_forward_alloc dəyərinə əlavə edin. 2) sk->sk_forward_alloc dəyərini PAGE_SIZE-ın ən yaxın aşağı qatına yuvarlaqlaşdırın və onu amount dəyişəninə mənimsədin. 3) Amount dəyərini sk->sk_forward_alloc-dan çıxarın. 4) amount >> PAGE_SHIFT dəyərini __sk_mem_reduce_allocated() funksiyasına ötürün. Problem baş verdikdə, udp_destruct_common()-da cəm 2147484480 (INT_MAX + 833) idi, hansı ki, udp_rmem_release()-da -2147482816 olaraq çevrildi. 1)-ci mərhələdə sk->sk_forward_alloc 3264-dən -2147479552-yə dəyişir və 2)-ci mərhələdə -2147479552 amount-a təyin edilir. 3)-cü mərhələ dövrü geri qaytarır, buna görə də inet_sock_destruct()-da xəbərdarlıq görmürük. Lakin, 4)-cü mərhələdə udp_memory_allocated ikiqat artır. 3cd3399dd7a8 ("net: implement per-cpu reserves for memory_allocated") commit-indən sonra, soket close() edildikdən dərhal sonra yaddaş istifadəsi artıq ikiqat artmır, çünki __sk_mem_reduce_allocated() miqdarı udp_memory_per_cpu_fw_alloc-da keşləyir. Lakin, UDP soketi növbəti dəfə paket qəbul etdikdə, çıxma əməliyyatı qüvvəyə minir və UDP yaddaş istifadəsinin ikiqat artmasına səbəb olur. Bu problem, soketin sk->sk_rmem_alloc dəyəri net.ipv4.udp_rmem_min həddini aşdıqda növbəti yaddaş ayırmalarının uğursuz olmasına və nəticədə paket itkilərinə səbəb olur. Bu problemin qarşısını almaq üçün hesablamalarda unsigned int istifadə edək və kiçik delta üçün sk_forward_alloc_add() funksiyasını yalnız bir dəfə çağıraq. Qeyd edək ki, first_packet_length() funksiyasında da potensial olaraq eyni problem mövcuddur. [0]: from socket import * SO_RCVBUFFORCE = 33 INT_MAX = (2 ** 31) - 1 s = socket(AF_INET, SOCK_DGRAM) s.bind(('', 0)) s.setsockopt(SOL_SOCKET, SO_RCVBUFFORCE, INT_MAX) c = socket(AF_INET, SOCK_DGRAM) c.connect(s.getsockname()) data = b'a' * 100 while True: c.send(data)

CiddilikOrta
CVSS5.5
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc16 apr 2025
İlk görülmə16 apr 2025

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel5.4.301, 5.10.246, 5.15.195, 6.1.134, 6.6.87, 6.12.23, 6.13.11, 6.14.2 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel4.10 ≤ v < 5.4.301, 5.5 ≤ v < 5.10.246, 5.11 ≤ v < 5.15.195, 5.16 ≤ v < 6.1.134, 6.2 ≤ v < 6.6.87, 6.7 ≤ v < 6.12.23, 6.13 ≤ v < 6.13.11, 6.14 ≤ v < 6.14.25.4.301, 5.10.246, 5.15.195, 6.1.134, 6.6.87, 6.12.23, 6.13.11, 6.14.2

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.

Intelligence 360 paketində

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.

CVE-2025-22058 · Linux Kernel · Dark Radar