Skip to content

VMCS (Virtual Machine Control Structure) manipulation

Bir vCPU'nun guest-state, host-state ve control area'larını yapılandırmak ya da kurcalamak için VMREAD/VMWRITE üzerinden Intel VT-x VMCS field'larını okumak ve yazmak — bir VMM'nin (veya VMX-root code execution'a sahip bir saldırganın) guest/host isolation sınırını tanımlamak ve potansiyel olarak zayıflatmak için kullandığı temel primitive.

Mechanism

Note

VMCS, tüm virtualization context'ini tutan per-vCPU, 4 KB'lık, processor-managed bir structure'dır: guest-state area (VM-entry'de yüklenir, VM-exit'te kaydedilir), host-state area (VM-exit'te yüklenir), VM-execution control field'ları (neyin exit'lere yol açtığı — exception bitmap, CR shadow'ları, MSR/IO bitmap'leri, EPT pointer) ve VM-entry/VM-exit control field'ları. Software ona asla doğrudan mov yapmaz; bir VMCS'i current yapmak için VMPTRLD'yi ve field'lara erişmek için architectural field encoding'leriyle (Intel SDM Vol. 3, field-encoding appendix'i) VMREAD/VMWRITE'ı kullanır. Isolation invariant'ı şudur: VMCS'i yalnızca güvenilir VMX-root kodu düzenler ve yazdığı değerler guest'i confined tutar (exit'te doğru host RIP/CR3/stack, hassas işlemler için exit'ler enabled). Bug class: bir saldırgan VMX-root yürütmesine ulaşırsa (örn. bir hypervisor memory-corruption bug'ı aracılığıyla) kötü niyetli bir host-state RIP/CR3 VMWRITE edebilir veya exit control'lerini devre dışı bırakabilir — bir host bug'ını isolation sınırının tam kontrolüne çevirir. Bir guest hypervisor'ın VMWRITE'larının gerçek field'lara ulaşmasına izin veren nested-virtualization emülasyonu, bir seviye yukarıda aynı risktir.

VMCS shadowing ve VMCS multiplexing for nesting'in temelidir; AMD benzeri VMCB manipulation'dır.

Walkthrough

Örnekleyici VMX-root field erişimi (kavramsal, Intel SDM ve felixcloutier instruction page'lerinden):

; make a VMCS current, then read/write fields by encoding
vmptrld [vmcs_phys]          ; load current VMCS
mov     rax, 0x6C16          ; HOST_RIP encoding
vmread  rbx, rax             ; rbx <- host RIP that runs after VM-exit
mov     rdx, vmexit_handler  ; (a VMM legitimately sets this here)
vmwrite rax, rdx             ; HOST_RIP <- handler

Beklenen: bir sonraki VM-exit'te CPU, HOST_RIP/HOST_RSP/HOST_CR3'ü host-state area'sından yükler. Bir VMM bunları kendi güvenilir dispatch'ine set eder; yanlış bir değer yazmak post-exit host yürütmesini yönlendirir.

Warning

VMCS'i düzenlemek VMX-root (ring-0 host / VMM) ayrıcalığı gerektirir. Bu kayıt kavramsaldır; VMX-root'a ulaşacak bir hypervisor exploit chain sağlamaz.

Detection

  • Hypervisor self-integrity: set kalması gereken control'leri (exit bitmap'leri, EPT pointer, MSR/IO bitmap'leri) ve host-state area'sını her VM-entry'de hash'le/denetle.
  • Nested kurulumlar için, L1'den gelen beklenmedik VMREAD/VMWRITE exit pattern'lerini logla.

Mitigation

  • VMX-root kodunu minimal ve memory-safe tut; VMCS yalnızca onu VMWRITE etmeye izinli kod kadar güvenlidir.
  • Bir nested guest'in doğrudan hangi field'lara dokunabileceğini sınırlamak için hardware özelliklerini (örn. VMCS shadowing bitmap'leri) kullan.
  • Bir nested-VMX implementasyonunun bir guest VMCS12'den kopyaladığı her field'ı, gerçek bir VMCS'e ulaşmadan önce doğrula.

References