CVE-2025-37964
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: x86/mm: TLB təmizlənmələrinin təsadüfən ötürülə biləcəyi boşluğun aradan qaldırılması Qısa xülasə: mm dəyişdirilməsi kodunda yeni CR3-ün təyin edildiyi və CPU-nun yeni mm üçün TLB təmizlənmələri almalı olduğu bir boşluq mövcuddur. Lakin should_flush_tlb() funksiyasında xəta var və o, təmizləməni bloklayır. Bu problem, should_flush_tlb() funksiyasının IPI göndərdiyi boşluğu genişləndirməklə həll edilmişdir. Ətraflı versiya: === Tarixçə === Buna səbəb olan bir neçə amil var idi. İlk öncə, mm_cpumask() yeniləməsinin çox bahalı olduğu müşahidə edildi və bu proses daha "tənbəl" (lazy) hala gətirildi. Lakin tənbəl yanaşma, artıq tənbəl olan mm_cpumask() səbəbindən CPU-lara həddindən artıq lazımsız IPI-lərin göndərilməsinə yol açdı. Buna görə də, mm_cpumask()-i dövri olaraq təmizləmək üçün kod əlavə edildi[2]. Lakin bu təmizləmə prosesi həddindən artıq aqressiv oldu və TLB təmizlənmələrinə ehtiyacı olan CPU-lara onların göndərilməsini ötürdü. Beləliklə, yenidən eyni problemlə qarşılaşdıq. === Problem === should_flush_tlb() funksiyasındakı həddindən artıq aqressiv kod bu boşluqda təsir göstərir: // Bu CPU/mm kombinasiyası üçün IPI-ləri aktivləşdir, lakin yalnız // should_flush_tlb() razılaşarsa: cpumask_set_cpu(cpu, mm_cpumask(next)); next_tlb_gen = atomic64_read(&next->context.tlb_gen); choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush); load_new_mm_cr3(need_flush); // ^ 'need_flush' false təyin edildikdən sonra, IPI-lər mütləq // bu CPU-ya göndərilməli və nəzərə alınmalıdır. this_cpu_write(cpu_tlbstate.loaded_mm, next); // ^ Yalnız bu nöqtədən sonra should_flush_tlb() doğru (true) olur! should_flush_tlb() funksiyası load_new_mm_cr3() ilə 'loaded_mm'-ə yazılma arasındakı boşluqda TLB təmizlənmələrini bloklayacaqdır, halbuki bu boşluqda onlar bloklanmamalıdır. === Həll yolu === Xoşbəxtlikdən, "CR3-ə yazmaq üzrə" olan qeyri-müəyyən boşluq artıq loaded_mm==LOADED_MM_SWITCHING ilə işarələnib. should_flush_tlb() funksiyasında sadəcə bu vəziyyətin yoxlanılması CPU-nun IPI hədəfi olmasını təmin etmək üçün kifayətdir. Bu, daha çox TLB təmizləmə IPI-lərinə səbəb olacaq. Lakin boşluq nisbətən kiçikdir və bunun ölçüləbilən performans təsirinə səbəb olacağını gözləmirəm. LOADED_MM_SWITCHING yazıldığı şərhi yeniləyin, çünki onun istifadə sahəsi daha da genişləndi. Peter Z həmçinin narahatlığını bildirdi ki, should_flush_tlb() funksiyası 'loaded_mm' və 'is_lazy' dəyişənlərini switch_mm_irqs_off() funksiyasının onları yazdığı ardıcıllıqla görməyə bilər. Onların yazıldığı ardıcıllıqla oxunduğunu təmin etmək üçün barier (barrier) əlavə edildi.
Necə düzəltmək olar
- linux linux_kernel5.15.183, 6.1.139, 6.6.91, 6.12.29, 6.14.7 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.15.179 ≤ v < 5.15.183, 6.1.129 ≤ v < 6.1.139, 6.6.79 ≤ v < 6.6.91, 6.12.16 ≤ v < 6.12.29, 6.13.4 ≤ v < 6.14.7, 6.15 | 5.15.183, 6.1.139, 6.6.91, 6.12.29, 6.14.7 |
| debian debian_linux | 11.0 | — |
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.