Skip to content

PXN (Privileged Execute Never) on Apple

The ARM page-attribute that forbids privileged (kernel/EL1) execution of user-mapped pages — Apple's SMEP-equivalent that breaks the classic "redirect the kernel into a userspace payload" (ret2usr) pattern.

Mechanism

Note

PXN ("Privileged eXecute Never"), ARM MMU'da per-page translation-table attribute'üdür. Bir page PXN işaretlendiğinde, processor privileged bir exception level'da (EL1, kernel) çalışırken o page'den bir instruction fetch ve execute etmeye çalışırsa fault üretir. User page'leri kernel'in görünümünden PXN map'lenir, bu yüzden bir saldırgan bir kernel function pointer'ını userspace'te kontrol ettiği bir buffer'a yöneltmek için corrupt etse bile, instruction fetch ring-0'da saldırgan kodu çalıştırmak yerine fault üretir.

Bu, x86 SMEP'in kavramsal ikizidir: güvenlik sınırı "privileged kod asla unprivileged page'leri execute etmez"dir. PAN / Privileged Access Never'ı (data tarafı, SMAP-eşdeğeri kontrol) ve genel ARM Privileged Execute Never primitive'ini tamamlar. Sınır tutar çünkü attribute her fetch'te hardware'de enforce edilir ve onu taşıyan page table'lar kernel'in kendisinin koruduğu bellekte yaşar.

Apple silicon'da PXN daha derin bir yığının içindeki bir katmandır. Apple'ın MMU'su ayrıca privileged kodun korumalı bir bölge dışındaki physical memory'den map'lenememesi için yapılandırılmıştır ve kernel kodunun writable mapping'leri yasaklanmıştır — Kernel Integrity Protection (KIP), Page Protection Layer (PPL) ve Secure Page Table Monitor (SPTM) tarafından enforce edilen bir W^X disiplini; bunlar kernel'den daha yüksek bir privilege'da çalışır ve PXN/AP bit'lerini taşıyan page table'ları korur.

Walkthrough

Bu kavramsaldır; bir saldırının nasıl kurulacağını değil, neden başarısız olduğunu anlatır.

  1. Bir memory-safety bug'ı saldırgana bir kernel indirect-branch hedefinin (bir function pointer, vtable slot ya da saved return address) kontrolünü verir.

  2. PXN öncesi dönem: klasik hamle ret2usr'ydi — o hedefi sıradan user memory'de duran bir payload'a yöneltmek; kernel bunu fetch edip execute edebiliyordu ve kodu kernel alanına yerleştirme zorluğunu atlatıyordu.

  3. PXN ile: user page'leri kernel'in translation regime'inden PXN attribute'ünü taşır. User payload'a ilk instruction fetch bir permission fault üretir ve kernel, saldırgan-kontrollü byte'ları execute etmek yerine panic atar.

  4. Bu yüzden saldırganlar tamamen zaten-executable olan kernel text içinde code-reuse'a — ROP/JOP — ya da önce page-table korumalarını yenmeye yönelirler. PXN bunları durdurmaz; en ucuz yolu kaldırır.

Warning

PXN yalnızca unprivileged page'lerin yürütülmesini engeller. Mevcut kernel-resident gadget'ların yeniden kullanımına, data-only saldırılara ya da page attribute'lerini flip'leyebilen bir saldırgana karşı hiçbir şey yapmaz. Apple silicon'da bu devam yolları KIP/PPL/SPTM, pointer authentication ve read-only page table'larının kapatması gereken şeylerdir.

Detection

PXN preventive'tir, bu yüzden host sinyali iyi huylu aktivitenin bir log'u değil, bir fault/panic'tir. Apple platformlarında ret2usr tarzı bir deneme, EL1'deyken bir user virtual address üzerinde instruction-abort/permission-fault olan bir kernel panic olarak kendini gösterir. Privileged yürütmenin user-range address'lerinde fault verdiğini gösteren panic log'ları, tekrarlanan boot-time panic'leri ya da beklenmedik kernel instruction-abort exception'ları, bir savunucunun ilişkilendirdiği telemetridir. Panic raporlarını ve crash imzalarını yüzeye çıkaran EDR/MDM filo telemetrisi pratik toplama noktasıdır.

Mitigation

PXN'in kendisi mitigation'dır; savunucunun işi onu konuşlandırmak ve regresyona uğratmamaktır:

  • Açık tut. PXN, modern ARMv8 kernel'lerinde ve Apple silicon'da varsayılan olarak etkindir; custom/embedded kernel'lerin user mapping'leri için privileged-execute-never ile build ettiğinden ve writable memory'nin privileged executable mapping'lerini oluşturmadığından emin olun.
  • Katmanla. PXN'i PAN (data tarafı), read-only page table'lar, Pointer Authentication ve W^X enforcement ile eşleyin ki yalnızca PXN'i yenmek kod yürütmeyle sonuçlanmasın.
  • Bilinen bypass uyarıları: PXN, bit'e saldırarak değil, ondan kaçınarak bypass edilir — kernel-resident gadget yeniden kullanımı, data-only sömürü ya da attribute'ü temizlemek için page table'ları altüst etmek. PXN'i gövde değil, tek bir kalas olarak görün.

References