CVE-2024-26976

Yüksek

Açıklama

Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: KVM: vCPU yok edilirken her zaman async #PF workqueue temizlensin Bir vCPU tamamlanma kuyruğunu temizlerken (örneğin bir VM ve tüm vCPU'ları yok edilirken) vCPU başına düşen async #PF workqueue her zaman temizlenmelidir. KVM, KVM modülüne olan son referans kaldırıldığında hiçbir workqueue geri çağırmasının çalışmadığından emin olmalıdır. İlişkili VM'ye bir referans verilmesi, workqueue geri çağırmasının serbest bırakılmış vCPU/VM belleğine erişmesini önler ancak KVM modülünün geri çağırma tamamlanmadan önce kaldırılmasını engellemez. Hatalı VM refcount verme işlemi kaldırılmıştır; çünkü eğer kvm_put_kvm() fonksiyonu async #PF workqueue'sunu temizliyorsa, async_pf_execute() içerisinden kvm_put_kvm() çağrılması ölü kilide (deadlock) yol açacaktır. async_pf_execute(), kvm_put_kvm() bitene kadar dönemez ve kvm_put_kvm() ise async_pf_execute() bitene kadar dönemez: WARNING: CPU: 8 PID: 251 at virt/kvm/kvm_main.c:1435 kvm_put_kvm+0x2d/0x320 [kvm] Modules linked in: vhost_net vhost vhost_iotlb tap kvm_intel kvm irqbypass CPU: 8 PID: 251 Comm: kworker/8:1 Tainted: G W 6.6.0-rc1-e7af8d17224a-x86/gmem-vm #119 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 Workqueue: events async_pf_execute [kvm] RIP: 0010:kvm_put_kvm+0x2d/0x320 [kvm] Call Trace: <TASK> async_pf_execute+0x198/0x260 [kvm] process_one_work+0x145/0x2d0 worker_thread+0x27e/0x3a0 kthread+0xba/0xe0 ret_from_fork+0x2d/0x50 ret_from_fork_asm+0x11/0x20 </TASK> ---[ end trace 0000000000000000 ]--- INFO: task kworker/8:1:251 blocked for more than 120 seconds. Tainted: G W 6.6.0-rc1-e7af8d17224a-x86/gmem-vm #119 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:kworker/8:1 state:D stack:0 pid:251 ppid:2 flags:0x00004000 Workqueue: events async_pf_execute [kvm] Call Trace: <TASK> __schedule+0x33f/0xa40 schedule+0x53/0x0c0 schedule_timeout+0x12a/0x140 __wait_for_common+0x8d/0x1d0 __flush_work.isra.0+0x19f/0x2c0 kvm_clear_async_pf_completion_queue+0x129/0x190 [kvm] kvm_arch_destroy_vm+0x78/0x1b0 [kvm] kvm_put_kvm+0x1c1/0x320 [kvm] async_pf_execute+0x198/0x260 [kvm] process_one_work+0x145/0x2d0 worker_thread+0x27e/0x3a0 kthread+0xba/0xe0 ret_from_fork+0x2d/0x50 ret_from_fork_asm+0x11/0x20 </TASK> Eğer kvm_clear_async_pf_completion_queue() gerçekten workqueue'yu temizliyorsa, async_pf_execute()'a referans vermeye gerek yoktur çünkü tüm async_pf_execute() çağrıları, vCPU ve ilgili VM yok edilmeden/serbest bırakılmadan önce tamamlanmaya zorlanacaktır. Bu durum aynı zamanda modül kaldırma hatasını da düzeltir; zira __fput(), vCPU serbest bırakılana kadar son vCPU referansı üzerinde module_put() işlemini yapmayacaktır (örneğin vCPU dosyasının kapatılması KVM modülüne olan son referansı kaldırıyorsa). kvm_check_async_pf_completion() fonksiyonunun da iş öğesini tamamlanma kuyruğundan çıkarabileceği ve bu nedenle work queue'yu temizlemesi gerektiği unutulmamalıdır, aksi takdirde işlem kvm_clear_async_pf_completion_queue() tarafından görülmeyecektir. Workqueue'nun beklenmesi teorik olarak bir vCPU'yu geciktirebilir, ancak bu olasılık çok düşüktür ve muhtemelen gecikme çok az olacaktır. kvm_arch_async_page_present_queued() koşulsuz olarak yeni bir istek oluşturur, yani konuğa girişi etkili bir şekilde geciktirir; dolayısıyla kalan işlemler şunlardır: trace_kvm_async_pf_completed(addr, cr2_or_gpa); __kvm_vcpu_wake_up(vcpu); mmput(mm); ve vCPU hala hayattaysa mmput() sayfa tablolarına olan son referansı kaldıramaz, yani vCPU sayfa tablolarını yıkarken takılı kalmaz. Özellikle "hepsini uyandır" (wakeup all) iş öğeleriyle başa çıkmak için temizleme işlemini gerçekleştiren bir yardımcı fonksiyon eklenmiştir; çünkü bunlar gerçek iş öğeleri değildir ve asla bir workqueue'ya yerleştirilmezler. Geçersiz bir workqueue girişini temizlemeye çalışmak haklı olarak __flush_work() fonksiyonunun hata vermesine neden olur. 5f6de5cbebee ("KVM: Prevent module exit until al") numaralı commit'in şu noktaya dikkat çektiği unutulmamalıdır...

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın1 May 2024
İlk görülme1 May 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel4.19.312, 5.4.274, 5.10.215, 5.15.154, 6.1.84, 6.6.24, 6.7.12, 6.8.3 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel2.6.38 ≤ v < 4.19.312, 4.20 ≤ v < 5.4.274, 5.5 ≤ v < 5.10.215, 5.11 ≤ v < 5.15.154, 5.16 ≤ v < 6.1.84, 6.2 ≤ v < 6.6.24, 6.7 ≤ v < 6.7.12, 6.8 ≤ v < 6.8.34.19.312, 5.4.274, 5.10.215, 5.15.154, 6.1.84, 6.6.24, 6.7.12, 6.8.3
debian debian_linux10.0—

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