Skip to content

Shadow page mapping (cloned hooked page)

Bir guest-physical page'in iki host kopyasını tutan bir EPT memory-introspection tekniği — temiz bir read/write kopyası ve hook'lanmış bir execute kopyası — ve EPT violation'larda bunlar arasında geçiş yaparak in-guest integrity check'lerinin eklenmiş hook'u asla gözlemlememesi.

Mechanism

Note

Intel EPT altında, bir guest-physical page için second-level page-table entry'si bağımsız read (R), write (W) ve execute (X) permission bit'leri taşır. Bu teknik, aşağıdaki adım 4'teki execute-only encoding'e (R=0, W=0, X=1) dayandığı için spesifik olarak Intel EPT'nin execute-only desteğini gerektirir; AMD NPT execute-only permission'ı sağlamadığından bu split aynen NPT'ye uygulanamaz (AMD NPT'nin bu pattern'i execute-only olmadan nasıl yaklaştırdığı için bkz. npt-based-hooking.md). CPU bu bit'lere bir data access ile bir instruction fetch için ayrı ayrı baktığı için, tek bir guest-physical address, guest'in page'i okumasına mı yoksa execute etmesine mi göre farklı host physical frame'lere çözümlenecek şekilde yapılabilir. Shadow page mapping bu decoupling'i kullanır: hypervisor, hedef page'in değiştirilmiş bir kopyasını tutan ikinci bir host frame tahsis eder (örn. bir int3/0xCC breakpoint ya da hook'lanan fonksiyonun ilk byte'ına yazılmış bir detour) ve EPT'yi öyle ayarlar ki instruction fetch'ler hook'lanmış frame'e, read'ler temiz frame'e çözümlensin. Page'i geri okuyan bir in-guest integrity scanner pristine byte'ları görür, dolayısıyla hook bir read-based check'e görünmez. Bu, EPT stealth hooking ve altp2m "shadow" view'ının ardındaki temel primitive'dir.

İzolasyon açısı: guest bir guest-physical page'in tek, tutarlı bir nesne olduğuna inanır, ama hypervisor — guest'in kendi paging'inin altında, SLAT katmanında oturarak — sessizce iki view sunar. Hook tamamen guest'in adresleyemeyeceği host memory'de yaşar.

Walkthrough

Tek bir 4 KiB page için read/execute split'inin kavramsal akışı:

  1. Hook'lanacak fonksiyonu içeren guest-physical page'i (GPA) belirle. Onu guest virtual address'ten bir guest page-table walk ile çözümle (bkz. guest-page-table-walk.md).
  2. Bir host shadow frame tahsis et, orijinal page'i içine kopyala ve shadow kopyayı patch et (hook offset'ine breakpoint/detour yaz).
  3. GPA'nın EPT entry'sini temiz frame'e R=1, W=1, X=0 permission'larıyla yönelt (okunabilir/yazılabilir, executable değil).
  4. Guest o page'de execute etmeye çalıştığında, X=0 bit'i bir EPT violation tetikler (exit reason "EPT misconfiguration/violation"). Handler aynı GPA'nın EPT entry'sini shadow frame'e R=0, W=0, X=1 (execute-only) ile yeniden yöneltir, sonra resume eder — patch'lenmiş byte'lar artık çalışır.
  5. Guest daha sonra page'i okuduğunda (örn. bir anti-cheat / PatchGuard tarzı tarama), shadow entry'deki R=0 başka bir EPT violation tetikler; handler temiz R=1,W=1,X=0 frame'e geri geçer ki read orijinal byte'ları döndürsün.
Temsili EPT-entry permission state'leri
state CLEAN  : EPTE(GPA) -> clean_frame   R=1 W=1 X=0
state HOOKED : EPTE(GPA) -> shadow_frame  R=0 W=0 X=1
on EPT-violation(execute) while CLEAN  -> set HOOKED, retry
on EPT-violation(read/write) while HOOKED -> set CLEAN, retry
invalidate EPT TLB (INVEPT) after each swap

Warning

Bu, standart, yayımlanmış bir VM-introspection / EDR tarzı tekniktir (DRAKVUF-class tooling ve hypervisor research projeleri tarafından kullanılır). Burada kavramsal permission-bit düzeyinde anlatılmıştır; tam kod hypervisor-specific'tir.

Detection

  • Timing: her read↔execute geçişi bir VM-exit ve bir INVEPT flush'a mal olur; shadow mapping altındaki bir page, normal bir page'e kıyasla anormal derecede yavaş alternating read/execute access'e sahiptir.
  • View discrepancy probe: bilinen bir instruction'ı execute edip sonra aynı adresi okuyan kod, execute olan byte'ların okunan byte'lardan farklı olduğunu saptayabilir — bir shadow mapping'in tanımlayıcı belirtisi.
  • Bir bölgeyi single-step'leyip alternating access tipinde açıklanamayan EPT violation'ları izlemek.

Mitigation

  • Self-modifying / self-reading code: aynı cache line'dan sıkı interleaving ile okuyup execute eden bir rutin, sürekli swap'ı zorlar, maliyeti yükseltir ve hook'u timing ile ortaya çıkarır.
  • Hypervisor tarafında teknik kendisi bir defense primitive'idir; bir adversary ondan sub-page değişikliklerle ya da önce hypervisor'ı saptayarak kaçar (bkz. stealth-vt-x-hypervisor-anti-detection.md).
  • Herhangi bir permission split'te fault veren coherent SLAT tasarımları, artı EPT-violation oranlarının performance-counter monitoring'i, stealth'i sınırlar.

References