Skip to content

EPT-based stealth hooking

Bir inline patch'i ya da breakpoint'i guest'ten gizlemek: hook'lanmış bir host frame'inden execute edilen byte'lar sunulurken, aynı guest-physical address'in her read'i şeffaf biçimde temiz, patch'siz frame'e yönlendirilir.

Mechanism

Note

EPT-based stealth hooking, bir EPT leaf entry'sinde Execute bit'inin Read/Write bit'lerinden bağımsızlığını exploit eder. Host, tek bir guest-physical page için iki host frame tutar: orijinal byte'ları barındıran bir clean frame ve patch'li byte'ları barındıran bir shadow frame (bir int3/0xCC breakpoint'i ya da absolute bir JMP detour'u). Hedef GPA'nın EPT leaf'i execute-only yapılır (X=1, R=0, W=0) ve shadow frame'e yöneltilir. Böylece instruction fetch'leri patch'li kodu çalıştırır, ama o GPA'nın herhangi bir read ya da write'ı bir EPT violation yükseltir (çünkü R=0/W=0) ve host data access için clean frame'i devreye sokar.

Bunun yendiği integrity özelliği code-read/code-exec tutarlılığıdır: yazılım ve in-guest integrity checker'ları, bir adreste okudukları byte'ların orada execute olan byte'lar olduğunu varsayar. EPT stealth hooking bu varsayımı guest'in dışından kırar. Fonksiyonu okuyan bir self-checksum orijinal byte'ları görür (clean frame) ve geçer, oysa execution patch'li shadow frame'den akar — hook, in-guest memory read'lerine görünmezdir. Bu, stealth breakpoint'ler, API monitoring (DdiMon tarzı) ve introspection için, aynı şekilde inline patch'leri gizleyen EPT-hooking rootkit'leri için de iş gören primitive'dir. Doğrudan EPT split üzerine kurulur ve tipik olarak tek bir altp2m view'ına scope'lanır.

Walkthrough

HyperDbg'den iki public varyant bu aileyi örnekler:

!epthook (stealth breakpoint). Hedef page'i bir shadow frame'e kopyala, hook adresine yalnızca shadow'da bir int3 yaz, sonra:

  1. Hedef GPA'nın EPT leaf'ini execute-only yap, shadow frame'e map edilmiş (X=1, R=0, W=0).
  2. Page'in bir read/write'ında bir EPT violation tetiklenir. Handler clean frame'i geri yükler ve permission'ları R=1/W=1, X=0'a çevirir, böylece data access orijinal byte'larda tamamlanır.
  3. Handler Monitor Trap Flag'i arm eder ki o tek instruction retire olduktan sonra bir VM exit tetiklensin; handler ardından shadow frame'i execute-only map'leyerek geri yükler.
  4. Execution int3'e ulaştığında, breakpoint exception bitmap üzerinden bir VM exit olarak teslim edilir — hypervisor kendi inject ettiği int3'ü guest'in meşru olanından ayırt eder.

!epthook2 (inline detour). Bir breakpoint yerine shadow frame, bir trampoline'e absolute bir JMP ile patch'lenir (bir length-disassembler engine ile inşa edilir). Redirect, hook noktasında VM exit olmadan VMX non-root mode'da execute olduğu için, !epthook2, !epthook'tan kayda değer ölçüde daha hızlıdır; read/write'lar yine aynı execute-only-sonra-swap-ve-MTF döngüsüyle yakalanır.

Warning

Execute-only EPT page'leri bir Intel VT-x feature'ıdır; AMD NPT'de execute-only encoding'i yoktur, dolayısıyla NPT-based hooking bunu yaklaşık olarak üretmek zorundadır (örn. read'leri de trap'leyerek); bu daha gürültülüdür ve timing ile saptanması daha kolaydır. Execute-only desteği olmadan bir "stealth" hook, her fetch fault verdiği için sızar.

Hook'lanmış bir page'in tek bir read'i boyunca permission/frame state'leri
steady state : EPT[gpa] = X=1 R=0 W=0  -> SHADOW frame (patched bytes execute)
guest reads  : EPT violation (R=0)
   handler   : EPT[gpa] = X=0 R=1 W=1  -> CLEAN frame (original bytes), set MTF
re-exec read : succeeds, returns original bytes
MTF vmexit   : EPT[gpa] = X=1 R=0 W=0  -> SHADOW frame restored

Detection

  • Self-checksum vs. davranış ayrışması: bir fonksiyonda okuduğu byte'ları hash'leyip gözlemlenen runtime davranışıyla karşılaştıran bir guest, split'i saptayabilir; çünkü read'ler temiz byte'ları görürken execution ayrışır.
  • Single-step vs. block execution: hook'lanmış bir region'ı single-step etmek, timing'i ve trap pattern'i native block execution'dan farklı olan per-instruction MTF/EPT-violation handling'i zorlar.
  • Timing: hook'lanmış bir page'in her read'indeki ekstra EPT-violation + MTF gidiş-dönüşü, erişim latency'sini ölçülebilir şekilde şişirir.
  • Host tarafı: asimetrik R/W/X'li (özellikle execute-only) EPT leaf'leri ve code page'lerinde sık permission flip'leri authoritative sinyaldir.

Mitigation

  • EPT/altp2m konfigürasyonunu trusted hypervisor control plane'e kısıtla; execution'ı hangi frame'in desteklediğini guest state'in seçmesine asla izin verme.
  • Bu tür hook'ları meşru biçimde çalıştıran defender'lar için: kendi kodunu timing'leyip checksum yapabilen bir guest'e karşı mükemmel stealth'in ulaşılabilir olmadığını kabul et.
  • Kötü niyetli bir host bileşeninin stealth hook kurmasını önlemek için, EPT permission asimetrisini denetle ve herhangi bir execute-only / dual-frame mapping'in kaydedilmesini ve attestable olmasını zorunlu kıl.
  • Nesting altında, L0 L1'in execute-only semantiğini sadakatle shadow'lamalı ki bir L2 guest'i sessizce hook'lanamasın.

References