Skip to content

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

  1. L1, kendi memory'sinde vmcs12'yi kurar ve VMPTRLD/VMWRITE (trapped ya da shadowed) ardından VMLAUNCH yayar.
  2. L0 VMLAUNCH'ı intercept eder, vmcs12'yi okur ve vmcs02'yi inşa eder:
  3. HOST_RIP/HOST_RSP/HOST_CR3 ← L0'ın kendisi (böylece exit'ler L0'a gider), L1'in değil.
  4. Guest state ve çoğu execution control ← vmcs12 (doğrulamadan sonra).
  5. EPT: L0 bir shadow/merged EPT inşa eder (bkz. nested EPT).
  6. L0, vmcs02'yi kullanarak L2'ye VMRESUME yapar.
  7. 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).

References