altp2m views (guest başına birden çok EPT pointer)¶
Bir guest için birden çok alternate physical-to-machine (p2m / EPT) tablosu tutmak ve vCPU'yu bunlar arasında geçirmek; böylece aynı guest-physical address, aktif view'a göre farklı host frame'lere veya farklı permission'lara çözümlenebiliyor.
Mechanism¶
Note
Bir p2m tablosu, host'un sahip olduğu guest-physical (GFN) → host-physical
(MFN) eşlemesidir; Intel'de bu EPT olarak gerçeklenir. İzolasyon invariant'ı
şudur: guest bu eşlemeyi asla kontrol edemez. altp2m (alternate p2m), bir
guest'e birden çok p2m tablosu veren ve her vCPU'nun kendi EPTP'si üzerinden
bunlardan birini seçmesine izin veren bir Xen feature'ıdır. Aktif view per-vCPU
bir pointer olduğu için, bir vCPU view'lar arasında çok ucuza geçirilebilir —
guest içinden VMFUNC instruction'ı ile (function 0, EPTP switching) ya da
guest dışından hypervisor tarafından.
Bu, stealth introspection ve hooking'in temel substrate'idir. Farklı view'lar mapping açısından (bir GFN, bir view'da shadow frame'e işaret eder — bkz. EPT remapping) veya permission açısından (bir GFN, bir view'da executable, başka view'da read-only — bkz. EPT split) farklılaşabilir. Temelde defensive/analiz amaçlı bir primitive'dir, ama aynı mekanizmayı rootkit'ler kod gizlemek için kötüye kullanır: read'ler temiz byte'ları görür, execution ise hook'lanmış bir kopyaya düşer.
Walkthrough¶
Kavramsal akış (public reference: Xen altp2m tasarımı ve onu süren LibVMI/DRAKVUF tooling'i):
- Domain üzerinde altp2m'i etkinleştir (Xen control plane'de
xc_altp2m_set_domain_statetarzı bir çağrı). - Bir veya birden çok alternate view oluştur; view 0 tipik olarak değiştirilmemiş default'tur.
- Bir alternate view'da bir GFN'nin mapping'ini veya permission'ını değiştir (shadow frame'e remap et, ya da execute-only / read-only yap).
- Bir vCPU'nun aktif view'ını değiştir — ya hypervisor'dan ya da guest içinden
VMFUNC(EPTP-switching) ile; bkz. VMFUNC EPTP switching. - Yeni view'daki erişim, alternate EPT üzerinden çözümlenir; o view'daki bir permission fault, bir EPT violation veya bir #VE doğurur.
Beklenen gözlem: host, tek bir domain için N adet EPT root tutar; per-vCPU EPTP değerleri birbirinden ayrışır; EPT fault'ları belirli bir view index'ine atfedilir.
Warning
VMFUNC ile altp2m view switching, hypervisor hangi view'ların erişilebilir
olduğunu kısıtlamadığı sürece guest ring 3'ten çağrılabilir. Çok fazla view
açan ya da erişilebilir bir "temiz" view bırakan bir monitor, guest kodunun
istediği zaman hook'lanmış view'dan kaçmasına izin verir.
Detection¶
- Bir guest, split mapping'leri probe edebilir: bir adreste okuduğu byte'larla gerçekte execute olan byte'ları karşılaştırarak (self-checksumming) ya da view sınırlarını geçen erişimleri timing'leyerek.
VMFUNCmevcudiyeti (CPUID, EPTP-switching VM-function'ı enumerate eder) artı birden çok erişilebilir EPTP değeri, bir introspection fingerprint'idir.- Host tarafı: alternate-view oluşturma, GFN remap'leri ve per-vCPU EPTP değişimleri authoritative telemetry'dir.
Mitigation¶
- Guest
VMFUNC'tan erişilebilir altp2m view kümesini kısıtla (EPTP listesi host-controlled'dur); yalnızca host-driven switching amaçlanıyorsa guest-initiated switching'i reddet. - Tüm view'ları tek bir host-owned default'tan türet ki hiçbir view bir GFN'yi guest'in tahsisi dışındaki bir frame'e map edemesin — altp2m guest erişimini asla genişletmemeli.
- Nested virtualization için, L1'in altp2m'inin L0 tarafından sadakatle shadow'lanmasını sağla ki bir L2, view'ları desenkronize edemesin.
References¶
- Xen Project, "Stealthy monitoring with Xen altp2m" — guest başına birden çok EPT, VMFUNC EPTP switching, shadow view'lar. https://xenproject.org/2016/04/13/stealthy-monitoring-with-xen-altp2m
- DRAKVUF Wiki, "Xen altp2m" — altp2m ile dual memory view introspection. https://github.com/tklengyel/drakvuf/wiki/Xen-altp2m