Enlightened VMCS (eVMCS) for nested Hyper-V¶
Mimari VMREAD/VMWRITE'ı, guest-physical bir memory-mapped "enlightened VMCS" yapısı artı clean-field tracking ile değiştiren bir Hyper-V paravirtual interface'i; böylece Hyper-V (L0) altında çalışan nested (L1) bir hypervisor, L2 guest'lerini per-field VMCS-access VM-exit'leri olmadan yapılandırır.
Mechanism¶
Note
Nested virtualization'da bir L1 hypervisor her L2 guest için bir VMCS inşa
etmelidir. Gerçek donanımda VMREAD/VMWRITE, opak, implementation-defined VMCS'e
dokunur; L1 kendisi L0'ın guest'i olarak çalışırken her VMREAD/VMWRITE normalde
L0'a trap ederdi — son derece pahalı. Enlightened VMCS (eVMCS), VMCS için
guest-physical memory'de sabit, belgelenmiş bir memory layout tanımlayan bir
Hyper-V enlightenment'ıdır (bkz.
Hyper-V enlightenments). L1, alanları sıradan
memory access'leriyle okur/yazar (VM-exit yok) ve bir clean-fields bitmap'i
L0'a son VMLAUNCH/VMRESUME (VM-entry) eşdeğerinden bu yana hangi alanların gerçekten değiştiğini
söyler; böylece L0 gerçek donanım VMCS02'sini inşa ederken yalnızca dirty
alanları yeniden valide edip kopyalar. İzolasyon invariant'ı değişmez — L0 hâlâ
gerçek VMCS'in sahibidir ve her L1-supplied alanı valide etmelidir — ama yol
trap-per-field'dan batched, memory-mapped exchange'e taşınır.
Bu, genel VMCS shadowing ve VMCS multiplexing probleminin Hyper-V karşılığıdır; KVM, Hyper-V altında bir L1 olarak verimli çalışmak için eVMCS desteği implement eder.
Walkthrough¶
Public reference: Microsoft Hypervisor TLFS (enlightened VMCS) ve KVM eVMCS implementasyonu. Kavramsal akış:
- L1, Hyper-V'yi CPUID vendor leaf ve eVMCS enlightenment bit'i ile saptar, sonra eVMCS'i etkinleştirir.
- L1, enlightened VMCS page(ler)ini kendi guest-physical memory'sinde belgelenmiş layout'ta tahsis eder ve per-vCPU eVMCS pointer'ını ona yöneltir.
- Bir L2 guest'i yapılandırmak için L1, control/guest-state alanlarını doğrudan eVMCS memory'ye yazar (düz store'lar, VMWRITE trap'i yok) ve değişen grupları işaretlemek için clean-fields bitmap'ini günceller.
- L2'ye VM-entry'de L0 yalnızca dirty alanları okur, valide eder, gerçek VMCS02'ye merge eder ve L2'yi çalıştırır.
- Exit'te L0, L1 için ilgili alanları geri eVMCS memory'ye yazar.
Beklenen gözlem: L1'in L0'a VMREAD/VMWRITE VM-exit'leri büyük ölçüde kaybolur, yerini eVMCS page'ine memory access'leri alır; clean-fields bitmap'i L0'ın neyi yeniden işleyeceğini yönetir.
Warning
Performans kazancı validation'ı gevşetmez: L1 artık alanları trap'siz yazdığı için, L0 entry'de eVMCS'ten tükettiği her alanı valide etmelidir. L1'in gerçekte değiştirdiği bir "clean" alanın validation'ını atlamak için clean-fields bitmap'ine güvenmek bir nested-virt vulnerability pattern'idir — clean bit'ler bir cache-coherence ipucudur, bir güvenlik garantisi değil.
Detection¶
- Host (L0) tarafı: eVMCS'i etkinleştirmek görünürdür (enlightenment negotiate edilir); canlı bir eVMCS pointer'ı varken nested VMREAD/VMWRITE exit'lerindeki düşüş imzadır.
- Buggy/hostile bir L1 için, L0 entry'de VMX tutarlılığını ihlal eden alan değerlerini saptamalı ve geçersiz bir L2 çalıştırmak yerine entry'yi fail etmelidir.
Mitigation¶
- L0, clean-fields bitmap'inden bağımsız olarak her entry'de tükettiği tüm eVMCS alanlarını tam valide etmelidir; "clean"i bir güvenlik kontrolünü atlamak için ruhsat olarak asla kullanma.
- eVMCS layout/version handshake'ini sıkı tut ki L1 ve L0 alan pozisyonlarında anlaşsın; bilinmeyen/geçersiz version'ları reddet.
- eVMCS alan işlemesini düzelten Hyper-V / KVM nested-virtualization güvenlik güncellemelerini uygula.
References¶
- Microsoft Hypervisor Top-Level Functional Specification (TLFS), "Nested Virtualization — Enlightened VMCS" (VP assist page, clean fields, enlightened MSR bitmap). https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/nested-virtualization
- KVM enlightened-VMCS implementasyonu ve dokümantasyonu.