Skip to content

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.

  1. Host bir vhost-vsock device'ı ile çalışıyor.
  2. Bir transport-reset event'i event virtqueue'sunu pop ediyor ve bir error/invalid-element koşuluna giriyor.
  3. 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ğıran 8d1b247f3748ac4078524130c6d7ae42b6140aaf commit'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.

References