SLAT-based W^X enforcement¶
Second-Level Address Translation (Intel EPT / AMD NPT) kullanarak guest-physical page'lerde Write-XOR-Execute'u guest dışından zorlamak; böylece guest'in yazabildiği bir page, hypervisor-mediated bir SLAT violation olmadan execute edilemez (ve tersi).
Mechanism¶
Note
Second-Level Address Translation (SLAT) — Intel EPT, AMD NPT —
guest-physical'den host-physical adreslere hypervisor-controlled bir
translation ekler; bunun kendi per-page R/W/X permission bit'leri vardır ve
bunlar guest'in kendi page table'larına ek olarak zorlanır. SLAT-based W^X'in
kurduğu invariant şudur: hiçbir guest-physical page SLAT katmanında aynı anda
hem writable hem executable değildir. Hypervisor her page'i ya W=1, X=0
(data/writable) ya da X=1, W=0 (code/executable) işaretler. Guest'in kendi
page table'ları (guest'in tamamen kontrol ettiği) bir page'i RWX işaretlese
bile, daha katı SLAT permission'ı kazanır, çünkü nihai access her iki
translation level tarafından gate'lenir. Bir writable page'i execute etme ya da
bir executable page'e write etme girişimi, hypervisor'a trap eden bir EPT/NPT
violation doğurur.
İzolasyon açısı: compromise olmuş bir guest kernel, enjekte edilen shellcode'u executable yapmak için kendi page table'larını yeniden yazabilir, ama EPT/NPT'yi düzenleyemez — bunlar guest'in address space'i dışında, host memory'de yaşar. SLAT'ta zorlanan W^X bu yüzden tam guest-kernel compromise'ından sağ çıkar; bu da neden virtualization-based code-integrity'nin (örn. Windows HVCI / Hypervisor-Protected Code Integrity) temeli olduğunu açıklar.
Walkthrough¶
Guest code/data page'lerinde W^X'in kavramsal zorlanması:
- Guest boot'ta hypervisor guest-physical page'leri sınıflandırır: signed/verified
code page'leri
X=1, W=0alır; geri kalan her şeyW=1, X=0alır. - Guest enjekte edilen kodu bir data page'e yazar. Write başarılı olur (data page
W=1), ama pageX=0kalır. - Guest (ya da exploit) enjekte edilen kodu execute etmek için o page'e atlar.
Instruction fetch
X=0'a çarpar → EPT/NPT violation → hypervisor'a VM-exit. - Hypervisor'ın policy'si, yeni içerik bir code-integrity check'ten (signature / measured page'ler) geçmedikçe page'i executable'a çevirmeyi reddeder. Enjeksiyon bloklanır; guest arbitrary code execution değil, bir fault görür.
Permission policy taslağı
Warning
SLAT-based W^X bir defense primitive'idir. Code injection çıtasını yükseltir ama zaten executable olan page'lere karşı code-reuse'u (ROP/JOP) durdurmaz ve JIT bölgeleri dikkatli policy gerektirir (transient W sonra X, asla ikisi birden).
Detection¶
- EPT/NPT violation telemetry'si: execute-on-writable ya da write-on-executable fault spike'ları injection girişimlerine (ya da buggy JIT'e) işaret eder.
- Guest başına SLAT-violation oranlarının performance-counter monitoring'i.
Mitigation (bypass considerations)¶
- Code-reuse: mevcut code page'leri executable kaldığı için, ROP/JOP gadget chain'leri W^X'ten etkilenmez; mitigation'lar CFI/shadow stack ile katmanlanmalı.
- JIT abuse: saldırganlar meşru JIT'lerin kısa writable→executable geçiş
penceresini hedefler; sağlam policy'ler
Xvermeden önce page'leri verify ya da freeze eder. - Önce hypervisor'ı yenmek: bir adversary VMM'i saptayıp subvert ederse (bkz. stealth-vt-x-hypervisor-anti-detection.md), SLAT W^X artık geçerli değildir.
References¶
- Intel 64 and IA-32 Architectures Software Developer's Manual, Vol. 3C — EPT paging-structure permission'ları ve EPT-induced VM exit'leri (§25.5.6). https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-1089.html
- Microsoft Hypervisor TLFS, "Nested Virtualization — Second Level Address Translation"; HVCI / Virtualization-Based Security temeli. https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/nested-virtualization
- AMD64 Architecture Programmer's Manual, Vol. 2 — Nested Paging (NPT).