CVE-2026-46110

Yüksək

Təsvir

Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: net: stmmac: RX yaddaşı tükəndikdə NULL deref-in qarşısının alınması CPU, MAC-dan konvensional DMA vasitəsilə freymləri qəbul edir: CPU, MAC üçün buferlər ayırır, sonra MAC onları doldurur və mülkiyyəti CPU-ya qaytarır. Hər bir aparat təminatı RX növbəsi üçün CPU və MAC, hər DMA buferi üçün bir deskriptor olan ortaq DMA deskriptorları halqalı massivi vasitəsilə koordinasiya olunur. Hər bir deskriptora buferin fiziki ünvanı və hansı tərəfin buferə sahib olduğunu göstərən status bayrağı ("OWN") daxildir: CPU üçün OWN=0, MAC üçün OWN=1. Bayrağı yalnız CPU təyin edə bilər və yalnız MAC onu sıfırlaya bilər; hər ikisi halqa boyunca ardıcıl hərəkət etməlidir: beləliklə, halqa həm "təqdimatlar" (submissions), həm də "tamamlamalar" (completions) üçün istifadə olunur. stmmac drayverində, stmmac_rx() funksiyası halqadakı mövqeyini `cur_rx` indeksi ilə qeyd edir. Bu funksiyadakı əsas qəbul dövrü rx_descs[cur_rx].own=0 olub-olmadığını yoxlayır, müvafiq buferi şəbəkə stekinə ötürür (göstəricini NULL edir) və `cur_rx`-i halqa ölçüsü moduluna görə artırır. Dövr başa çatdıqdan sonra, öz mövqeyini `dirty_rx` ilə qeyd edən stmmac_rx_refill() yeni buferlər ayırır və deskriptorları yenidən aktivləşdirir (OWN=1 təyin edir). Əgər hər hansı ayırma uğursuz olarsa, o, sadəcə erkən dayanır (OWN=0 saxlayaraq) və növbəti çağırış zamanı qaldığı yerdən yenidən cəhd edəcəkdir. Bu o deməkdir ki, deskriptorların üç mərhələli həyat dövrü var: - `empty` (OWN=1, bufer keçərlidir) - `full` (OWN=0, bufer keçərlidir və doldurulub) - `dirty` (OWN=0, bufer NULL-dur) Lakin stmmac_rx() yalnız OWN-i yoxladığı üçün `full` və `dirty` hallarını qarışdırır. Keçmişdə ('Fixes:' baxın), dövrün `cur_rx`-i çirkləndirdiyi ilk deskriptora qədər tam fırlada bildiyi bir xəta var idi və bu, `full` kimi səhvən qəbul edildikdə NULL dereference ilə nəticələnirdi. Yuxarıda qeyd olunan commit, dövrün iterasiya limitini `dma_rx_size - 1` ilə məhdudlaşdıraraq həmin *spesifik* nasazlığı həll etmişdi, lakin bu yalnız qismən düzəlişdir: əgər əvvəlki stmmac_rx_refill() tamamlanmayıbsa, onda dövrün tam fırlanmasına ehtiyac qalmadan rast gələ biləcəyi artıq qalmış `dirty` deskriptorlar olur. Buna görə də, stmmac_rx_refill() uzun müddət yaddaş çatışmazlığı yaşadığında və `cur_rx` `dirty_rx`-ə çatdıqda cari kod panic verir (baxın 'Closes:'). Bunu, `cur_rx`-i irəli sürməzdən əvvəl növbəti girişin dirty olub-olmadığını açıq şəkildə yoxlayaraq və əgər elədirsə, dövrdən çıxaraq düzəldin. Bu, stmmac_rx_refill() uğurlu olana qədər sonuncu istifadə edilmiş deskriptorun emalının qarşısını alır, lakin əvvəlki xəta düzəlişinin nəzərdə tutduğu kimi `cur_rx == dirty_rx` qeyri-müəyyənliyini tamamilə aradan qaldırır: buna görə də məhdudiyyəti (clamp) də silin. stmmac_rx_zc() funksiyası stmmac_rx()-in kopyalanıb dəyişdirilmiş versiyası olduğu və kod strukturu eyni olduğu üçün, stmmac_rx()-ə edilən hər hansı düzəliş stmmac_rx_zc() üçün də müvafiq düzəliş tələb edəcəkdir. Buna görə də, eyni yoxlama orada da tətbiq edilsin. stmmac_rx()-də (stmmac_rx_zc()-də deyil) əlaqəli bir xəta qalmaqdadır: MAC sonuncu deskriptorda OWN=0 təyin etdikdən sonra, ona daha çox `empty` deskriptorlar verilməyənə qədər heç bir növbəti DMA-complete IRQ göndərə bilməyəcək. Hazırda drayver sadəcə növbəti stmmac_rx_refill()-in uğurlu olacağına *ümid edir*, əks halda qəbul prosesinin qeyri-müəyyən müddətə dayanması riski yaranır. Lakin bu reqressiya olmadığı üçün gələcək dəyişikliklərdə həll edilə bilər.

CiddilikYüksək
CVSS7.5
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc28 may 2026
İlk görülmə28 may 2026

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel6.1.176, 6.6, 6.6.140, 6.12.88, 6.18.30, 7.0.7 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel6.1.64 ≤ v < 6.1.176, 6.5.13 ≤ v < 6.6, 6.6.3 ≤ v < 6.6.140, 6.7.1 ≤ v < 6.12.88, 6.13 ≤ v < 6.18.30, 6.19 ≤ v < 7.0.7, 6.7, 7.16.1.176, 6.6, 6.6.140, 6.12.88, 6.18.30, 7.0.7

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.