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
bhyveprocess'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-9p — descriptor-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ı.
- Host, etkilenen bir VirtIO device ile bir guest başlatır, örn. virtio-console:
-
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).
-
Model bu başarısızlığı görmezden gelir ve hiç doldurulmamış bir
iovecdizisini dolaşır; uninitialized base/length alanları üzerinden read/write yaparak →bhyveiç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
bhyvesegfault/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.