Hyper-breakpoint (EPT-backed VMI breakpoint)¶
Hypervisor tarafından Extended Page Table permission'ları veya trap-and-restore yoluyla enforce edilen bir breakpoint; böylece execution, memory'de guest-visible bir 0xCC bırakmadan VMX root'a trap eder — in-guest bir
int3software breakpoint'inin stealthy alternatifi.
Mechanism¶
Neden çalışır
Klasik bir software breakpoint, target byte'ı 0xCC (int3) ile patch'ler,
dolayısıyla guest'in yaptığı bir memory read patch'i görür — integrity
check'leri ile kolayca tespit edilir. Bir hyper-breakpoint ise breakpoint'i
guest dışından, hypervisor'da enforce eder ve orijinal instruction byte'larını
guest-visible memory'de bozulmamış bırakır.
Execute-trap varyantı Extended Page Tables (EPT) kullanır. Hypervisor, target'ın guest physical page'inden execute permission'ını kaldırır (read/write'ı bozulmamış bırakırken). Guest CPU o page'den bir instruction fetch ettiğinde, CPU bir EPT violation üretir ve VMX root'a bir VM-exit'e yol açar. Hypervisor artık breakpoint'e "sahiptir": register/memory state'ini inceleyebilir veya değiştirebilir, event'i log'layabilir ya da bir debug notification teslim edebilir — tüm bunlar guest'in byte'ları değişmemişken olur, dolayısıyla page'i okuyan in-guest bir memory scanner el değmemiş kod görür.
Execution'ın trap edilen page'in ötesine geçmesine izin vermek için hypervisor, gerçek instruction'(lar)ı çalıştırıp sonra yeniden arm etmelidir. Public hyper-breakpoint tasarımları bunu nasıl yaptıklarına göre farklılaşır — üç varyantla yakalanır:
- EPT switching (altp2m): iki EPT view tutun — biri page executable, diğeri
değil — ve bir instruction çalıştırmak için aktif EPTP'yi atomik olarak flip
edip sonra geri flip edin. (Bkz.
ept-switch-single-step.md.) - Instruction repair: page'de execute permission'ını geçici olarak restore
edin, Monitor Trap Flag (MTF) üzerinden tam olarak bir instruction
single-step edin, sonra execute'u tekrar kaldırın. (Bkz.
guest-single-stepping.md.) - Instruction emulation: trap edilen tek instruction'ı EPT'yi hiç gevşetmeden hypervisor içinde decode edip emule edin, sonra devam edin.
Üçü de invariant'ı korur: guest hiçbir zaman değişmiş bir byte görmez ve bir
debugger'a atfedebileceği bir #BP almaz. (Buna karşın klasik bir EPT hook —
örn. HyperDbg'ninki — kasıtlı olarak gizli bir 0xCC / #BP yazar ve bu yüzden
bu tekniğin guest-visible kuzenidir.)
Walkthrough¶
VMX root / kontrol ettiğiniz bir hypervisor gerektirir
Aşağıdaki EPT-violation + step/emulate loop'u public VT-x introspection
yazılarını takip eder (HyperDbg, DRAKVUF ve hyper-breakpoint varyant
karşılaştırması). EPT switching özellikle Xen altp2m'e dayanır.
1. Breakpoint'i arm et — target GPA'dan execute'u soyun:
2. Execution'da trap et — fetch hypervisor'a fault eder:
[vmexit] reason=EPT_VIOLATION gpa=<target> access=exec -> hyper-breakpoint hit
inspect RIP/registers, log, notify debugger ...
3. Üzerinden adımla — gerçek instruction'ı çalıştırmak için bir varyant seç:
// (a) instruction repair
ept_set_perms(target_gpa, 1,1,1); // restore X
set_mtf(); // arm MTF (one-instruction step)
// VM-entry; MTF VM-exit (basic reason 37) after one instruction:
ept_set_perms(target_gpa, 1,1,0); // re-protect
clear_mtf();
// (b) EPT switching
switch_to_view(exec_view); step_one_via_mtf(); switch_to_view(trap_view);
// (c) instruction emulation
emulate_one_instruction_at(RIP); // never relax EPT
Stealth karşılaştırması vs. guest-visible int3
hyper-breakpoint (EPT exec-trap):
guest reads target page -> ORIGINAL bytes (no 0xCC present)
guest executes target -> EPT violation -> trap to hypervisor (invisible)
classic software breakpoint:
guest reads target page -> sees 0xCC (detectable patch)
guest executes target -> #BP delivered in-guest (debugger inferable)
Varyantlar maliyet ile fidelity arasında takas yapar: emulation, eksiksiz ve doğru
bir decoder ister; MTF repair her hit'te iki VM-exit ekler; EPT switching
re-stepping permission churn'ünden kaçınır ama altp2m gerektirir. Bu
hyper-breakpoint varyantlarının public bir performance karşılaştırması bu takasları
sayısallaştırır.
Detection¶
- In-guest: memory karşılaştırması başarısız olur (byte'lar değişmemiştir), dolayısıyla detection timing'e geri düşer — her hit EPT-violation VM-exit'lerine (ve repair varyantı için ek bir MTF exit'e) mal olur ve trap edilen bölgenin execution süresini mertebelerce şişirir.
- From the host: tek bir GFN üzerindeki tekrarlı EPT violation'lar, MTF exit'leri veya sık EPTP switch'leri ile eşleştiğinde, hypervisor telemetry'sinde net bir hyper-breakpoint signature'ıdır.
Mitigation¶
- Guest-side: kodu byte okuyarak değil, hypervisor'ın temiz bir shadow'dan karşılayamayacağı execute-and-time / execute-and-hash path'leriyle ölçün; integrity garantileri için hardware attestation'a güvenin.
- Host-side: EPT-permission ve
altp2mcontrol'lerini gate'leyin ki untrusted domain'ler hyper-breakpoint arm edemesin ve stealth instrumentation'a işaret eden sürekli per-GFN violation/MTF fırtınalarına alert üretin.
References¶
- "EPT Switching vs. Instruction Repair vs. Instruction Emulation: A Performance Comparison of Hyper-Breakpoint Variants" — https://www.mdpi.com/2673-4117/6/10/278
- HyperDbg: Reinventing Hardware-Assisted Debugging (CCS '22) — EPT hidden hooks vs. classic int3 EPT hooks — https://misc0110.net/files/hyperdbg_ccs22.pdf
- "Hypervisors for Memory Introspection and Reverse Engineering" (secret.club) — https://secret.club/2025/06/02/hypervisors-for-memory-introspection-and-reverse-engineering.html