QEMU MSI-X MMIO OOB access (CVE-2020-13754)¶
Bir MSI-X MMIO operation'ında crafted bir address, guest'in
hw/pci/msix.ciçindeki emule edilen MSI-X region'ının dışına ulaşmasına izin veriyor; bir out-of-bounds access ve host tarafında bir denial of service üretiyor.
Mechanism¶
Isolation invariant: bir MMIO dispatch, boyutlandırıldığı region'ın içinde kalmalı
QEMU her device'ın MMIO'sunu, MemoryRegionOps callback'leri ve declare edilmiş bir size ile bir MemoryRegion olarak register eder. Dispatch layer'ının, read/write callback'ini çağırmadan önce herhangi bir guest access'ini region'ın sınırlarına clamp etmesi beklenir. Invariant: bir device callback'ine verilen offset her zaman < region.size'dır.
hw/pci/msix.c içindeki MSI-X table/PBA region'ları için, region size/access width'inin dispatch path'i ile nasıl etkileştiğindeki bir kusur, guest'in bir MSI-X MMIO operation'ında region'ın gerçek backing extent'inin ötesinde bir offset'e resolve olan crafted bir address sunmasına izin verdi. Callback ardından MSI-X table/PBA array'lerini sonlarının ötesinde index'ledi. Emulation host QEMU process'inde çalıştığı için, over-range access hedeflenen structure'ın dışındaki host memory'sini okur/yazar — bir out-of-bounds access (../primitive/out-of-bounds-write.md). Bu, ../hypervisor/qemu-msi-x-memory-region-cache-oob-write.md'deki cache-init bug'ı ile kavramsal olarak yakından ilişkilidir; ancak buradaki root cause, region cache değil, MSI-X region'ı için MMIO dispatch'teki address/bounds handling'dir.
Walkthrough¶
CVE-2020-13754 olarak disclose ve patch edildi (hw/pci/msix.c, 5.0.1'e kadar QEMU; 5.0.1'de ve takip eden regression fix'lerinde düzeltildi). Ren Ding ve Hanqing Zhao (SSLab, Georgia Tech), Alexander Bulekov ve Anatoly Trosinenko tarafından raporlandı. Aşağıdaki path kavramsaldır, public advisory'den alınmıştır.
-
Guest, emule edilmiş bir MSI-X capability'sine sahip bir PCI device'ı kontrol eder; QEMU MSI-X table ve PBA'yı MMIO region'ları olarak expose eder.
-
Guest, address'i öyle craft edilmiş bir MMIO access (read ya da write) gönderir ki, dispatch-layer translation'ından sonra etkin offset MSI-X table/PBA backing'inin gerçek size'ının ötesine düşer.
-
Device callback'i MSI-X array'ini range dışında index'ler. Access, structure'ın dışındaki host memory'sine dokunur; QEMU tipik olarak fault'a girer ve process abort olur (DoS). Advisory etkiyi guest-triggered bir host crash olarak derecelendirir (düşük severity, yalnızca availability).
Tarihsel / patch'lenmiş
Yalnızca yetkili defensive research ve regression testing içindir. Fragment out-of-bounds dispatch şeklini gösterir, weaponize edilmiş bir chain'i değil. Patch'lenmemiş QEMU'ya karşı untrusted guest'ler çalıştırma.
Detection¶
- Crash signature:
hw/pci/msix.ciçindeki MSI-X MMIO read/write callback'leri üzerinden geçen bir backtrace'e sahip bir QEMU SIGSEGV, kanonik fingerprint'tir. - ASAN build'leri: sanitizer QEMU build'leri, MSI-X table/PBA access path'inde köklenen bir
heap-buffer-overflow(READ ya da WRITE) rapor eder — fuzz/regression harness'ları için en temiz sinyal. Bu CVE aslında structured device fuzzing ile yüzeye çıkarıldı. - Telemetry: bir guest'in advertise edilen table/PBA size'ının dışına düşen MSI-X BAR offset'lerine MMIO göndermesi anormaldir ve qtest/MMIO tracing üzerinden gözlemlenebilir.
- Fuzzing: BAR offset'lerini ve access width'lerini tarayan PCI MMIO fuzzer'ları bu class'ı reproduce eder. Bkz. ../hypervisor/hypercall-fuzzing.md.
Mitigation¶
- Patch: ilk bounds fix'inin eklediği regression'ları düzelten follow-up commit'ler dahil, QEMU 5.0.1 veya sonrasına (ya da bir distro backport'una) güncelle.
- Defense in depth: virtio paravirtualized device'ları tercih et ve machine type'taki emulated device setini kısalt; böylece guest'e daha az MSI-X-backed MMIO region'ı expose edilir.
- Confinement: abort olmuş bir device model'i sınırlamak için QEMU'yu sandbox'lanmış olarak (
-sandbox onseccomp, unprivileged uid, SELinux/sVirt) çalıştır. - Build hardening: QEMU'yu distro hardening'i (
_FORTIFY_SOURCE, stack protector, RELRO, PIE/ASLR) ile dağıt. - Operational: guest-triggered bir host QEMU crash'ini bir security event olarak ele al.