QEMU vhost-vsock virtqueue resource leak (CVE-2022-26354)¶
vhost-vsock'taki bir error path, geçersiz bir virtqueue element'ini önce detach etmeden free ediyor; bu da resource leak'e ve device state'inin tutarsız kalmasına yol açıyor.
Mechanism¶
Sınır neden kırılıyor
vhost_vsock_common_send_transport_reset() içinde
(hw/virtio/vhost-vsock-common.c) pop edilmiş bir virtqueue element'i, geri
push edilene ya da açıkça detach edilene kadar "in-flight" kalır. İhlal edilen
invariant: pop edilmiş bir element free edilmeden önce detach edilmeli
(virtqueue_detach_element()). Error/invalid-element path'i bunun yerine
doğrudan g_free(elem) çağırıyordu, dolayısıyla virtqueue'nun in-use counter'ı
ve map'lenmiş descriptor referansları hiç uzlaştırılmadı (NVD: CWE-772 missing
resource release). Tekrar tekrar tetiklemek leak'leri biriktiriyor ve device
state'ini bozuyor.
Walkthrough¶
Kavramsal, public fix'ten.
- Host bir
vhost-vsockdevice'ı ile çalışıyor. - Bir transport-reset event'i event virtqueue'sunu pop ediyor ve bir error/invalid-element koşuluna giriyor.
- Element
virtqueue_detach_element()olmadan free ediliyor ve leak oluyor; biriktirmek için tekrarlayın. Local privileged guest erişimi gerektirir (AV:L/PR:H).
Detection¶
- Host tarafı: vsock aktivitesi sırasında büyüyen QEMU belleği ve virtqueue tutarsızlıkları; descriptor-leak uyarıları.
- Davranışsal: vsock event queue'sunda tekrarlanan transport-reset / invalid-element koşulları anormaldir.
Mitigation¶
- Patch: Free etmeden önce
virtqueue_detach_element(vq, elem, 0)çağıran8d1b247f3748ac4078524130c6d7ae42b6140aafcommit'ini uygulayın. QEMU <= 6.2.0'ı etkiler; 6.2.0 sonrası düzeltildi (örn. RHSA-2022:5821). - Configuration workaround: Gerekli olmadığında
vhost-vsock'u untrusted guest'lere açmaktan kaçının.