Skip to content

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):

  1. Bir shadow VMCS allocate et; revision_id'sini set et, shadow olarak işaretle (secondary execution control'lerdeki VMCS shadowing bit'i; shadow VMCS header'ının bit 31'i / link pointer wiring'i).
  2. vmread_bitmap ve vmwrite_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.
  3. Aktif vmcs02'nin VMREAD_BITMAP/VMWRITE_BITMAP address field'larını bunlara yönlendir ve VMCS link pointer'ı shadow VMCS'e set et.
  4. 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.

References