VMCALL inline hook (VM-exit trigger gadget)¶
Hook'lanan bir konuma inline olarak bir
VMCALLinstruction'ı yerleştirmek; çalıştırıldığında hypervisor'a bir VM-exit'i zorlar, hypervisor hook'u servis eder ve devam eder — redirect'i guest memory'de değil VMX root'ta gerçekleşen, hypervisor aracılı bir inline hook.
Mechanism¶
Note
VMCALL (Intel) / VMMCALL (AMD), guest'in hypervisor'a çağrı instruction'ıdır:
çalıştırılması reason VMCALL (18) ile bir VM-exit'e yol açar. Bir inline hook
normalde byte'ları bir jmp ile üzerine yazar, ki bu in-guest integrity check'lere
görünürdür. Bir VMCALL inline hook ise bunun yerine hook'lanan adrese ulaşmanın bir
VMCALL çalıştırmasını sağlar, böylece kontrolü hypervisor'ın exit handler'ına
aktarır. Invariant şudur: redirect target ve hook mantığı guest-virtual memory'nin
dışında (hypervisor içinde) yaşar, ve trap eden byte'ın kendisi EPT'nin arkasına
gizlenebilir (read'de orijinal byte'ları gösteren execute-only bir shadow page), yani
hook hem güçlü (tam host context) hem stealthy olur. EPT-based hooking ve hypervisor
debugger'larının üzerine inşa edildiği trigger primitive'idir.
Walkthrough¶
Public reference: HyperDbg'in !vmcall (hypercall hooking) tasarımı. Kavramsal akış:
- Hook site'ı seç ve bir trampoline kur. HyperDbg orijinal instruction'(lar)ı kendi
length-disassembler engine'i ile disassemble eder ve absolute jump'ı bir
VMCALLyayan bir stub'a giden bir patched page oluşturur (veya "Illusion"daki gibi, trap eden instruction'ı doğrudan EPT in-place patching ile yerleştirir). - Exit'i tetikle. Guest site'a ulaşıp
VMCALLçalıştığında, CPU bir VM-exit yapar (EXIT_REASON_VMCALL = 18); hypervisor'ın VM-exit handler'ı hook rutinine dispatch eder (guest state'i oku/değiştir, logla, redirect et). - Güvenle devam et. Hypervisor orijinal instruction'ı yeniden oynatır — çoğu zaman orijinal byte'ları geri yükleyip Monitor Trap Flag (MTF) ile single-step yaparak, ardından hook'u yeniden kurarak — böylece yürütme şeffafça devam eder.
- Gizle. Guest'in site'ı read'lerinin orijinal (hook'lanmamış) byte'ları döndürmesi için execute-only bir EPT shadow page ile birleştir — bkz. EPT-based stealth hooking.
Beklenen gözlem: hook'lanan site artık her ulaşıldığında bir VMCALL VM-exit'e yol açar (ölçülebilir bir per-hit exit maliyeti).
Warning
Dual-use: meşru hypervisor debugger'lar/EDR (HyperDbg) ile stealth rootkit'lerin temelinde yatar. Teknik için belgelenmiştir.
Detection¶
- Timing: her hit bir VM-exit doğurur; hook'lanan path'in sıkı timing'i maliyeti açığa çıkarır (VM-exit latency fingerprinting).
- Introspection: daha yüksek ayrıcalıklı bir monitör'den, executable guest page'leri
beklenmedik
VMCALL/VMMCALLopcode'ları için tara ve onları gizleyen EPT shadow'u yakalamak için read-vs-execute byte'larını karşılaştır.
Mitigation¶
- VT-x/SVM'in güvenilir bir hypervisor'a ait olduğundan emin ol ki kötü niyetli biri OS'in altına exit'ler kuramasın (bkz. thin hypervisor injection); HVCI/VBS, inline patch'e direnmek için kernel W^X'i zorunlu kılar.
- EPT permission map'lerini execute-only kernel page'leri ve beklenmedik VMCALL trampoline'leri için denetle.
References¶
- HyperDbg Documentation —
!vmcall(hook hypercalls): https://docs.hyperdbg.org/commands/extension-commands/vmcall