CVE-2022-50471
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: xen/gntdev: VMA bölünmesine uyumluluk sağlandı Bu commit öncesinde, gntdev sürücü kodu, paravirtüalize (PV) Xen domainleri ile ilgili şu senaryoyu doğru şekilde yönetmiyordu: * Kullanıcı süreci, iki grant eşlemesinden (yani başka bir Xen domaini tarafından paylaşılan iki sayfadan) oluşan bir gntdev eşlemesi kurar. * Kullanıcı süreci sayfalardan birini munmap() ile kaldırır. * Kullanıcı süreci kalan sayfayı munmap() ile kaldırır. * Kullanıcı süreci sonlanır. Yukarıdaki senaryoda kullanıcı süreci, ilk munmap() işlemi için çekirdeğin dmesg kayıtlarına aşağıdaki mesajları düşmesine neden olur ve ikinci munmap() çağrısı da benzer günlük mesajlarıyla sonuçlanır: BUG: Bad page map in process doublemap.test pte:... pmd:... page:0000000057c97bff refcount:1 mapcount:-1 \ mapping:0000000000000000 index:0x0 pfn:... ... page dumped because: bad pte ... file:gntdev fault:0x0 mmap:gntdev_mmap [xen_gntdev] readpage:0x0 ... Call Trace: <TASK> dump_stack_lvl+0x46/0x5e print_bad_pte.cold+0x66/0xb6 unmap_page_range+0x7e5/0xdc0 unmap_vmas+0x78/0xf0 unmap_region+0xa8/0x110 __do_munmap+0x1ea/0x4e0 __vm_munmap+0x75/0x120 __x64_sys_munmap+0x28/0x40 do_syscall_64+0x38/0x90 entry_SYSCALL_64_after_hwframe+0x61/0xcb ... Her munmap() çağrısı için Xen hypervisor (CONFIG_DEBUG ile derlenmişse), aşağıdakileri yazdıracak ve etkilenen Xen PV domaininde genel bir koruma hatası (general protection fault) tetikleyecektir: (XEN) d0v... Attempt to implicitly unmap d0's grant PTE ... (XEN) d0v... Attempt to implicitly unmap d0's grant PTE ... Şu an itibarıyla, gntdev_grant_map yapısının vma alanı (aşağıda map->vma olarak belirtilmiştir), temel olarak eşlemelerin başlangıç ve bitiş adreslerini kontrol etmek için kullanılır. Ancak, bölünmüş VMA'lar ile bunlar değişebilir ve bir gntdev eşlemesiyle ilişkili birden fazla VMA olabilir. Bu nedenle, map->vma kullanımı kaldırılarak orijinal başlangıç adresi için map->pages_vm_start'a ve orijinal eşleme boyutu için (map->count << PAGE_SHIFT) değerine güvenilmektedir. invalidate() ve find_special_page() kancalarının bunları kullanması sağlanmıştır. Ayrıca, bir gntdev eşlemesiyle ilişkili birden fazla VMA olabileceği göz önüne alındığında, "mmu_interval_notifier_remove(&map->notifier)" çağrısı gntdev_put_map fonksiyonunun sonuna taşınmıştır; böylece MMU bildiricisi yalnızca kalan son VMA kapatıldıktan sonra kaldırılır. Son olarak, map->live_grants atomik sayacı ve/veya map->vma işaretçisini (artık kaldırılmıştır) kullanmak yerine, yanlışlıkla gntdev eşlemesinin yeniden kullanılmasını önlemek için bir atomik değişken kullanılmıştır. Bu durum, kullanıcı alanının daha önce kurulmuş bir gntdev eşlemesiyle aynı adres aralığı üzerine (MAP_FIXED ile) tekrar mmap() yapmasını engeller. Bu senaryo, bu commit öncesinde geçerli olan aşağıdaki çağrı izi (call-trace) ile özetlenebilir: mmap gntdev_mmap mmap (aynı adres aralığı üzerinde MAP_FIXED ile tekrarlanan mmap) gntdev_invalidate unmap_grant_pages ('being_removed' girişlerini true yapar) gnttab_unmap_refs_async unmap_single_vma gntdev_mmap (paylaşılan sayfaları tekrar eşler) munmap gntdev_invalidate unmap_grant_pages ('being_removed' girişleri true olduğu için işlem yapılmaz) unmap_single_vma (PV domainleri için Xen, atanmış bir sayfanın eşlemesinin kaldırıldığını rapor eder ve eğer Xen CONFIG_DEBUG ile derlendiyse etkilenen domainde genel bir koruma hatası tetikler) Bu son senaryonun düzeltilmesi ayrı bir commit olmayı hak edebilirdi ancak tek bir commit tercih edilmiştir; çünkü gntdev_grant_map yapısının vma alanının kaldırılması, gntdev_mmap() girişinin korunmasını gerektirmekte ve live_grants atomik sayacı mevcut bir eşleme üzerinden mmap() işlemini önlemek için tek başına yeterli olmamaktadır.
Nasıl düzeltilir
- linux linux_kernel5.10.152, 5.15.75, 5.19.17, 6.0.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 | 2.6.38 ≤ v < 5.10.152, 5.11 ≤ v < 5.15.75, 5.16 ≤ v < 5.19.17, 6.0 ≤ v < 6.0.3 | 5.10.152, 5.15.75, 5.19.17, 6.0.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.