CVE-2026-97533
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: x86/mm/pat: UAF'yi önlemek için öznitelik değişikliklerinde init_mm okuma kilidi alınır Önceki bir commit, ptdump ile CPA collapse arasındaki yarış durumlarına karşı koruma sağlamıştı; ancak Denis V. Lunev tarafından bildirildiği üzere, öznitelik değişiklikleri ve collapse arasında hala bir yarış durumu mevcuttur. Bir öznitelik değişikliği meydana geldiğinde, kilitsiz bir sayfa tablosu gezgini (page table walker), daha sonra set_pte_atomic() aracılığıyla üzerine yazılan bir PTE girdisi elde eder: ... -> change_page_attr_set_clr() -> __change_page_attr_set_clr() -> __change_page_attr() -> _lookup_address_cpa() -> lookup_address_in_pgd_attr() -> [ kilitsiz sayfa tablosu gezgini ] -> set_pte_atomic() Burada alınan PTE'nin serbest bırakılmasına neden olabilecek eşzamanlı bir CPA collapse işlemini engelleyen hiçbir şey yoktur ve bu durum bir serbest bırakıldıktan sonra kullanım (use-after-free) hatasına yol açar. CPA collapse sırasında init_mm üzerinde mmap yazma kilidinin alınmasıyla birlikte, __change_page_attr_set_clr() üzerinden init_mm üzerinde bir mmap okuma kilidi alınarak bu yarış durumu çözülür. Bu işlem, gezinti ve PTE girdisi yazımının gerçekleştiği tüm operasyon boyunca kilitleme sağlayarak yarış durumunu çözer. __change_page_attr_set_clr() girişinde herhangi bir spinlock tutulmadığından bunu burada yapmak güvenlidir. Ancak kilit, bir tahsis (allocation) işlemi sırasında tutulmamalıdır; çünkü tahsis işlemi geri kazanımı (reclaim) tetikleyebilir ve shrinker'lar CPA'yı özyinelemeli olarak çağırabilir, bu da deadlock olasılığını doğurur (init_mm -> ... -> fs_reclaim -> init_mm). Büyük bir sayfanın bölünmesi gerektiğinde bir sayfa tablosu tahsis edilir: -> change_page_attr_set_clr() -> __change_page_attr_set_clr() -> __change_page_attr() -> split_large_page() [ pagetable_alloc() ] -> __split_large_page() split_large_page() içerisindeki pagetable_alloc() sırasında mmap kilidi bırakılarak deadlock'lardan kaçınılır ve bunun gerekli olup olmadığı struct cpa_data yapısına yeni bir 'init_mm_read_locked' bayrağı eklenerek takip edilir. Kilitler yeniden kurulduktan sonra çağrılan __split_large_page(), sayfa tablosu girdisinin kilitlerin bırakılmasından öncekiyle aynı olduğunu yeniden doğruladığı ve __split_large_page() her bölünme gerçekleştiğinde tüm sayfa tablosu gezintisini tekrarladığı için bu işlem güvenlidir; böylece eşzamanlı bölünme ve collapse durumları hesaba katılmış olur. Eşzamanlı ptdump işlemi de güvenlidir çünkü kilit yalnızca sayfa tablosunun henüz değiştirilmediği sayfa tablosu tahsisi sırasında bırakılır. CPA_COLLAPSE bayrağı yalnızca münhasıran vmalloc aralıklarında ve x86'da sadece modül eşleme alanı içinde çalışan set_memory_rox() tarafından ayarlanır. Bu önemlidir çünkü bazı çağırıcılar bu kilidi atlayarak doğrudan __change_page_attr_set_clr() fonksiyonunu çağırır. Ancak bunlardan hiçbiri modül eşleme alanı içinde çalışmaz: * cpa_process_alias() - __change_page_attr_set_clr() tarafından çağrılan özyinelemeli bir yardımcı fonksiyondur. * __set_memory_enc_pgtable() - doğrudan eşleme ve (__vmbus_establish_gpadl() aracılığıyla) vmalloc eşleme alanı üzerinde çalışır. * __set_pages_[n]p() - set_direct_map_[invalid, default, valid]_noflush(), __kernel_map_pages() tarafından çağrılır - doğrudan eşleme üzerinde çalışır. * kernel_[un]map_pages_in_pgd() - EFI aralıkları üzerinde çalışır. Bu çalışma, Denis V. Lunev'in hata üzerindeki mükemmel analizine dayanmaktadır.
Nasıl düzeltilir
- Linux Linuxe21a9ea81426a85fdb0cdcfcc99d5d9c16b402ab, cc73b2043d106b467accd38e9b1fc09e0607c056, d5d8b8662e6e5a565b47a0388640e88402f23274 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | 41d88484c71cd4f659348da41b7b5b3dbd3be1f6 ≤ v < e21a9ea81426a85fdb0cdcfcc99d5d9c16b402ab, 41d88484c71cd4f659348da41b7b5b3dbd3be1f6 ≤ v < cc73b2043d106b467accd38e9b1fc09e0607c056, 41d88484c71cd4f659348da41b7b5b3dbd3be1f6 ≤ v < d5d8b8662e6e5a565b47a0388640e88402f23274, 6.15 | e21a9ea81426a85fdb0cdcfcc99d5d9c16b402ab, cc73b2043d106b467accd38e9b1fc09e0607c056, d5d8b8662e6e5a565b47a0388640e88402f23274 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.