QEMU vhost-user-gpu uninit-memory leak (CVE-2021-3545)¶
vhost-user-gpu backend'i
GET_CAPSET_INFOiç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.
- Host
vhost-user-gpuve virgl etkin şekilde çalışıyor. - Guest
VIRTIO_GPU_CMD_GET_CAPSET_INFOgönderiyor. - Handler kısmen initialize edilmiş bir
respdöndürüyor; guest bayat host stack byte'larını okuyor:
Detection¶
- Host tarafı: Doğrudan gözlemlemesi zor; ASan/MSan (uninitialized-read
detection) fuzzing/test sırasında bunu
virgl_cmd_get_capset_infoiç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))ekleyen121841b2commit'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.