Skip to content

Syscall hooking via EPT (LSTAR/SSDT trap)

Guest system call'larını, SYSCALL entry'sini (LSTAR) ya da SSDT dispatch'ini EPT permission hilelerine ve execute-only shadow page'lere takılarak intercept eden hypervisor-level bir teknik; böylece hook in-guest read'lere görünmez.

Mechanism

Note

VT-x altında, second-level (EPT) translation, guest physical page başına bağımsız R/W/X permission bit'lerine sahiptir. Bu tekniğin istismar ettiği invariant: bir guest kendi kernel page'lerini okuyabilir, ama EPT, aynı guest-physical page'in bir execute access'i için bir read access'inden farklı byte'lar sunabilir. Bir syscall hook'u SYSCALL entry'sine — Windows'ta LSTAR MSR (0xC0000082) KiSystemCall64'e işaret eder — ya da SSDT entry'lerine çapalanır. Hypervisor, hook'u (bir absolute jump ya da bir 0xCC) içeren target page'in bir shadow kopyasını kurar, EPT entry'sini shadow'a execute-only map'ler ve orijinal page'i read'ler için tutar. Execution hook'u çalıştırır; herhangi bir read/write, hypervisor'ın orijinal page'i geri swap'ladığı (sonra Monitor Trap Flag ile single-step yapıp yeniden arm ettiği) bir EPT violation VM-exit tetikler, böylece in-guest integrity scan'leri ve PatchGuard pristine byte'lar görür — guest-visible tamper check'lerini yenen out-of-guest interception.

Walkthrough

Public referans: Rayanfam "Hypervisor From Scratch — Part 8". Kavramsal kurulum:

  1. Hook'u çapala. Ya SYSCALL entry'sini LSTAR (0xC0000082) üzerinden hook'la — post-Meltdown'da KiSystemCall64Shadow'a işaret ettiğini (KPTI/CR3 churn) not et, bu yüzden SSDT hooking sıklıkla tercih edilir — ya da SSDT'yi (KeServiceDescriptorTable[Shadow]) bul ve bir service'i çözümle: target = (SSDT->pServiceTable[ApiNumber] >> 4) + SSDTbase.
  2. Shadow page'i inşa et. Target page'i kopyala; kopyada hook'a bir absolute jump (ya da tek bir 0xCC) patch'le.
  3. EPT permission'larını böl. EPT entry'sinin page frame'ini shadow'a yönelt ve onu execute-only ayarla (read/write temizlenmiş). Şimdi execute shadow'u çalıştırır; read/write'lar fault verir.
  4. EPT violation'larını handle et. Bir read/write violation'ında, orijinal page'i (ya da orijinal permission'ları) restore et, MTF ayarla, tek instruction'ı single-step yap, sonra bir sonraki exit'te execute-only'yi yeniden uygula. 0xCC varyantı için, #BP exception bitmap üzerinden yakalanır ve hypervisor orijinal page'i geri swap'lar.
  5. LSTAR'ı gizle. LSTAR'ın RDMSR'ını MSR bitmap üzerinden intercept et ve meşru KiSystemCall64 address'ini ("fake MSR") döndür ki hook görünmez olsun.

Warning

Dual-use: bu, meşru VMI/EDR ve debugger'ların (HyperDbg, DdiMon) olduğu kadar stealth rootkit'lerin de altında yatar. Teknik için, kavramsal olarak belgelenmiştir.

Detection

  • Timing: bir execute-only/shadow split, hook'lanmış page'in read'lerinde EPT-violation exit'leri ekler; read'ler vs execute'ların cross-core timing'i onu ortaya çıkarabilir (bkz. VM-exit latency fingerprinting).
  • Introspection: read/execute sapmasını saptamak için read'te sunulan byte'ı vs gerçekten execute edilen byte'ı (out-of-band physical read) karşılaştır; kernel text ya da SSDT page'leri üzerinde beklenmeyen execute-only EPT entry'lerini kontrol et.

Mitigation

  • Defender'lar: trusted bir hypervisor / measured boot kullan ki kötü niyetli bir hypervisor OS'un altına eklenememesi (bkz. Thin hypervisor injection); HVCI/VBS, guest kernel page'lerinde W^X zorlar.
  • Benign kullanım için mümkün olduğunda guest-cooperative hooking'i tercih et; defense için EPT permission map'lerini daha yüksek-privilege bir monitor'dan denetle.

References

  • Rayanfam Blog, "Hypervisor From Scratch – Part 8: How To Do Magic With Hypervisor!": https://rayanfam.com/topics/hypervisor-from-scratch-part-8/