Skip to content

VMCALL inline hook (VM-exit trigger gadget)

Hook'lanan bir konuma inline olarak bir VMCALL instruction'ı 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ış:

  1. Hook site'ı seç ve bir trampoline kur. HyperDbg orijinal instruction'(lar)ı kendi length-disassembler engine'i ile disassemble eder ve absolute jump'ı bir VMCALL yayan 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).
  2. 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).
  3. 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.
  4. 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/VMMCALL opcode'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