CVE-2024-49878
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: resource: region_intersects() ve add_memory_driver_managed() arasındaki sorun düzeltildi CXL belleğe sahip bir sistemde, CXL bellek ile ilgili kaynak ağacı (/proc/iomem) şu şekilde görünebilir: 490000000-50fffffff : CXL Window 0 490000000-50fffffff : region0 490000000-50fffffff : dax0.0 490000000-50fffffff : System RAM (kmem) drivers/dax/kmem.c, CXL belleği çevrimiçi hale getirirken add_memory_driver_managed() fonksiyonunu çağırdığından, "System RAM (kmem)", "CXL Window X"in bir alt öğesi haline gelir. Bu durum, tüm "System RAM" kaynaklarının iomem_resource'un en üst seviyesinde olmasını bekleyen region_intersects() fonksiyonunun yanılmasına neden olur ve hatalara yol açabilir. Örneğin, /dev/mem üzerinden CXL bellek aralığında bazı bellek yazmak için aşağıdaki komut satırı çalıştırıldığında, $ dd if=data of=/dev/mem bs=$((1 << 10)) seek=$((0x490000000 >> 10)) count=1 dd: error writing '/dev/mem': Bad address 1+0 records in 0+0 records out 0 bytes copied, 0.0283507 s, 0.0 kB/s komut beklendiği gibi başarısız olur; ancak hata kodu yanlıştır. "Bad address" yerine "Operation not permitted" olması gerekir. Daha ciddi olanı ise, devmem_is_allowed() içerisindeki /dev/mem izin kontrolünün yanlışlıkla geçmesidir. Erişim daha sonra ioremap()'in sistem RAM'ini eşlemesine izin verilmediği için engellense de bu potansiyel bir güvenlik sorunudur. Komut yürütülürken, sistem RAM'i üzerinde ioremap() çağrıldığı için çekirdek günlüğünde aşağıdaki uyarı rapor edilir: ioremap on RAM at 0x0000000490000000 - 0x0000000490000fff WARNING: CPU: 2 PID: 416 at arch/x86/mm/ioremap.c:216 __ioremap_caller.constprop.0+0x131/0x35d Call Trace: memremap+0xcb/0x184 xlate_dev_mem_ptr+0x25/0x2f write_mem+0x94/0xfb vfs_write+0x128/0x26d ksys_write+0xac/0xfe do_syscall_64+0x9a/0xfd entry_SYSCALL_64_after_hwframe+0x4b/0x53 Komut yürütme sürecinin detayları şöyledir: Yukarıdaki kaynak ağacında "System RAM", üst seviye bir kaynak olmak yerine "CXL Window 0"ın bir alt öğesidir. Dolayısıyla region_intersects(), yalnızca üst seviye kaynakları kontrol ettiği için CXL bellek bölgesinde Sistem RAM kaynağı olmadığını yanlış bir şekilde bildirir. Sonuç olarak devmem_is_allowed(), CXL bellek bölgesi için yanlışlıkla 1 ( /dev/mem üzerinden erişime izin ver) değerini döndürür. Neyse ki ioremap() Sistem RAM'inin eşlenmesine izin vermez ve erişimi reddeder. Bu nedenle region_intersects(), yukarıdaki gibi "System RAM"in üst seviyede olmadığı kaynak ağaçlarıyla doğru çalışacak şekilde düzeltilmelidir. Bunu düzeltmek için, üst seviyede eşleşmeyen bir kaynak bulduğumuzda, onun alt kaynaklarında eşleşen kaynakları aramaya devam edeceğiz. Böylece artık kaynak ağacındaki hiçbir eşleşen kaynağı kaçırmayacağız. Yeni uygulamada, örnek bir kaynak ağacı: |------------- "CXL Window 0" ------------| |-- "System RAM" --| region_intersects(, IORESOURCE_SYSTEM_RAM, ) için aşağıdaki sahte kaynak ağacıyla benzer şekilde davranacaktır: |-- "System RAM" --||-- "CXL Window 0a" --| Burada "CXL Window 0a", orijinal "CXL Window 0"ın "System RAM" tarafından kapsanmayan kısmıdır.
Nasıl düzeltilir
- linux linux_kernel5.10.227, 5.15.168, 6.1.113, 6.6.55, 6.10.14, 6.11.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 | 5.1 ≤ v < 5.10.227, 5.11 ≤ v < 5.15.168, 5.16 ≤ v < 6.1.113, 6.2 ≤ v < 6.6.55, 6.7 ≤ v < 6.10.14, 6.11 ≤ v < 6.11.3 | 5.10.227, 5.15.168, 6.1.113, 6.6.55, 6.10.14, 6.11.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.