PAN (Privileged Access Never) on Apple¶
Intel SMAP'ın ARM'daki hardware eşdeğeri: privileged (kernel/EL1) kodu user-accessible (EL0) belleğe dokunduğunda fault veren bir PSTATE biti; user kontrolündeki buffer'lar üzerinden pivot yapan kernel exploit'leri köreltmek için Apple A10 ve sonrasında mevcuttur.
Mechanism¶
Neden çalışır
Birçok kernel exploit'i, privileged kodu saldırganın user space'te kontrol ettiği bir pointer'ı dereference etmeye kandırır — bir kernel bug'ını user'ın hazırladığı verinin veya yapıların çalıştırılmasına çevirir. PAN bu kestirme yolu kaldırır.
PAN, PSTATE.PAN biti tarafından yönetilir. Set olduğunda, architectural
permission kontrolü (AArch64.CheckPermission()), EL1'den EL0'da erişilebilir
bir virtual address'e yapılan herhangi bir privileged data erişimini bir
Permission fault olarak ele alır. Yani kernel artık user mode'un da
erişebildiği bir page'i sessizce okuyamaz veya yazamaz; sınırın karşısına veri
kopyalamayı niyetlendiği kısa pencere için PAN'i açıkça düşürmelidir.
Sınır tutar çünkü PAN, page-permission bitleri üzerinde hardware'de uygulanır ve
SMAP'in privileged-data karşılığıdır. Meşru
user/kernel veri transferi, PAN'i clear eden, kopyayı yapan ve geri yükleyen
denetlenmiş uaccess pencereleri (örn. copyin/copyout tarzı rutinler)
üzerinden yönlendirilir — böylece bu pencerelerin dışında bir EL0 page'ine
yapılan beklenmedik bir EL1 erişimi başarılı olmak yerine fault verir.
Walkthrough¶
Kavramsal; herkese açık ARM/Apple/Linux tariflerinden:
1. Kararlı durum — PAN set. Normal kernel kodu çalışırken PSTATE.PAN = 1. Bir user pointer'ın başıboş bir kernel dereference'i, saldırgan verisini okumak yerine fault verir.
2. Kontrollü geçiş. Bir copy primitive dar bir pencere açar:
; conceptual uaccess window
MSR PAN, #0 ; clear PAN: permit EL1 -> EL0 access
; ... bounded copyin/copyout ...
MSR PAN, #1 ; restore PAN
3. Execute-only boşluğu (bilinen bir bypass). PAN, data erişimini
permission'a göre kapılar, ancak Siguza analizi gösterir ki execute-only
(--x) user mapping'leri PAN'i tetiklemeden EL1'den hâlâ okunabilirdi — böyle
bir page'in privileged bir okuması fault vermez, dolayısıyla saldırgan kontrolü
atlatmak için veriyi execute-only user belleğine yerleştirebilir.
Kernel okumaları neden zayıf nokta
PAN, privileged erişimi user-reachability'ye göre kısıtlar, ama permission modeli her mapping türü için tüm kernel tarafı okumaları engellemez. Mitigation'lar arasındaki çatışmalar — burada execute-only memory vs. PAN — bir security özelliğinin bir diğerini zayıflattığı bir pencere yarattı.
Detection¶
- Kernel context'inde permission-fault panic'leri. Bir EL0 adresine yapılan bir EL1 erişiminde PAN kaynaklı bir fault (bir user VA ile kernel data-abort), kernel kodunun user kontrolündeki bir pointer'a yönlendirildiğinin güçlü bir sinyalidir — yani aktif bir kernel exploit denemesi.
- Panic-log / crash-report analizi. Apple platformlarında, fault veren adresi ve erişim türünü yakalayan kernel panic log'ları, savunucuların PAN ihlallerini sıradan fault'lardan ayırt etmesini sağlar.
- Anormal uaccess desenleri. Beklenmedik şekilde uzun veya sık PAN-clear pencereleri ya da PAN'in bilinen copy rutinlerinin dışında clear edilmesi, sınırla oynandığına işaret eder.
Mitigation¶
PAN'in kendisi zaten bir platform hardening'idir; savunucular için iş onu sağlam tutmaktır.
- PAN'i etkin ve pencereleri asgaride tut. Kernel kodunun PAN'i yalnızca denetlenmiş copy primitive'lerinin içinde clear edip hemen geri yüklediğinden emin olun; PAN'i asla saldırganın etkilediği işlemler boyunca clear bırakmayın.
- Execute-only boşluğunu kapat. Privileged kodun okuyabileceği user-map'lenebilir execute-only belleği önleyin veya dikkatlice sınırlayın; böyle mapping'leri bir PAN-bypass yüzeyi olarak ele alın.
- İlgili primitive'lerle katmanla. PAN, PXN tarzı user-page'lerini-execute-etmeme kontrolleri ve daha geniş Apple-silicon kümesi (KIP, PAC, Fast Permission Restrictions) ile eşleşir; böylece tek bir sınır başarısızlığı yeterli olmaz.
Bilinen uyarılar
PAN, data erişimini user-reachability'ye göre kısıtlar; kendi başına her privileged okumayı durdurmaz (tarihsel olarak özellikle execute-only mapping'ler) ve saldırgan zaten güvenilir kernel read/write'a sahip olduğunda hiçbir koruma sunmaz. O, birkaçından biri olan bir sınırdır, bağımsız bir savunma değil.
References¶
- Siguza. PAN. — https://blog.siguza.net/PAN/
- Apple. Apple Platform Security (operating-system integrity, Apple-silicon protections). — https://support.apple.com/guide/security/operating-system-integrity-sec8b776536b/web
- Linux kernel. arm64: Add support for Privileged Access Never. — https://lwn.net/Articles/651614/