ARM Privileged Execute Never¶
User-mapped (EL0) page'leri kernel (EL1) privilege'ında non-executable yapan page-table attribute'u — x86 SMEP / PaX KERNEXEC'in AArch64 karşılığı, ret2usr'ı block eder.
Mechanism¶
Neden çalışır
Klasik kernel-exploit kısayolu ret2usr, kernel control flow'unu attacker'ın userspace'te map'lediği bir payload'a yönlendirir; bu payload kernel privilege'ları ile execute olur. Yalnızca CPU, EL1'deyken bir user page'inden instruction fetch edecekse çalışır.
AArch64 translation descriptor'ları iki execute-never bit'i taşır:
- UXN — User (EL0) Execute Never.
- PXN — Privileged Execute Never (EL3'te /
HCR_EL2.E2H==0olan EL2'de XN denir).
Linux, user page'lerini PXN=1, UXN=0 ile map'ler: userspace bunları execute edebilir, ama böyle bir page'den privileged (EL1) bir instruction fetch yasaktır ve bir permission fault alır. Bir upper-level descriptor'daki hiyerarşik bir PXNTable bit'i, altındaki her şeye PXN'i zorlayabilir. Invariant şu: kernel, userspace'in yazabildiği memory'yi asla execute edemez, dolayısıyla bir user payload'ını gösteren yönlendirilmiş bir kernel PC, onu çalıştırmak yerine fault verir.
ret2dir'in yazarları ilişkiyi doğrudan çerçeveler: PXN "SMEP'e eşdeğer"dir ve SMEP, "KERNEXEC'e benzer" (PaX) bir koruma sağlar — aynı W-from-the-other-ring garantisi için üç isim.
Walkthrough¶
PXN, kernel bit'i set ettikten sonra MMU tarafından zorlanır; onu config ve davranış üzerinden gözlemlersin.
1. Yürürlükte olduğunu doğrula. AArch64 Linux'ta PXN, standart memory mapping'in bir parçası olarak user page'lerini non-privileged-executable yapmak için kullanılır; user mapping'leri PXN set'li taşır:
# user code is mapped EL0-executable, EL1-non-executable:
# PTE: UXN=0 (EL0 may exec), PXN=1 (EL1 may NOT exec)
2. Bir ret2usr denemesinin fault verdiğini gözlemle. Kernel PC'sini bir userspace adresine (örn. mmap'lenmiş bir shellcode page'i) set eden bir control-flow hijack, attacker'ın user-mapped code'unu kernel hakları ile execute etmek yerine, PXN=1 bir page'den bir EL1 instruction-fetch'i tetikler → permission fault / kernel oops.
3. AArch32 uyarısına dikkat et. 32-bit ARM'da PXN, LPAE modunu gerektirir (ki bu, legacy MMU domain'lerini disable eder); ret2usr savunması olarak PXN, öncelikle bir AArch64 mekanizmasıdır.
Execution'ı durdurur, data istismarını değil
PXN, user memory'yi execute etmeyi block eder; kernel'ın user data'sını okuma ya da yazmasını durdurmaz — bu PAN'in rolüdür. Data-only saldırıları ve kernel-mapped memory'de stage'lenmiş payload'lar (örn. physmap), ret2dir'in SMEP'i yendiği gibi PXN'i de yener.
Mitigation¶
(Residual risk / bypass.) SMEP gibi PXN de ret2dir / physmap spraying (payload'un kernel-mapped bir kopyasını execute etmek) ile, tamamen kernel text içindeki ROP/JOP ile ve user page'lerini hiç execute etmeye ihtiyaç duymayan data-only saldırılarla bypass edilir.
References¶
- Arm. Learn the architecture — AArch64 memory model (PXN/UXN). — https://developer.arm.com/documentation/102376/latest/
- Kemerlis, Polychronakis, Keromytis. ret2dir: Rethinking Kernel Isolation. USENIX Security 2014. — https://cs.brown.edu/~vpk/papers/ret2dir.sec14.pdf