Skip to content

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 NPTguest-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ı:

  1. Guest boot'ta hypervisor guest-physical page'leri sınıflandırır: signed/verified code page'leri X=1, W=0 alır; geri kalan her şey W=1, X=0 alır.
  2. Guest enjekte edilen kodu bir data page'e yazar. Write başarılı olur (data page W=1), ama page X=0 kalır.
  3. 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.
  4. 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ğı
code pages : EPTE R=1 W=0 X=1   (executable, immutable)
data pages : EPTE R=1 W=1 X=0   (writable, non-executable)
transition X<-1 only after integrity verification of page contents
INVEPT after any permission change

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 X vermeden ö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