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.
- Host
vhost-user-gpuile çalışıyor. - 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.
- Her döngü önceki
iov/backing'i leak ediyor; sürekli aktivite host belleğini tüketiyor.
Detection¶
- Host tarafı:
vhost-user-gpuhelper'ı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 olarakb9f79858,res->iovzaten 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.