Skip to content

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):

  1. Guest içinde, host'ta 3D/virgl etkinken (QEMU virtio-gpu ile virgl=on, gl=on) virtio-gpu DRM device'ını (/dev/dri/...) aç.
  2. 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.
  3. virglrenderer komutu işler ve attacker'ın alanlarını kullanarak bir copy/index gerçekleştirir, bir host heap allocation'ının ötesine yazar.
  4. 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)