Skip to content

W^X / kernel DEP

Bellek ya writable ya executable'dır, asla her ikisi birden değil — kernel space'e genişletilir ki corrupt olmuş kernel data'sı inject edilmiş kernel koduna dönüşemesin.

Mechanism

Invariant

W^X ("write XOR execute"), hiçbir memory page'inin aynı anda writable ve executable olmamasını zorlar. Kernel'de bu kernel DEP'tir: stack, heap ve tüm data segment'leri page table'larda CPU'nun NX/XD bit'i (x86) ya da XN'i (ARM) üzerinden non-executable map'lenir. Güvenlik sınırı klasik code-injection path'idir: bir kernel write primitive'i elde eden bir saldırgan data'yı corrupt edebilir, ama o data'yı executable instruction'lara dönüştüremez, çünkü onu tutan page hiçbir execute permission taşımaz.

Kernel'de W^X'i iki komşu invariant güçlendirir:

  • SMEP (Supervisor Mode Execution Prevention) / ARM PXN: kernel, user-mode page'lerinden instruction fetch edemez; ring-0'ın attacker-controlled userland koduna atladığı "ret2user" deliğini kapatır.
  • SMAP / ARM PAN: kernel, user page'lerini gelişigüzel okuyup/yazamaz; userland'e data-pointer yönlendirmesini körler.

Yeni kod inject edip çalıştırmak bloklandığı için, W^X/DEP saldırganları code-reuse'a (ROP/JOP) doğru iter — bu yüzden W^X tipik olarak CFI, shadow stack'ler ve page table'ların kendilerinin execute permission vermek üzere düzenlenmesini engelleyen hypervisor-enforced integrity (HVCI) ile eşleştirilir.

Walkthrough

Kavramsal olarak (kamuya açık OS-hardening dokümantasyonundan çıkarılmıştır):

  1. Map zamanında, kernel her non-code mapping üzerinde NX/XN bit'ini set eder — runtime data için EFI_MEMORY_XP, non-executable stack/heap'ler ve read-only .rodata.
  2. Code page'leri (.text) read-execute map'lenir, asla read-write-execute değil.
  3. Bir kernel buffer'ını shellcode ile overflow edip control flow'u ona yönlendiren bir exploit fault verir: CPU, bir NX page'den instruction fetch'te bir page fault yükseltir (kernel tried to execute NX-protected page).
   data page:  RW-   (NX set)  -> fetch here  => #PF, panic
   code page:  R-X             -> legitimate execution

Warning

W^X yalnızca page table'ları kontrol eden varlık kadar güçlüdür. Bir kernel write primitive'i aynı zamanda bir page-table permission bit'ini flip edebiliyorsa (NX'i temizleyebiliyorsa), policy çöker. VBS/HVCI'nin "hiçbir page code-integrity onayı olmadan executable olmaz" enforcement'ını tam da bu yüzden hypervisor'a (VTL1) taşımasının nedeni budur.

Yaygın bypass aileleri (savunma farkındalığı)
  • Code reuse (ROP/JOP/ret2libc): mevcut executable gadget'ları chain'le, yeni executable page gerekmez.
  • Page-table manipülasyonu: NX bit'ini temizlemek için PTE'leri corrupt et (HVCI / read-only page table'lar / Kernel Data Protection ile mitigate edilir).
  • ret2user: kernel execution'ını user koduna yönlendir (SMEP/PXN ile mitigate edilir).

Detection

  • Kernel fault telemetry'si: "attempted to execute NX-protected page", ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY (Windows bugcheck 0xFC) ya da Linux BUG: unable to handle kernel ... NX referans veren bugcheck'ler / panic'ler, bir injection girişiminin güçlü sinyalleridir.
  • EDR / kernel integrity olayları: RWX kernel belleği allocate etme ya da bir kernel mapping'i executable'a değiştirme yönündeki bloklanan girişimler.
  • Anomali: heap/stack aralığına transfer olan kernel control flow ya da runtime'da ortaya çıkan yeni executable kernel page'leri, bir W^X bypass girişimine işaret eder.

Mitigation

  • Firmware ve OS'ta NX/XD'yi enable et; hiçbir kernel allocator'ın RWX page dağıtmadığından emin ol. Executable+writable bellek isteyen driver'ları denetle.
  • SMEP/SMAP (x86) ve PXN/PAN (ARM)'ı enable et ki kernel user page'lerini execute edemesin veya körü körüne onlara güvenemesin.
  • Code-reuse savunmalarını katmanla: forward-edge CFI (kCFG), backward-edge koruması (shadow stack'ler / CET) ve ARM'da pointer authentication.
  • W^X'i yukarıdan zorla: VBS/HVCI'yi deploy et ki page permission'ları ve code integrity hypervisor tarafından doğrulansın ve compromise olmuş bir kernel'den gevşetilemesin.

References