Skip to content

QEMU guest-to-host escape chain (RTL8139 leak + PCNET write)

İzole QEMU device-emulation bug'larını host code execution'a çeviren kanonik iki aşamalı pattern: bir info-leak ASLR'ı yener, ardından bir write primitive QEMU process'inin kontrolünü ele geçirir.

Slug isimlendirmesi

Bu dosyanın slug'ı tarihsel olarak slirp içerse de içerik slirp / user-mode networking (tcp_emu, NAT) ile ilgili değildir. Anlatılan zincir iki NIC device-emulation bug'ına dayanır: RTL8139 C+ over-read (leak) + PCNET heap overflow (write). QEMU slirp-specific bug'ları için ayrı qemu-slirp-tcp-emu-heap-buffer-overflow notuna bakın.

Mechanism

Note

Tek bir device-emulation bug'ı nadiren bir host shell'i verir. QEMU bir host user-space process'i olarak çalışır; kaçmak, saldırganın kodunu o process içinde çalıştırmak demektir. Bir savunmacının güvendiği invariant defense-in-depth: bir memory bug'ı bile QEMU process'indeki ASLR ve W^X sayesinde weaponize edilmesi zor olmalıdır. Bir escape chain, iki primitive'i birleştirerek bunu söker:

  1. Information disclosure — process'in .text base'ini (ve guest physical memory'nin QEMU'nun VA'sında nereye map'lendiğini) kurtarmak için QEMU heap'inden byte'lar sızdırılır. Bu, ASLR'ı etkisiz hâle getirir.
  2. Controlled write / control-flow hijack — ayrı bir corruption (bir function-pointer taşıyan object üzerinde heap overflow) execution'ı yeniden yönlendirir, artık sızdırılan adreslerle tam isabetli olarak hedeflenir.

İkisiyle birlikte saldırgan, host process'inde örn. execv("/bin/sh") çağıran bir ROP chain'e pivot eder. Aşılan sınır guest→host'tur: guest'in sağladığı device I/O, host-side code execution olarak son bulur.

Walkthrough

Warning

Public Phrack 70 case study'sinden kavramsal zincirleme pattern'i; her iki CVE de eski ve patch'li. Burada hiçbir host offset'i veya weaponize edilmiş layout verilmemiştir.

Phrack 70 "VM escape — QEMU Case Study", gerçek ve patch'li iki CVE'yi birleştirir:

  1. Leak (ASLR defeat): ~64 KB initialize edilmemiş QEMU heap'ini guest'e dökmek için RTL8139 C+ over-read'i tetikle (CVE-2015-5165, bkz. qemu-rtl8139-network-device-emulation-overflow). Dökümdeki tanınabilir host object'leri (function-pointer taşıyan ObjectProperty chunk'ları) QEMU .text base'ini açığa çıkarır; tekrar eden bir değer, guest RAM'in nereye map'lendiğini gösterir.
  2. Write (control hijack): bir device buffer'ını overflow edip komşu bir object'in function pointer'ını bozmak için PCNET heap overflow'unu tetikle (CVE-2015-7504, bkz. qemu-pcnet-network-device-emulation-overflow).
  3. Pivot: sızdırılan .text base'ini kullanarak, ele geçirilen pointer'ı bir host process spawn etmek için execv çağıran bir stack pivot / ROP chain'e (artık bilinen QEMU image'inden çözülen gadget'lar) yönlendir.
guest device I/O ──► (1) RTL8139 over-read  ─► leak QEMU .text base + guest-RAM map
                  └─► (2) PCNET overflow     ─► overwrite fn-ptr with leaked gadget
                                              ─► (3) ROP -> execv("/bin/sh") on host

Vulnerable bir host'ta beklenen sonuç: QEMU process'inde code execution (QEMU'nun ayrıcalıklarına sahip bir host shell). Patch'li bir host'ta aşamalardan biri fail closed olur.

Detection

  • Host: ASAN/instrumented QEMU, bileşen over-read/over-write'ı işaretler; bir QEMU process'inin bir shell veya beklenmeyen bir child spawn etmesi güçlü bir escape sinyalidir (qemu-system-* parent'lı execve üzerinde audit/eBPF).
  • Bir guest'in karanlık legacy device offload path'lerini ardı ardına çalıştırması (önce leak sonra overflow) davranışsal olarak anormaldir.

Mitigation

  • Altta yatan device CVE'lerini patch'le; emüle legacy NIC'ler yerine virtio/vhost'u tercih et.
  • Emülatörü sandbox'la: seccomp (-sandbox on), sVirt/SELinux, adanmış unprivileged bir user ve namespace'ler, böylece host code-exec bile contained olur.
  • Memory-safe device backend'leri (örn. Rust'ta rust-vmm/virtio) tüm bug sınıflarını ortadan kaldırır.

References