VMCS shadowing¶
Bir guest hypervisor'ın (L1), hangi field'ların native erişildiği hangilerinin trap edildiğini seçmek için VMREAD/VMWRITE bitmap'lerini kullanarak, L0'a bir VM-exit olmadan doğrudan non-root mode'da bir shadow VMCS'e karşı VMREAD/VMWRITE çalıştırmasını sağlayan bir Intel VT-x özelliği — büyük bir nested-virtualization hızlanması ve sıkı yapılandırılması gereken bir control surface'ı.
Mechanism¶
Note
Shadowing olmadan, L1'in vmcs12'sine karşı yaptığı her VMREAD/VMWRITE bir VM-exit'e
yol açar ki L0 onu emüle edebilsin — L1 her L2 entry/exit'inde birçok field'a
dokunduğunda pahalıdır. VMCS shadowing ile L0 bir VMCS'i shadow VMCS olarak
işaretler (VMCS link pointer ve "VMCS shadowing" execution control'ü aracılığıyla)
ve L1'in VMREAD/VMWRITE'ının o shadow'u non-root operasyonda doğrudan okuyup
yazmasına izin verir. İki adet 4 KB'lık VMREAD/VMWRITE bitmap'i (physical
address'leri execution control field'larında bulunan), per-field olarak erişimin
native mi (exit yok) yoksa hâlâ L0'a mı trap olduğuna karar verir. Niyet: sık
erişilen ~%5-10'luk field'lar doğrudan shadow'a gider; nadiren dokunulan field'lar
trap olur ki L0 emüle edilmiş state'ini sync tutabilsin. Invariant: L0 shadow VMCS
ile gerçek vmcs02'yi consistent tutmalı ve L1'in native modifikasyonu isolation'ı
bozabilecek herhangi bir field'ı trap etmelidir. Bug class: yanlış programlanmış
bir bitmap (L1'in, L0'ın kontrol ettiğini varsaydığı bir field'ı native yazmasına
izin vermek) veya shadow/real desync, bir nested-VMX correctness ve potansiyel escape
tehlikesidir.
VMCS multiplexing for nesting'i optimize eder; Hyper-V için enlightened VMCS ile aynı ruhta.
Walkthrough¶
Kavramsal L0 kurulumu (Intel SDM ve KVM shadow-VMCS desteğinden):
- Bir shadow VMCS allocate et;
revision_id'sini set et, shadow olarak işaretle (secondary execution control'lerdekiVMCS shadowingbit'i; shadow VMCS header'ının bit 31'i / link pointer wiring'i). vmread_bitmapvevmwrite_bitmap'i allocate et (her biri 4 KB); hot field'lar için bit'leri clear et (native erişime izin ver) ve hâlâ exit etmesi gereken field'lar için bit'leri set et.- Aktif vmcs02'nin
VMREAD_BITMAP/VMWRITE_BITMAPaddress field'larını bunlara yönlendir veVMCS link pointer'ı shadow VMCS'e set et. - Artık L1'in hot field'lardaki VMREAD/VMWRITE'ı exit olmadan shadow'a vurur; cold field'lar senkronize emülasyon için L0'a trap olur.
Beklenen: L0 hâlâ hassas field'lara aracılık ederken VMREAD/VMWRITE kaynaklı exit'lerde büyük azalma.
Warning
Kavramsal; shadow-VMCS programlaması L0 (host) kodudur. Exploit sağlanmamıştır.
Detection¶
- Hypervisor testing: bitmap'lerin, L1'in native write'ı isolation'ı zayıflatabilecek her field'ı trap ettiğini doğrula; shadow/real tutarlılığını denetle.
Mitigation¶
- Bitmap'lerde default-deny: yalnızca güvenli olduğu kanıtlanmış field'lar için native erişime izin ver.
- Shadow VMCS ile vmcs02'yi her nested entry/exit'te senkronize tut.
- Desync bug'larını yakalamak için nested-virtualization fuzzing ile çalıştır.