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:
- Hook'u çapala. Ya SYSCALL entry'sini
LSTAR(0xC0000082) üzerinden hook'la — post-Meltdown'daKiSystemCall64Shadow'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. - Shadow page'i inşa et. Target page'i kopyala; kopyada hook'a bir absolute jump
(ya da tek bir
0xCC) patch'le. - 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.
- 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.
0xCCvaryantı için,#BPexception bitmap üzerinden yakalanır ve hypervisor orijinal page'i geri swap'lar. - LSTAR'ı gizle.
LSTAR'ın RDMSR'ını MSR bitmap üzerinden intercept et ve meşruKiSystemCall64address'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/