Skip to content

bhyve VirtIO device models uninitialized iovec memory corruption (CVE-2021-29631)

Birkaç bhyve VirtIO device model'i, I/O descriptor'larını fetch ederken oluşan bir hatayı görmezden geliyor ve sonrasında uninitialized I/O vector'lar üzerinde çalışıyor — host bhyve process'inde guest tarafından tetiklenebilen bir memory-corruption yolu.

Mechanism

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

Bir VirtIO device, guest ile bir virtqueue paylaşır: guest, zincirlenmiş descriptor'ları guest memory'sine yerleştirir ve host device model bunları dolaşarak sonradan okuyup/yazacağı bir I/O vector dizisi (struct iovec: base pointer + length) inşa eder. Zafiyetli model'ler — virtio-console, virtio-rnd, virtio-scsi, virtio-9pdescriptor-fetch adımının dönüş değerini kontrol etmeyi atladı. Kötü niyetli bir guest, fetch'in başarısız olacağı şekilde bir virtqueue hazırlayabilir; model yine de devam eder ve iovec dizisini sanki doldurulmuş gibi kullanır, oysa dizi aslında uninitialized (bayatlamış stack/heap) pointer'lar ve length'ler tutar. Host bu durumda saldırganın etkilediği çöp veriyi dereference eder — guest, error path'in alınıp alınmayacağını kontrol eder ve bu, host bhyve process'i içinde corruption sürmek için yeterlidir. Çiğnenen invariant: bir device model, başarısız bir descriptor fetch'te abort etmeli, uninitialized state üzerinde asla devam etmemelidir.

Walkthrough

FreeBSD-SA-21:13'ten kavramsal tetikleme yolu; yalnızca açıklayıcı amaçlı.

  1. Host, etkilenen bir VirtIO device ile bir guest başlatır, örn. virtio-console:
bhyve -s 0,hostbridge -s 4,virtio-console,port1=/dev/nmdm0A \
      -s 31,lpc -m 2G -c 2 vm0
  1. Guest driver, descriptor chain'i host model'in descriptor-fetch helper'ının bir error döndürmesine yol açacak şekilde bir virtqueue hazırlar (örn. bozuk ya da fazla uzun bir chain).

  2. Model bu başarısızlığı görmezden gelir ve hiç doldurulmamış bir iovec dizisini dolaşır; uninitialized base/length alanları üzerinden read/write yaparak → bhyve içinde memory corruption, crash veya potansiyel code execution.

Advisory problem açıklaması

"Certain VirtIO-based device models did not handle errors when fetching I/O descriptors. Such errors could be triggered by a malicious guest ... the device model code could be tricked into operating on uninitialized I/O vectors, leading to memory corruption." — FreeBSD-SA-21:13.bhyve

Detection

  • Host-side: Guest VirtIO aktivitesiyle ilişkili bhyve segfault/abort; instrumented build'lerde MSan/ASan, virtqueue descriptor-handling rutinlerinde uninitialized değer ya da wild pointer kullanımını raporlar.
  • Behavioral: Error path'i zorlamak için kasıtlı olarak bozuk/kısa devre ettirilmiş virtqueue descriptor chain'leri gönderen bir guest anormaldir.

Mitigation

  • Patch: FreeBSD-SA-21:13.bhyve uygula (11.4-p13, 12.2-p10, 13.0-p4 için 2021-08-24'te düzeltildi); fix, descriptor-fetch dönüş değerini kontrol eder ve uninitialized iovec'leri kullanmak yerine bail out eder.
  • Defense in depth: bhyve'ın Capsicum sandbox'ı, device-model process'inin corruption sonrası kabiliyetini sınırlar.

References