NPT-based hooking (AMD nested page table hook)¶
İnce bir AMD hypervisor'ın, bir code page'inin iki görünümünü — iyi huylu bir "read" kopyası ve hook'lanmış bir "execute" kopyası — sunmak için Nested Page Tables (NPT) kullandığı bir stealth hooking tekniği; böylece okumalar orijinal byte'ları görürken execution patch'lenmiş (örn.
INT3/detour) page'e iner.
Mechanism¶
Note
NPT, AMD'nin second-level address translation'ıdır (guest-physical -> host-physical), Intel EPT'nin analoğu. Bir hypervisor, bir guest page'ini kısıtlı NPT permission'larıyla işaretleyebilir; böylece onu execute etmek ile read etmek farklı path'ler izler. Klasik hook, bir hedef code page'inin iki physical kopyasını tutar:
- hooked kopyaya (detour / breakpoint içeren) map'lenmiş bir execute view ve
- original kopyaya map'lenmiş bir read/write view.
Hypervisor, NPT permission'larını toggle'layarak ve (bir fault'ta) guest-physical address'i hangi kopyanın beslediğini değiştirerek, fonksiyonu çalıştırırken CPU'nun hooked byte'ları fetch etmesini ama page'i okuyan herhangi bir koda ya da integrity checker'a orijinal byte'ları döndürmesini sağlar — guest içi tamper check'lerini bozar. Suistimal edilen invariant şu: SLAT permission/mapping guest'e görünmezdir; guest tek bir address görür ama hypervisor sessizce fetch ile read'i farklı yönlendirir.
AMD bir pürüz ekler: NPT'nin execute-only encoding'i yoktur (executable bir page aynı zamanda readable olmalıdır) ve klasik AMD-V'de Intel'in Monitor Trap Flag'i yoktur. Bu yüzden implementation'lar, protection'ı yeniden kurmadan önce hook bölgesindeki orijinal instruction'ları güvenle yeniden çalıştırmak için permission'ları toggle'lar ve single-step (yeniden fault vererek) yapar. Bu, Intel EPT-based stealth hooking / EPT remapping'in AMD muadilidir.
Walkthrough¶
Public reference: SimpleSvmHook (tandasat) ve secret.club introspection yazısı. Kavramsal akış:
- Hypervisor, hedef code page'inin bir shadow (hooked) kopyasını allocate eder ve
detour'u yazar (örn. prologue'a bir
int3/vmmcall). - NPT'yi, guest-physical page execute-restricted olacak şekilde yapılandırır; bir
guest execute fetch'i bir NPT fault'u (
#NPF) tetikler -> VM-exit. - Execute fault'unda hypervisor page'i hooked kopyaya remap eder ve resume eder; CPU detour'u fetch eder ve control'ü handler'a aktarır.
- Orijinal instruction'ın ilerlemesine izin vermek için, orijinal page'i geçici olarak RWX ile restore eder, bir instruction single-step eder, sonra execute-restricted hooked mapping'i yeniden uygular.
- Page'in herhangi bir read'i orijinal kopyadan servis edilir, dolayısıyla integrity check'ler bozulmamış byte'lar görür.
Beklenen gözlemlenebilir: fonksiyon intercept edilir, yine de byte'larının memory read'leri değişmemiş görünür.
Warning
RWX/single-step dansı racy'dir ve AMD'ye özgüdür (execute-only yok, MTF yok). Single-stepping/permission toggling ölçülebilir bir VM-exit latency ekler — bu da tam olarak bu tür hook'ları tespit etmek için kullanılan sinyaldir (aşağıya bak).
Detection¶
- Bkz. NPT-hook detection via single-step redirection: read/execute view ayrışması için probe et ve hook bölgesini zamanla.
- Hooked page'in
RDTSCtabanlı zamanlaması, un-hooked bir page'e kıyasla ekstra VM-exit/single-step maliyetini gösterir.
Mitigation¶
- Savunma amaçlı integrity check'ler execute edilen byte'ları (yalnızca read edilen byte'ları değil) karşılaştırmalıdır, örn. hypervisor'ın kendisi ya da measured-launch attestation ile.
- Confidential-VM platformlarında, guest code'unun SLAT seviyesindeki yeniden yönlendirilmesi memory encryption / integrity ile kısıtlanır ve bu yüzey küçülür.
References¶
- tandasat — SimpleSvmHook (NPT-based hooking research hypervisor). https://github.com/tandasat/SimpleSvmHook
- secret.club — "Hypervisors for Memory Introspection and Reverse Engineering." https://secret.club/2025/06/02/hypervisors-for-memory-introspection-and-reverse-engineering.html