CVE-2024-40918
Təsvir
Linux kernelində aşağıdakı zəiflik həll edilmişdir: parisc: paket qurmalarında təsadüfi seqmentasiya xətalarını düzəltməyə cəhd PA8800 və PA8900 prosessorları olan PA-RISC sistemlərində uzun illərdir təsadüfi seqmentasiya xətaları ilə bağlı problemlər müşahidə olunur. Daha erkən prosessorları olan sistemlər daha sabitdir. PA8800 və PA8900 prosessorları olan sistemlərdə böyük L2 keşi var ki, böyük diapazonun flaş edilməsi zamanı layiqli məhsuldarlıq üçün hər səhifənin flaş edilməsini tələb edir. Bu sistemlərdə birləşdirilmiş keş həm də qeyri-ekvivalent aliaslara qarşı əvvəlki sistemlərdəki keşlərdən daha həssasdır. Baxdığım təsadüfi seqmentasiya xətalarının əksəriyyəti mmap və malloc istifadə edilərək ayrılmış yaddaşda yaddaş korrupsiyası kimi görünür. Təsadüfi xətaları düzəltməyə ilk cəhdim işləmədi. Keş kodunu nəzərdən keçirərkən gördüm ki, mövcud kodun düzgün idarə etmədiyi iki məsələ var idi. Hər ikisi keşin move-in prosesi ilə bağlıdır. Digər bir məsələ isə PTE-lərdə present bitinin yarış vəziyyətində olmasıdır. 1) PA-RISC keşləri öz-özünə hərəkət edir və səhifə üçün TLB-də move-in imkanı verən giriş olduğu müddətcə səhifə üçün verilənləri və təlimatları spekulyativ şəkildə yükləyə bilər. TLB-lər hər CPU üçün lokaldır. Beləliklə, səhifəni flaş etməzdən əvvəl səhifə üçün TLB girişi təmizlənməlidir. Bu, xüsusilə SMP sistemlərində vacibdir. Bəzi flaş rutinlərində flaş rutini çağırılır və sonra TLB girişi təmizlənirdi. Bu, flaş rutininin flaşı yerinə yetirmək üçün TLB girişinə ehtiyac duyması səbəbindən belə idi. 2) Təsadüfi xətaları düzəltməyə ilk yanaşmam bütün flaş əməliyyatları üçün flush_cache_page_if_present istifadə etməyə cəhd idi. Bu, əslində vəziyyəti daha da pisləşdirdi və bir neçə aparat kilidlənməsinə səbəb oldu. Nəhayət başa düşdüm ki, bəzi sətirlər flaş edilmirdi, çünki pte yoxlama kodu yarış vəziyyətində idi. Bu, fiziki səhifələrə təsadüfi qeyri-ekvivalent mapinqə səbəb oldu. __flush_cache_page tmpalias flaşı öz TLB girişini qurur və mövcud TLB girişinə ehtiyac duymur. vm səhifəsi üçün pte göstəricisini tapa bildiyimiz müddətcə, səhifənin pfn və fiziki ünvanını əldə edə bilərik. Həmçinin flaşı yerinə yetirməzdən əvvəl səhifə üçün TLB girişini təmizləyə bilərik. Bundan əlavə, __flush_cache_page keşin move-in prosesini maneə törədən xüsusi TLB girişindən istifadə edir. Səhifə mapinqlərini dəyişdirərkən sətirlərin keşdən çıxarıldığına əmin olmalıyıq. Sətirləri sadəcə yaddaşa flaş etmək kifayət deyil, çünki onlar geri qayıda bilər. Bu, aydınlaşdırdı ki, bütün tələb olunan flaş əməliyyatlarını tmpalias rutinlərindən istifadə edərək həyata keçirməliyik. Buraya istifadəçi və kernel səhifələri üçün flaşlar da daxildir. Kodu tmpalias flaşlarından istifadə etmək üçün dəyişdirdikdən sonra aydın oldu ki, təsadüfi seqmentasiya xətaları tam həll olunmayıb. Xətaların tezliyi 64 MB L2 (PA8900) olan sistemlərdə və daha çox CPU (rp4440) olan sistemlərdə daha pis idi. Flaş edilə bilməyən səhifələri aşkar etmək üçün flush_cache_page_if_present-ə əlavə etdiyim xəbərdarlıq bəzi sistemlərdə tez-tez işə düşürdü. Helge ilə birlikdə flaş edilə bilməyən səhifələrə baxdıq və gördük ki, PTE ya təmizlənmiş, ya da swap səhifəsi üçün idi. Swap edilmiş səhifələrə məhəl qoymamaq normal görünürdü, lakin təmizlənmiş PTE-ləri olan səhifələr problemli görünürdü. pte_clear ilə əlaqəli rutinlərə baxdım və ptep_clear_flush-u gördüm. Standart tətbiq sadəcə TLB girişini flaş edir. Lakin aydın idi ki, parisc-də keş səhifəsini də flaş etməliyik. Əgər keş səhifəsini flaş etməsək, keşdə köhnəlmiş sətirlər qalacaq və təsadüfi korrupsiyaya səbəb olacaq. PTE təmizləndikdən sonra PTE ilə əlaqəli fiziki ünvanı tapmaq və əlaqəli səhifəni sonradan flaş etmək mümkün deyil. ptep_clear_flush-un parisc-ə xas versiyası ilə yenilənmiş dəyişikliyi tətbiq etdim. Bu, Helge-in rp4440 və rp3440, həmçinin mənim c8000 sistemimdə təsadüfi verilən korrupsiyasını düzəltdi. Bu nöqtədə başa düşdüm ki, flush_cache_page_if_present-də yalnız səhifəyə müraciət edildiyi halda flaş etdiyimiz kodu bərpa edə bilərəm. Lakin bunun üçün accessed biti təmizləndikdə də keşi flaş etməliyik ---kəsilmiş---
Necə düzəltmək olar
- linux linux_kernel6.6.35, 6.9.6 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 | v < 6.6.35, 6.7 ≤ v < 6.9.6, 6.10 | 6.6.35, 6.9.6 |
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.