Skip to content

QEMU vmxnet3 integer overflow (CVE-2021-20203)

Privileged bir guest, device activation sırasında vmxnet3 NIC'i geçersiz ring boyutları ya da MTU ile programlayabiliyordu; doğrulanmamış değerler QEMU'nun ring/buffer matematiğinde overflow ediyor ve QEMU process'ini çökertiyordu — bir guest-to-host denial of service.

Mechanism

Sınır neden kırılıyor

QEMU, VMware vmxnet3 NIC'ini (hw/net/vmxnet3.c) host process içinde emulate eder. Guest driver device'ı activate ettiğinde, QEMU device configuration'ın descriptor'ını guest belleğinden okur — transmit/receive ring boyutları, completion-ring boyutları ve MTU dahil — ve bu değerleri internal ring'leri ve paket başına buffer'ları boyutlandırmak için kullanır. Açık: o guest-kontrollü field'lar device'ın tanımlı minimum/maximum bound'larına karşı doğrulanmadan kullanıldı. Sonraki size/offset aritmetiğine (element sayısı çarpı element boyutu, MTU-türevli buffer uzunlukları) beslenen aralık dışı bir ring boyutu ya da MTU overflow eder ya da dejenere bir değer üretir, bu da ardından allocation'ları ve indexing'i tutarsız bir state'e sürer. Bu bir integer-overflow / missing-input-validation bug'ıdır (CWE-190): ihlal edilen invariant şudur: host allocation ya da indexing aritmetiğinde kullanılan guest'in sağladığı her geometry değeri kullanımdan önce range-check edilmelidir. Gerçekleşen etki bir QEMU abort / crash'tir (DoS); bounds check olmadan aynı doğrulanmamış geometri, out-of-bounds erişime doğru escalate edebilen türden bir primitive'dir. Altta yatan class, ../primitive/integer-overflow-wraparound.md ve onun escalation path'i ../primitive/integer-overflow-to-buffer-overflow.md ile paylaşılır.

Walkthrough

Public qemu-devel patch postası ve advisory'sinden kavramsal yeniden kurgu; yalnızca mantıksal adımlar.

  1. Privileged bir guest driver, aralık dışı ring boyutları (TX/RX ve completion ring'leri) ve/veya geçersiz bir MTU içeren bir vmxnet3 device configuration yazar, sonra device activation'ı tetikler.
  2. vmxnet3_activate_device içinde, QEMU o değerleri clamp etmeden tüketir. Ring/buffer aritmetiği overflow eder ya da anlamsız bir geometri verir.
  3. Tutarsız geometri QEMU'nun abort etmesine yol açar (assertion / fault) — host QEMU process çöker ve VM'i devirir: denial of service.
Fix tarafından eklenen validation

Patch, MTU bound'unu assert eder ve activation sırasında her ring boyutunu maximum'una clamp eder:

assert(VMXNET3_MIN_MTU <= s->mtu && s->mtu < VMXNET3_MAX_MTU);

if (size > VMXNET3_TX_RING_MAX_SIZE) { size = VMXNET3_TX_RING_MAX_SIZE; }
if (size > VMXNET3_RX_RING_MAX_SIZE) { size = VMXNET3_RX_RING_MAX_SIZE; }
/* ... same clamp for the TX/RX completion rings ... */

"An integer overflow issue was found in the vmxnet3 NIC emulator ... It may occur if a guest was to supply invalid values for rx/tx queue size or other NIC parameters. A privileged guest user may use this flaw to crash the QEMU process on the host." — NVD CVE-2021-20203

Detection

  • NIC bring-up'ta QEMU crash'i: Bir guest'in vmxnet3 interface'ini activate etmesiyle aynı zamana denk gelen bir QEMU abort/SIGABRT ya da assertion failure birincil sinyaldir; core dump'lar vmxnet3_activate_device/ring setup'a işaret eder.
  • Sanitizer build'leri: UBSan, bir debug QEMU'da overflow eden çarpmayı işaretler; ASan'a ulaşılırsa downstream OOB'yi işaretleyebilir.
  • Telemetri: Belgelenmiş vmxnet3 limitlerinin dışındaki guest-programlanmış ring boyutları ya da MTU anormaldir ve device-model tracing ile loglanabilir.

Mitigation

  • Patch: v5.2.0 sonrası merge edilen ve vendor errata'da (örn. Debian DLA-2623-1) gönderilen, MTU bound'unu assert eden ve ring boyutlarını clamp eden upstream fix'i ("net: vmxnet3: validate configuration values during activate") uygulayın.
  • Attack surface'i azaltın: Buna ihtiyaç duymayan untrusted guest'ler için vmxnet3 compatibility model'i yerine paravirtual virtio-net'i tercih edin.
  • Resource/crash containment: QEMU'yu -sandbox on ve svirt altında çalıştırın; bir crash'in sorunlu guest'e sınırlanması için VM başına cgroup'lar ve supervisor restart policy'leri kullanın.
  • Hardening: Device activation path'lerindeki geometry-overflow matematiğini yakalamak için QEMU'yu CI'da UBSan ile build edin.

References