CVE-2024-40918

Yüksek

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: parisc: Paket derlemelerindeki rastgele segmentation fault hatalarının düzeltilmesi deneniyor PA8800 ve PA8900 işlemcili PA-RISC sistemleri uzun yıllardır rastgele segmentation fault hataları sorunları yaşamaktadır. Daha eski işlemcilere sahip sistemler çok daha kararlıdır. PA8800 ve PA8900 işlemcili sistemler, geniş bir aralık temizlendiğinde makul performans için sayfa başına temizleme gerektiren büyük bir L2 önbelleğe sahiptir. Bu sistemlerdeki birleşik önbellek, önceki sistemlerdeki önbelleklere göre eşdeğer olmayan takma adlara (non-equivalent aliases) karşı daha hassastır. İncelediğim rastgele segmentation fault hatalarının çoğunluğu, mmap ve malloc kullanılarak ayrılan bellekteki bellek bozulmaları gibi görünmektedir. Rastgele hataları düzeltmeye yönelik ilk girişimim işe yaramadı. Önbellek kodunu incelediğimde, mevcut kodun doğru şekilde işlemediği iki sorun olduğunu fark ettim. Her ikisi de önbellek taşıma işlemiyle (cache move-in) ilgilidir. Bir diğer sorun ise PTE'lerdeki present bitinin yarış durumuna (racy) açık olmasıdır. 1) PA-RISC önbellekleri kendi başlarına hareket ederler ve taşıma işlemine izin veren bir TLB girişi olduğu sürece bir sayfa için veri ve talimatları spekülatif olarak yükleyebilirler. TLB'ler her CPU'ya yereldir. Bu nedenle, sayfayı temizlemeden önce sayfanın TLB girişi boşaltılmalıdır. Bu durum özellikle SMP sistemlerde önemlidir. Bazı temizleme rutinlerinde, önce temizleme rutini çağrılıyor ve ardından TLB girişi boşaltılıyordu. Bunun nedeni, temizleme rutininin temizleme işlemini gerçekleştirmek için TLB girişine ihtiyaç duymasıydı. 2) Rastgele hataları düzeltmek için başlangıç yaklaşımım, tüm temizleme işlemleri için flush_cache_page_if_present kullanmaya çalışmaktı. Bu aslında durumu daha da kötüleştirdi ve birkaç donanım kilitlenmesine yol açtı. Sonunda, pte kontrol kodunun yarış durumuna açık olması nedeniyle bazı satırların temizlenmediğini anladım. Bu durum, fiziksel sayfalara rastgele eşdeğer olmayan eşleşmelere neden oldu. __flush_cache_page tmpalias temizliği kendi TLB girişini kurar ve mevcut TLB girişine ihtiyaç duymaz. vm sayfası için pte işaretçisini bulabildiğimiz sürece, sayfanın pfn değerini ve fiziksel adresini alabiliriz. Ayrıca temizleme işlemini yapmadan önce sayfanın TLB girişini boşaltabiliriz. Dahası, __flush_cache_page, önbellek taşımasını engelleyen özel bir TLB girişi kullanır. Sayfa eşleşmelerini değiştirirken, satırların önbellekten kaldırıldığından emin olmamız gerekir. Satırlar geri gelebileceği için onları sadece belleğe temizlemek yeterli değildir. Bu durum, gerekli tüm temizleme işlemlerini tmpalias rutinlerini kullanarak uygulamamız gerektiğini açıkça ortaya koydu. Buna kullanıcı ve çekirdek sayfaları için yapılan temizlemeler dahildir. Kodu tmpalias temizlemelerini kullanacak şekilde değiştirdikten sonra, rastgele segmentation fault hatalarının tamamen çözülmediği anlaşıldı. Hataların sıklığı, 64 MB L2'ye sahip sistemlerde (PA8900) ve daha fazla CPU'ya sahip sistemlerde (rp4440) daha kötüydü. Temizlenemeyen sayfaları tespit etmek için flush_cache_page_if_present fonksiyonuna eklediğim uyarı, bazı sistemlerde sık sık tetiklendi. Helge ile birlikte temizlenemeyen sayfalara baktık ve PTE'nin ya temizlendiğini ya da bir swap sayfası olduğunu gördük. Swap edilen sayfaları görmezden gelmek uygun göründü ancak PTE'si temizlenmiş sayfalar sorunlu görünüyordu. pte_clear ile ilgili rutinleri inceledim ve ptep_clear_flush fonksiyonunu fark ettim. Varsayılan uygulama sadece TLB girişini temizliyordu. Ancak, parisc üzerinde önbellek sayfasını da temizlememiz gerektiği açıktı. Eğer önbellek sayfasını temizlemezsek, önbellekte güncelliğini yitirmiş satırlar kalacak ve rastgele bozulmalara neden olacaktır. Bir PTE temizlendikten sonra, PTE ile ilişkili fiziksel adresi bulmanın ve ilişkili sayfayı daha sonra temizlemenin hiçbir yolu yoktur. ptep_clear_flush'ın parisc'e özgü bir versiyonuyla güncellenmiş bir değişiklik uyguladım. Bu, Helge'nin rp4440 ve rp3440 cihazlarının yanı sıra benim c8000 cihazımdaki rastgele veri bozulmalarını düzeltti. Bu noktada, yalnızca sayfa erişilmişse temizleme yaptığımız flush_cache_page_if_present kodunu geri getirebileceğimi fark ettim. Ancak bunun için, accessed biti temizlendiğinde de önbelleği temizlememiz gerekiyor...

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın12 Tem 2024
İlk görülme12 Tem 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.6.35, 6.9.6 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernelv < 6.6.35, 6.7 ≤ v < 6.9.6, 6.106.6.35, 6.9.6

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.

Intelligence 360 paketinde

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.

CVE-2024-40918 · Linux Kernel · Dark Radar