VMCS multiplexing for nesting (VMCS01/02/12)¶
Bare-metal hypervisor'ın (L0), guest hypervisor için kullandığı VMCS'i (VMCS01) ile guest hypervisor'ın kendi guest'i için inşa ettiği VMCS'i (VMCS12) L2'yi gerçekten çalıştırmak için kullanılan gerçek bir hardware VMCS'e (VMCS02) merge ettiği nested-VMX tekniği — recursive virtualization'ı çalıştıran temel hile ve yoğun bir trust boundary.
Mechanism¶
Note
x86'nın bir VMCS'i bir VMCS içinde çalıştırmak için hardware desteği yoktur. KVM'in
nested-VMX emülasyonu bunu üç structure ile köprüler (kernel nested-VMX doc'una göre):
vmcs01, L0'ın L1'i çalıştırmak için inşa ettiği VMCS'tir; vmcs12, L1'in L2'yi
çalıştırmak için inşa ettiği VMCS'tir (L1 bunun hardware'de yüklü olduğunu sanır, ama
revision_id/abort dışında software-only ve opak'tır); vmcs02, L0'ın L2'yi
metal üzerinde çalıştırmak için inşa ettiği gerçek VMCS'tir. L1, VMLAUNCH/VMRESUME
çalıştırdığında, L0 onu trap eder ve vmcs01 ile vmcs12'yi vmcs02'ye merge eder
(host field'ları vmcs01'den, böylece exit'ler L0'a döner; guest field'ları ve birçok
control vmcs12'den). Bir L2 VM-exit'inde, L0 sonuçları vmcs12'ye geri sync eder ve
exit'i ya kendisi ele alır ya da L1'e yansıtır. Isolation invariant'ı şudur: L0'ın
guest-authored vmcs12'den kopyaladığı her control sanitize edilmelidir ki L1,
crafted vmcs12 field'ları aracılığıyla L2'yi L0'a escape ettirememeli veya L0'a bir
exit'i yanlış ele aldırtamamalı. Bug class: nested-VMX field-merge bug'ları (yanlış
host-state, yanlış merge edilmiş exit control'leri, MSR-bitmap confusion) tekrar eden
bir guest-hypervisor → host escape/DoS yüzeyidir.
VMCS manipulation'a dayanır; VMCS shadowing ile hızlandırılır; L2-to-L1 escape araştırmasının temelini oluşturur.
Sibling not
Bu not, nesting'in yalnızca VMCS merge alt-mekanizmasına (vmcs01/02/12 ve onun field-merge bug class'ına) odaklanır. Nesting'in bütünsel mimarisi — trap-and-emulate, L0/L1/L2 modeli, memory/nested-EPT, host'ta enable/observe — için bkz. Nested virtualization.
Walkthrough¶
Kavramsal akış (Linux KVM nested-VMX dokümantasyonu ve Turtles projesinden):
- L1, kendi memory'sinde
vmcs12'yi kurar veVMPTRLD/VMWRITE(trapped ya da shadowed) ardındanVMLAUNCHyayar. - L0 VMLAUNCH'ı intercept eder,
vmcs12'yi okur vevmcs02'yi inşa eder: - HOST_RIP/HOST_RSP/HOST_CR3 ← L0'ın kendisi (böylece exit'ler L0'a gider), L1'in değil.
- Guest state ve çoğu execution control ←
vmcs12(doğrulamadan sonra). - EPT: L0 bir shadow/merged EPT inşa eder (bkz. nested EPT).
- L0,
vmcs02'yi kullanarak L2'yeVMRESUMEyapar. - L2 exit'inde, L0 exit reason/qualification'ı
vmcs12'ye geri kopyalar, ardından exit'i ya emüle eder ya da L1'e inject eder.
Beklenen: L1, L2 için standart VMX semantiğini gözlemlerken L0 gerçek kontrolü korur.
Warning
Hypervisor-internal bir mekanizmanın kavramsal açıklaması. Exploit reçetesi yok.
Detection¶
- Hypervisor testing: vmcs02 host-state'inin her zaman L0'a işaret ettiğini ve sanitize edilmemiş hiçbir vmcs12 control'ünün hardware'e ulaşmadığını doğrula.
- Nested-virtualization fuzzing (harness VM'leri) merge mantığını çalıştırır.
Mitigation¶
- Her vmcs12 field'ını untrusted input olarak ele al; vmcs02'ye merge etmeden önce control'leri whitelist'le/clamp'le.
- Host-state field'larını L0'da otoriter tut; onları asla vmcs12'den kaynaklama.
- Nested-VMX entry/exit path'lerini fuzz et (nested-virtualization fuzzing).