Skip to content

QEMU MSI-X MMIO OOB access (CVE-2020-13754)

Bir MSI-X MMIO operation'ında crafted bir address, guest'in hw/pci/msix.c iç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.

  1. 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.

  2. 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.

    Conceptual shape (not a working exploit)
    guest MMIO access to MSI-X window @ crafted address
      -> memory dispatch resolves offset >= region backing size
      -> msix table/PBA callback indexes past the array end
           # OOB read or write against host process memory
    
  3. 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.c iç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 on seccomp, 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.

References