CVE-2025-40040
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: mm/ksm: ksm_madvise fonksiyonundaki bayrak düşürme davranımı düzeltildi syzkaller şu çökmeyi tespit etmiştir: (kernel BUG) [ 44.607039] ------------[ cut here ]------------ [ 44.607422] kernel BUG at mm/userfaultfd.c:2067! [ 44.608148] Oops: invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN NOPTI [ 44.608814] CPU: 1 UID: 0 PID: 2475 Comm: reproducer Not tainted 6.16.0-rc6 #1 PREEMPT(none) [ 44.609635] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 [ 44.610695] RIP: 0010:userfaultfd_release_all+0x3a8/0x460 <diğer kaydediciler kırpıldı, güvenilmez izler kaldırıldı> [ 44.617726] Call Trace: [ 44.617926] <TASK> [ 44.619284] userfaultfd_release+0xef/0x1b0 [ 44.620976] __fput+0x3f9/0xb60 [ 44.621240] fput_close_sync+0x110/0x210 [ 44.622222] __x64_sys_close+0x8f/0x120 [ 44.622530] do_syscall_64+0x5b/0x2f0 [ 44.622840] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 44.623244] RIP: 0033:0x7f365bb3f227 Çekirdek, userfaultfd_release_all() sırasında bir UFFD tutarsızlığı tespit ettiği için panic durumuna geçer. Spesifik olarak; vma->vm_userfaultfd_ctx için geçerli bir işaretçiye sahip olan ancak vma->vm_flags içinde UFFD bayrağı bulunmayan bir VMA söz konusudur. Bu tutarsızlık ksm_madvise() fonksiyonunda meydana gelir: Kullanıcı, MINOR modda UFFD için kayıtlı bir VMA üzerinde MADV_UNMEARGEABLE ile madvise() çağırdığında, yanlışlıkla vma->vm_flags'in üst 32 bitinde saklanan tüm bayraklar temizlenir. x86_64 çekirdek derlemesi varsayıldığında, unsigned long 64-bit, unsigned int ve int ise 32-bit genişliğindedir. Bu yapılandırma, &= ~VM_MERGEABLE ataması sırasında şu hataya yol açar: VM_MERGEABLE, unsigned int tipinde 0x8000'0000 değerine sahip 32-bitlik bir sabittir. ~ operatörü uygulandıktan sonra 0x7fff'ffff unsigned int olur ve ardından & işleminden önce unsigned long tipine yükseltilir. İşaretsiz dönüştürme yapıldığı için bu yükseltme işlemi üst 32 biti öncü 0'larla doldurur (işaretli bir dönüştürmede bile öncü bit 0 olduğu için bu yardımcı olmazdı). Sonuç olarak & işlemi, vm_flags değerini hedeflenen 0xffff'ffff'7fff'ffff yerine 0x0000'0000'7fff'ffff ile AND işlemine tabi tutar ve böylece değerinin üst 32 bitini yanlışlıkla temizler. Sorun, BIT() makrosu kullanılarak `VM_MERGEABLE` sabitinin unsigned long olarak değiştirilmesiyle düzeltilmiştir. Not: Diğer VM_* bayrakları etkilenmemiştir: Bu durum yalnızca VM_MERGEABLE bayrağına özgüdür çünkü diğer VM_* bayraklarının tamamı int tipinde sabitlerdir ve ~ işleminden sonra öncü 1 ile sonuçlanırlar, dolayısıyla öncü 1'lerle unsigned long tipine dönüştürülürler. Not 2: 31defc3b01d9 ("userfaultfd: remove (VM_)BUG_ON()s") commit'inden sonra, bu durum artık bir kernel BUG değil, aynı noktada bir WARNING'dir: [ 45.595973] WARNING: CPU: 1 PID: 2474 at mm/userfaultfd.c:2067 ancak kök neden (bayrak kaybı) aynı kalmaktadır.
Nasıl düzeltilir
- linux linux_kernel5.4.302, 5.10.247, 5.15.197, 6.1.158, 6.6.114, 6.12.55, 6.17.3 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 4.6 ≤ v < 5.4.302, 5.5 ≤ v < 5.10.247, 5.11 ≤ v < 5.15.197, 5.16 ≤ v < 6.1.158, 6.2 ≤ v < 6.6.114, 6.7 ≤ v < 6.12.55, 6.13 ≤ v < 6.17.3 | 5.4.302, 5.10.247, 5.15.197, 6.1.158, 6.6.114, 6.12.55, 6.17.3 |
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.