Skip to content

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