Skip to content

QEMU vhost-user-gpu memory leaks (CVE-2021-3544)

vhost-user-gpu backend'indeki birkaç host-memory leak, guest'in backing/iov state'ini hiç free etmeyen resource lifecycle'larını sürmesine ve böylece host belleğini tüketmesine izin veriyor.

Mechanism

Sınır neden kırılıyor

vhost-user-gpu.c ve virgl.c boyunca (resource attach/unref/destroy path'leri) backend, resource'ları lifetime'larının sonunda free etmeyi başaramıyor. İhlal edilen invariant: her allocate edilmiş backing / iov, sahibi değiştirilmeden ya da destroy edilmeden önce tam olarak bir kez free edilmeli (NVD: CWE-401 memory leak). Bir backing'i yeniden attach etmek eski iov pointer'ını free etmeden üzerine yazıyor; unref/destroy ise iov'u hiç release edilmemiş resource'ları bırakıyor. Guest bu lifecycle'ların ne sıklıkla çalıştığını kontrol ettiği için leak sınırsız → host DoS.

Walkthrough

Kavramsal, public fix serisinden.

  1. Host vhost-user-gpu ile çalışıyor.
  2. Guest resource lifecycle'larını tekrar tekrar sürüyor, örn. create_2d -> attach_backing -> unref, ya da zaten backing'li bir resource üzerine attach_backing.
  3. Her döngü önceki iov/backing'i leak ediyor; sürekli aktivite host belleğini tüketiyor.

Detection

  • Host tarafı: vhost-user-gpu helper'ının guest GPU aktivitesiyle korele şekilde sürekli büyüyen RSS'i; OOM-killer event'leri.
  • Davranışsal: Bir guest'ten gelen yüksek hızlı resource attach/unref churn'ü anormaldir.

Mitigation

  • Patch: Upstream fix serisini uygulayın (commit'ler 86dd8fac, b9f79858, b7afebcf, f6091d86, 63736af5). Temsili olarak b9f79858, res->iov zaten set edilmişse bir attach'ı reddediyor; diğerleri eksik free'leri ekliyor. QEMU 6.0 sonrası düzeltildi.
  • Configuration workaround: Untrusted guest'ler için vhost-user-gpu üzerinde virgl/3D acceleration'ı kapatın; VM başına memory limit/cgroup uygulayın.

References