VirtualBox E1000 out-of-bounds read info disclosure (CVE-2021-2321)¶
VirtualBox'ın E1000 TX yolundaki bir integer underflow, bir out-of-bounds (BSS) read verir ve host hypervisor belleğini guest'e sızdırır.
Mechanism¶
Bug sınıfı / invariant
VirtualBox, E1000 NIC'ini emüle eder. İlgili write bug'ında olduğu gibi, TX length
matematiği bir maksimumdan guest-etkili biriken bir length'i çıkarır:
u16MaxPktLen - u16TxPktLen. Buradaki invariant, u16TxPktLen'in reset/bounded edilmesi ve
çıkarmanın asla underflow etmemesidir.
CVE-2021-2321, read varyantıdır: özel hazırlanmış bir TX-descriptor dizilimi, kodun sıfır
varsaydığı yerde u16TxPktLen'i sıfırdan farklı bırakır, böylece çıkarma büyük bir length'e
underflow eder. Device sonra packet buffer'ın ötesini okur — host hypervisor belleğinin bir "BSS
out-of-bounds read"'i, bir
information-leak / memory-disclosure
primitive'i.
Kavramsal kök neden, write bug'ıyla aynı integer-underflow-from-guest-state pattern'idir, ama tüketilen length bir read'i sürer, dolayısıyla etki yalnızca confidentiality'dir.
Walkthrough¶
Yalnızca kavramsal
STAR Labs advisory'si ve NVD'den alınmış üst düzey bir model. Exploit, offset veya gadget sağlanmamıştır.
- Descriptor state'i hazırla (privileged bir guest olarak) öyle ki length çıkarması çalışırken
u16TxPktLensıfırdan farklı olsun. - Length'i underflow et.
u16MaxPktLen - u16TxPktLenbüyük bir değere wrap olur. - Out-of-bounds oku. Device, packet buffer'ın ötesinden host BSS/hypervisor belleğini okur.
- Guest'e sızdır (CVSS C:H, scope changed — yalnızca confidentiality).
Detection¶
Host / telemetri sinyalleri
- Bir guest'ten hatalı biçimlendirilmiş E1000 TX descriptor chain'leri.
- Envanter: 6.1.20'den eski VirtualBox üzerindeki host'ları işaretle.
- EDR: VMM'de anormal read pattern'leri (salt read'leri doğrudan gözlemlemek zordur).
Mitigation¶
Patch & sıkılaştırma
- Oracle patch'ini uygula. VirtualBox 6.1.20'de düzeltildi (Oracle Critical Patch Update, Nisan 2021).
- VirtualBox'ı güncel tut Oracle Critical Patch Update'leri üzerinden.
- Emüle E1000 yerine paravirtualized NIC'leri tercih et; yalnızca güvenilir guest'leri çalıştır.