CVE-2024-26991

Orta

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: KVM: x86/mmu: x86: Öznitelikler kontrol edilirken lpage_info taşmasının önlenmesi private_mem_conversions_test self-testinde görüldüğü üzere, KVM_SET_MEMORY_ATTRIBUTES işleminin lpage_info dizisini taşırması ve KASAN splat tetiklemesi sorunu düzeltildi. Bir GFN aralığında bellek öznitelikleri ayarlandığında, bu aralık TDP'ye uygulanan belirli özelliklere sahip olur. Öznitelikler tutarsız olduğunda dev sayfa (huge page) kullanılamaz, bu nedenle söz konusu dev sayfalar için bunlar devre dışı bırakılır. Dahili KVM nedenleriyle, destekleyici belleğin dev sayfa olarak eşlenebilip eşlenemeyeceğine bakılmaksızın, dev sayfaların bitişik memslot'ları kapsamasına da izin verilmez. Hangi GFN'lerin hangi dev sayfa boyutlarını desteklediği, memslot üzerindeki 'kvm_lpage_info' yapılarıyla oluşan bir dizi dizisi olan 'lpage_info' ile takip edilir. lpage_info'nun her indeksi, desteklenen belirli bir sayfa boyutu için vmalloc ile tahsis edilmiş bir dizi içerir. kvm_lpage_info, memslot üzerindeki belirli bir dev sayfanın (GFN ve sayfa boyutu) desteklenip desteklenmediğini belirtir. Bu diziler, hizalanmamış baş (head) ve kuyruk (tail) dev sayfaları için indeksler içerir. Dev sayfaların bitişik memslot'ları kapsamasının önlenmesi, memslot tahsis edildiğinde baş ve kuyruk kvm_lpage_info içindeki sayacın artırılmasıyla sağlanır; ancak karma özniteliklere sahip bellekler için dev sayfaların yasaklanması daha karmaşık bir şekilde yapılmalıdır. KVM_SET_MEMORY_ATTRIBUTES ioctl işlemi sırasında KVM, aralıktaki uyumsuz özniteliklere sahip her memslot için lpage_info'yu günceller. KVM bunu her seferinde bir memslot olacak şekilde yapar ve herhangi bir dev sayfa için kvm_lpage_info içinde özel bir bit olan KVM_LPAGE_MIXED_FLAG'i işaretler. Bu bit aslında kalıcı olarak yükseltilmiş bir sayaçtır. Dolayısıyla, ya memslot ile hizalanmamış bir dev baş veya kuyruk sayfası varsa ya da karma öznitelikler nedeniyle KVM_LPAGE_MIXED_FLAG ayarlanmışsa, o sayfa boyutundaki GFN için dev sayfalar eşlenmeyecektir. Bir dev sayfanın tutarlı özniteliklere sahip olup olmadığını belirlemek için KVM_SET_MEMORY_ATTRIBUTES işlemi, gelen özniteliğe tutarlı bir şekilde sahip olduğunu doğrulamak amacıyla bir xarray'i kontrol eder. Seviye - 1 dev sayfalar seviye dev sayfalara hizalandığından, bir optimizasyon kullanılır. Seviye - 1 dev sayfalar önce kontrol edildiği sürece, sadece bunları kontrol edebilir ve eğer seviye boyutundaki dev sayfa içinde bulunan her bir seviye - 1 dev sayfa karma değilse, seviye boyutundaki dev sayfanın da karma olmadığını varsayabilir. Bu optimizasyon hugepage_has_attrs() yardımcı fonksiyonunda gerçekleşir. Maalesef, 'level' sayfa boyutunu temsil eden kvm_lpage_info dizisi, level boyutundaki hizalanmamış bir kuyruk sayfası için giriş içerse de, level - 1 dizisi level sayfa boyutundaki her GFN için bir giriş içermez. level - 1 dizisi yalnızca level - 1 dev sayfa boyutu tarafından kapsanan herhangi bir hizalanmamış bölge için bir indeks içerir ve bu daha küçük bir bölge olabilir. Bu durum, optimizasyonun level - 1 kvm_lpage_info'yu taşırmasına ve sınırların dışında (out of bounds) bir vmalloc okuması yapmasına neden olur. Taşmanın meydana gelebileceği bazı baş ve kuyruk sayfası durumlarında, daha önce tartışıldığı gibi dev sayfaları önlemek için KVM_LPAGE_MIXED_FLAG gerekmediğinden çağrıcılar işlemi tamamen atlar. Ancak 1GB sayfa boyutundan daha küçük olan memslot'lar için hugepage_has_attrs() çağrılır. Bu durumda dev sayfa hem baş hem de kuyruk sayfasıdır. Sorun, çekirdeğin CONFIG_KASAN_VMALLOC ile derlenmesi ve şu çıktıyı üreten “private_mem_conversions_test” self-testinin çalıştırılmasıyla gözlemlenebilir: BUG: KASAN: vmalloc-out-of-bounds in hugepage_has_attrs+0x7e/0x110 Read of size 4 at addr ffffc900000a3008 by task private_mem_con/169 Call Trace: dump_stack_lvl print_report ? __virt_addr_valid ? hugepage_has_attrs ? hugepage_has_attrs kasan_report ? hugepage_has_attrs hugepage_has_attrs kvm_arch_post_set_memory_attributes kvm_vm_ioctl Hizalanmamış baş sayfasının (hata durumunda aynı zamanda kuyruk sayfasıdır) KVM_LPAGE_MIXED_FLAG değerine sahip olmasının beklenip beklenmeyeceği biraz belirsizdir. İşlevsel olarak gerekli değildir çünkü...

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın1 May 2024
İlk görülme1 May 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.8.8 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.8 ≤ v < 6.8.8, 6.96.8.8

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-26991 · Linux Kernel · Dark Radar