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:
- Information disclosure — process'in
.textbase'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. - 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:
- 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
ObjectPropertychunk'ları) QEMU.textbase'ini açığa çıkarır; tekrar eden bir değer, guest RAM'in nereye map'lendiğini gösterir. - 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).
- Pivot: sızdırılan
.textbase'ini kullanarak, ele geçirilen pointer'ı bir host process spawn etmek içinexecvç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¶
- Mehdi Talbi & Paul Fariello, "VM escape — QEMU Case Study", Phrack 70:5 — https://phrack.org/issues/70/5