Skip to content

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ış:

  1. L1, Hyper-V'yi CPUID vendor leaf ve eVMCS enlightenment bit'i ile saptar, sonra eVMCS'i etkinleştirir.
  2. 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.
  3. 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.
  4. 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.
  5. 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