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:
- Hedef GPA'nın EPT leaf'ini execute-only yap, shadow frame'e map edilmiş (X=1, R=0, W=0).
- 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.
- 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.
- Execution
int3'e ulaştığında, breakpoint exception bitmap üzerinden bir VM exit olarak teslim edilir — hypervisor kendi inject ettiğiint3'ü 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
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¶
- Design of !epthook — HyperDbg Documentation
- Design of !epthook2 — HyperDbg Documentation
- tandasat/DdiMon — Monitoring and controlling kernel API calls with stealth EPT hooks
- wbenny/hvpp — lightweight Intel VT-x hypervisor (EPT stealth hook of ntdll!ZwClose)
- Hypervisors for Memory Introspection and Reverse Engineering — secret.club