Skip to content

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.

  1. Bir attacker crafted bir state image sağlar: ya loadvm ile restore edilen tahrif edilmiş bir savevm snapshot file'ı, ya da bir migration'ın receiving tarafındaki hostile bir peer.
  2. Crafted VMState stream'i, bir device field'ının length/element-count'unu device'ın *_load/get handler'ının allocate ettiği ya da beklediği destination buffer'dan büyük set eder.
  3. vmstate_load_state() her field descriptor'ının .get handler'ı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 *_load handler'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