VirtualBox HGCM Pwn2Own 2023 guest-to-host escape¶
Pwn2Own Vancouver 2023 VirtualBox escape'i (CVE-2023-21987 + CVE-2023-21991): emüle VGA'da bir OOB read ve emüle TPM'de bir OOB write, host adreslerini sızdırmak ve control flow'u ele geçirmek için HGCM-object heap grooming'iyle birleştirilir.
Mechanism¶
Note
HGCM (Host-Guest Communication Manager), guest'in I/O port'ları üzerinden HGCMMsgCall
mesajları postalayarak host servislerini (shared clipboard/folder, drag-and-drop, vb.)
çağırmasına izin verir. Isolation invariant'ı, her emüle device'in MMIO handler'larının
guest-controlled offset'leri kendi backing buffer'larıyla sınırlamasıdır. Bu chain, invariant'ı
iki device'de kırar ve HGCM'i yalnızca heap grooming için kullanır: HGCMMsgCall objeleri
host heap'ine spray edilir ve bunların m_pNext/m_pPrev doubly-linked-list pointer'ları ile
vtable'ı, bir out-of-bounds read onları görebildiğinde heap ve image adreslerini sızdırır. İki
device bug'ı read ve write'ı sağlar; birlikte guest→host sınırını aşan host code execution
verirler.
Walkthrough¶
Public referans: Qrious Secure "Analysis of VirtualBox CVE-2023-21987 and CVE-2023-21991" (etkinlikte VirtualBox 7.0.6). Kavramsal, zaten-patch'lenmiş chain:
- OOB read — CVE-2023-21991 (VGA):
DevVGA.cppvga_mem_readb()'de bir bounds checkaddr'ı validate eder ama bir 32-bit framebuffer array'ini index'ler (((uint32_t*)pbVgaFrameBufferR3)[addr]) ve backing buffer'ın çok ötesini (~1.5 MB ötesine) okur, bir host heap read primitive'i sağlar. - OOB write — CVE-2023-21987 (TPM):
DevTpm.cpp'de (tpmMmioRead/tpmMmioFifoRead) küçük bir stack slot'una yapılan birmemcpy(pu64, &abCmdResp[offCmdResp], cb),cb'yi destination size'a karşı validate etmez, stack'i taşırır ve bir return address'in üzerine yazar. - Heap grooming + leak'ler: 64+
HGCMMsgCallobjesi spray et; bunları vtable pattern'iyle bulmak için OOB read'i kullan, offset'leri hesaplamak içinm_pNext/m_pPrev'i korele et, heap_HEAP->Encodingkey'ini geri al ve objeleri güvenilir biçimde yerleştirmek için_HEAP_ENTRYsize'larını dolaş. - Code execution: sızdırılmış host adresleriyle bir ROP chain kur ve kaydedilmiş return address'in üzerine yazıp host kodu çalıştırmak için TPM stack overflow'u tetikle.
Warning
Bug sınıfı için dokümante edilmiş, public ve patch'lenmiş bir chain. Kesin spray sayıları, offset'ler ve ROP chain atlanmıştır; bu kavramsal yoldur.
Detection¶
- Host tarafı: TPM/VGA MMIO ve HGCM servis çağrısı patlamalarıyla korele VM-process crash'leri; ASAN
build'leri
vga_mem_readb'deki OOB read'i ve TPM FIFO read yolundaki OOB write'ı işaretler. - Davranışsal: büyük sayıda
HGCMMsgCallallocation'ı ile range dışı VGA/TPM MMIO offset'leri, normal guest kullanımı için anormaldir.
Mitigation¶
- CVE-2023-21987 ve CVE-2023-21991 için Oracle'ın Nisan 2023 CPU fix'lerini uygula (VirtualBox < 6.1.44 / < 7.0.8).
- İhtiyaç duymayan guest'ler için emüle TPM'i ve gelişmiş VGA/SVGA feature'larını devre dışı bırak, böylece device attack surface'i küçülür.
- Defense-in-depth: VM process'ini sandbox'la/deprivilege et ki host-process compromise'ı sınırlansın.
References¶
- Qrious Secure, "Analysis of VirtualBox CVE-2023-21987 and CVE-2023-21991": https://qriousec.github.io/post/vbox-pwn2own-2023/
- NVD — CVE-2023-21991: https://nvd.nist.gov/vuln/detail/CVE-2023-21991
- NVD — CVE-2023-21987: https://nvd.nist.gov/vuln/detail/CVE-2023-21987