QEMU savevm/loadvm VMState buffer overflow¶
QEMU snapshot restore / incoming migration sırasında device state'i deserialize ederken yetersiz bounds validation'ı, VMState load path'inde bir host heap buffer'ını overflow edebilir.
Mechanism¶
Note
QEMU, savevm/loadvm snapshot'ları ve live migration (migrate -incoming)
için her emule edilmiş device'ın state'ini VMState framework'ü aracılığıyla
serialize eder. Restore'da, vmstate_load_state() her device'ın field
descriptor'larını walk eder ve serialize edilmiş stream'i in-memory
structure'lara kopyalar. Isolation invariant'ı: bir device'ın load handler'ı,
gelen stream'i untrusted olarak ele almalı ve onu bir copy'yi
boyutlandırmak ya da bir array'i index'lemek için kullanmadan önce her
length/count/index'i validate etmeli. Bir handler stream'den
attacker-influenceable bir length field'ına güvendiğinde — destination
buffer'dan büyük bir count ya da size kabul ederek — copy bir host-process heap
allocation'ını overflow eder. Aşılan trust boundary snapshot/migration kaynağı
→ host QEMU process'i'dir: kötü niyetli ya da tahrif edilmiş bir snapshot (ya
da hostile bir migration peer'ı), QEMU içinde bir memory-corruption primitive'i
elde eder.
Walkthrough¶
Warning
Bir bug class'ı / design-flaw pattern'i olarak belgelendi, somut bir CVE
olarak değil. Bu kayıt kavramsaldır — bu tam başlık için primary bir kaynaktan
tek bir kanonik CVE doğrulayamadım, dolayısıyla unverified olarak işaretlendi
ve spesifik offset vermiyor.
Unverified: no public CVE or PoC available — bu, somut bir saldırı değil,
VMState load handler'larında audit edilecek bir design-flaw pattern'idir.
Bir PoC değil, audit edilecek bir pattern olarak ele al.
- Bir attacker crafted bir state image sağlar: ya
loadvmile restore edilen tahrif edilmiş birsavevmsnapshot file'ı, ya da bir migration'ın receiving tarafındaki hostile bir peer. - Crafted VMState stream'i, bir device field'ının length/element-count'unu
device'ın
*_load/gethandler'ının allocate ettiği ya da beklediği destination buffer'dan büyük set eder. vmstate_load_state()her field descriptor'ının.gethandler'ını çağırır ve bu handler stream verisini kopyalar. Handler length'i validate etmediğinde kopya, undersized host buffer'ına o kadar byte/element yazar → QEMU process'inde heap overflow.
malicious snapshot / migration stream
└─► vmstate_load_state() -> device .get handler
trusts stream-provided length ──► oversized memcpy into host heap buffer
Vulnerable bir build'de beklenen gözlem: loadvm ya da migrate -incoming
sırasında heap corruption / crash; hardened bir build'de load handler out-of-range
field'ı reddeder.
Detection¶
- Host: ASAN/instrumented QEMU,
loadvm/incoming migration sırasında OOB write'ı flag'ler; belirli bir snapshot'ı load etmek ya da bir migration'ı kabul etmek ile korele crash'ler. - Operasyonel olarak: trust boundary'nin dışından gelen snapshot'lar/migration'lar risk surface'idir — provenance'larını bir sinyal olarak ele al.
Mitigation¶
- Yalnızca trusted kaynaklardan
loadvm/migrate yap; attacker tarafından sağlanan image'leri asla restore etme. - QEMU'yu patch'li tut; device
*_loadhandler'ları stream'den türetilen tüm length/count'ları bounds-check etmeli (VMState için upstream hardening pattern'i). - Migration channel'larını authenticate/encrypt et (TLS); böylece bir peer crafted state inject edemez.
- QEMU'yu sandbox'la (seccomp, sVirt); böylece bir load-path overflow'u sınırlanır.
References¶
- QEMU migration / VMState documentation — https://www.qemu.org/docs/master/devel/migration/index.html
- QEMU migration framework / VMState device-state serialization (upstream devel docs) — https://www.qemu.org/docs/master/devel/migration/main.html