3D Red Pill: virtio-gpu / virglrenderer heap overflow guest-to-host escape¶
Bir guest-to-host escape sınıfı (CVE-2019-18389 ve kardeş virglrenderer CVE'leri); burada guest, QEMU'nun paravirtual virtio-gpu 3D device'ını sürer ve host tarafındaki virglrenderer kütüphanesi guest'ten gelen GL/3D komut verisini yanlış işleyerek bir host heap buffer'ını overflow eder.
Mechanism¶
Note
virtio-gpu paravirtualize edilmiş bir GPU'dur: guest'in DRM driver'ı command buffer'larını (2D ve, 3D/virgl etkinse OpenGL tarzı 3D komutlar) virtio ring'lerine submit eder. QEMU bunları dequeue eder ve 3D için komut stream'ini host QEMU process'inde çalışan virglrenderer kütüphanesine teslim eder; bu kütüphane guest "VIRGL" komutlarını host OpenGL'e çevirir. İzolasyon invariant'ı şudur: guest'ten gelen her size, offset, index ve resource handle, host buffer'ları index'lemeden ya da kopyalamadan önce virglrenderer tarafından validate edilmek zorundadır. Bu bug sınıfı, o parse/çeviri aşamasındaki host tarafı bir memory-safety hatasıdır: bir 3D komutundaki guest-controlled length veya element count değerleri (ör. transfer/copy ya da resource descriptor'ları) yeterli bounds checking olmadan bir host heap allocation'ını boyutlandırmak veya index'lemek için kullanılır ve QEMU process'inde bir out-of-bounds write üretir — yani bir guest→host corruption primitive.
Bu, Cloudburst "virtual GPU" escape'ini açık kaynak QEMU/virglrenderer stack'ine genelleştirir ve sonraki virtio-gpu sorunlarıyla aynı şekildedir (bkz. QEMU virtio-gpu integer-overflow leak chain).
Walkthrough¶
Public referans: CVE-2019-18389 (ve ilgili virglrenderer CVE kümesi) ve upstream virglrenderer düzeltmeleri. Kavramsal reproduction yolu (weaponize edilmiş detay yok):
- Guest içinde, host'ta 3D/virgl etkinken (QEMU
virtio-gpuilevirgl=on,gl=on) virtio-gpu DRM device'ını (/dev/dri/...) aç. - 3D resource'lar oluştur ve gömülü size/count/offset alanları, renderer'ın bunlar için kullanacağı host buffer'ının sınırlarını aşan, crafted bir VIRGL command buffer submit et.
- virglrenderer komutu işler ve attacker'ın alanlarını kullanarak bir copy/index gerçekleştirir, bir host heap allocation'ının ötesine yazar.
- QEMU process'inde heap grooming ile overflow, control-flow ya da daha ileri primitive'lere doğru şekillendirilir ve host'a escape edilir.
Beklenen gözlem: anormal 3D komut submit'i sonrası QEMU/virglrenderer heap corruption (ASan abort veya crash); benign bir sistemde geçerli driver'lar asla böyle out-of-range alanlar emit etmez.
Warning
Kavramsal olarak belgelenmiş, tarihsel ve düzeltilmiş bir bug sınıfı. Exploit'e özgü offset'ler, fonksiyon iç detayları veya heap layout verilmemiştir.
Detection¶
- Host tarafı: virglrenderer'da QEMU crash'leri / AddressSanitizer raporları; bir guest'ten ani yüksek hacimli veya malformed virtio-gpu 3D komut trafiği.
- virglrenderer'ı guest-shaped command stream'lerle fuzz'lamak bu sınıfı deployment öncesinde açığa çıkarır.
Mitigation¶
- virglrenderer'ı eksik bounds check'leri ekleyen düzeltilmiş sürüme güncelle; distro QEMU/virglrenderer güvenlik güncellemelerini uygula.
- 3D acceleration gereksizse, virgl/3D'yi kapat (
virgl=off/gl=off) ki renderer attack surface guest'ten erişilebilir olmasın. - QEMU process'ini sandbox'la (seccomp, düşürülmüş ayrıcalıklar, ayrı device process) ki renderer compromise'i tam host kontrolü vermesin.
References¶
- CVE-2019-18389 ve ilgili virglrenderer CVE'leri (NVD/MITRE, Red Hat Bugzilla). (bu ortamda fetch edilmedi)
- Upstream virglrenderer commit geçmişi / advisory'leri. (bu ortamda fetch edilmedi)