Skip to content

QEMU vhost-user-gpu uninit-memory leak (CVE-2021-3545)

vhost-user-gpu backend'i GET_CAPSET_INFO için kısmen initialize edilmiş bir response döndürüyor ve guest'e artık host stack byte'larını sızdırıyor.

Mechanism

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

virgl_cmd_get_capset_info() içinde (contrib/vhost-user-gpu/virgl.c) bir stack response yapısı (resp) guest'e döndürülmeden önce yalnızca kısmen dolduruluyor. İhlal edilen invariant: guest'e gönderilen bir response'un her byte'ı açıkça initialize edilmeli (NVD: CWE-200 / CWE-457 uninitialized read). Padding ve set edilmemiş field'lar bayat host stack byte'larını koruyor, böylece guest artık host belleğini geri okuyor — host ASLR'yi kırmak ya da secret'ları çıkarmak için kullanışlı bir information leak.

Walkthrough

Kavramsal, public fix'ten.

  1. Host vhost-user-gpu ve virgl etkin şekilde çalışıyor.
  2. Guest VIRTIO_GPU_CMD_GET_CAPSET_INFO gönderiyor.
  3. Handler kısmen initialize edilmiş bir resp döndürüyor; guest bayat host stack byte'larını okuyor:
/* fixed shape */
memset(&resp, 0, sizeof(resp));   /* zero before populating */

Detection

  • Host tarafı: Doğrudan gözlemlemesi zor; ASan/MSan (uninitialized-read detection) fuzzing/test sırasında bunu virgl_cmd_get_capset_info içinde işaretler.
  • Davranışsal: GET_CAPSET_INFO trafiği kendi başına normaldir — detection, runtime sinyallerinden çok patch durumuna dayanır.

Mitigation

  • Patch: Doldurmadan önce memset(&resp, 0, sizeof(resp)) ekleyen 121841b2 commit'ini uygulayın; QEMU 6.0 sonrası düzeltildi.
  • Configuration workaround: Untrusted guest'ler için vhost-user-gpu üzerinde virgl/3D acceleration'ı kapatın.

References