Nested EPT (shadow EPT in L0)¶
Bir guest hypervisor için Intel EPT'yi virtualize etme: L0, L1'in guest tarafından tanımlanmış EPT'sini (EPT12) alır ve onu kendi EPT'siyle (EPT01) tek bir donanım "shadow" EPT'sine (EPT02) compose eder; CPU L2'yi çalıştırmak için fiilen bunu kullanır — iki seviyeli second-level translation'ı tek seviyeye indirger.
Mechanism¶
Note
Nested virtualization ile L1, kendi guest'i L2 için EPT kuran bir hypervisor'dır (buna EPT12 diyelim, L2-physical'ı L1-physical'a map'ler). Ama L1'in kendisi L0'ın bir guest'idir, dolayısıyla L1-physical gerçek physical değildir — L0'ın EPT'sinden (EPT01, L1-physical'dan host-physical'a) geçer. Donanım bir VM çalıştırırken yalnızca bir EPT pointer'a danışır, bu yüzden L0 tek bir tablo, EPT12 ∘ EPT01 compose ederek L2-physical'ı doğrudan host-physical'a map'leyen EPT02 (shadow EPT)'yi üretmek zorundadır.
L0, EPT02'yi lazy biçimde kurar: L2 bir translation'da fault verdiğinde, L0 L1-physical address'i elde etmek için EPT12'yi yürür (onu L1'in memory'sinden okur), sonra host-physical'a ulaşmak için EPT01'i yürür ve merge edilmiş entry'yi EPT02'ye install eder. L0'ın korumak zorunda olduğu invariant: L2, EPT12 ∘ EPT01'in vermeyeceği bir erişimi asla elde edemez — her merge edilmiş permission iki level'in intersection'ıdır. L0 ayrıca EPT02'yi coherent tutmak zorundadır: L1 EPT12'yi düzenler ya da translation'ları invalidate ederse (örn. INVEPT emulation'ı ya da bir PV TLB flush ile), L0 karşılık gelen shadow entry'leri invalidate etmelidir — tam da nested EPT/NPT TLB-flush state confusion'da yanlış ele alınan coherence gereksinimi.
Walkthrough¶
Public reference: KVM "Nested VMX" documentation. Kavramsal L0 akışı:
- L1, L2 için
VMRESUME/VMLAUNCHçalıştırır; onun VMCS12'si L1'in EPT12'sine referans veren birept_pointertaşır. - L0 entry'yi emulate eder: EPT02'yi kurar ve gerçek VMCS02 EPTP'yi ona işaret ettirir, sonra hardware EPT etkin biçimde L2'yi çalıştırır.
- Bir EPT02 miss'inde (EPT violation), L0:
- L2-physical -> L1-physical için EPT12'yi yürür (L1 memory'sinden okunur),
- L1-physical -> host-physical için EPT01'i yürür,
- intersect edilmiş permission'lı entry'yi EPT02'ye install eder.
- L1 INVEPT / TLB-flush hypercall emulation'ında, L0 etkilenen EPT02 entry'lerini düşürür ki stale translation'lar kalıcı olamasın.
Beklenen gözlemlenebilir: L2, hardware second-level paging ile çalışır (per-access exit yok), bu sırada L0 iki translation katmanını şeffaf biçimde merge eder.
Warning
Shadow merge permission'ları intersect etmeli ve her L1 EPT ya da TLB değişiminde coherent kalmalıdır. Kaçırılan bir invalidation, L2'yi stale bir GPA mapping kullanır durumda bırakır (bir confidentiality/integrity açığı); fazla izin veren bir merge isolation'ı bozar.
Detection¶
- L0 tarafı: EPT02 (yeniden) kurulumlarını ve INVEPT emulation'ını instrument et; coherence bug'ları, L2'nin bir L1 tarafı unmap'inden sonra memory'ye erişmesi olarak ortaya çıkar.
- Merge edilmiş entry'lerin EPT12 ve EPT01 permission'larının minimumunu aldığını audit et.
Mitigation¶
- Tüm L1 EPT düzenlemelerinde ve TLB-flush/INVEPT event'lerinde shadow EPT'yi doğru biçimde invalidate et (CVE-2026-46131 sınıfı fix'leri uygula).
- Permission'ları daima iki level boyunca intersect et; L1'in sağladığı EPT entry'lerine, host-physical mapping'leri EPT01 üzerinden yeniden türetmeden asla güvenme.
References¶
- "Nested VMX" — KVM x86 documentation (VMCS12/VMCS02, nested EPT). https://docs.kernel.org/virt/kvm/x86/nested-vmx.html
- "The Turtles Project: Design and Implementation of Nested Virtualization" (OSDI 2010). https://www.cs.utexas.edu/~witchel/380L/papers/benyehuda10osdi-turtles.pdf
- CVE-2026-46131 — "KVM: x86: check for nEPT/nNPT in slow flush hypercalls" (nested EPT/NPT shadow-invalidation fix class). https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-46131 https://www.cve.org/CVERecord?id=CVE-2026-46131