Examining Pointer Authentication on the iPhone XS (kernel PAC bypasses / brute-force)¶
Brandon Azad'ın Apple A12 PAC implementasyonuna dair Project Zero analizi; arbitrary bir kernel R/W primitive'inin A-key PAC signature'larını nasıl forge edebileceğini (ve naive PAC'ın neden brute-force edilebilir olduğunu) gösterir.
Mechanism¶
Bug class / invariant
ARM Pointer Authentication (PAC), pointer'ları kullanılmayan high bit'lerde saklanan keyed bir MAC (PAC) ile imzalar; CPU bir pointer'ı kullanmadan önce PAC'ı doğrular, yani bozulmuş bir pointer authentication'da başarısız olur. PAC'ın garanti etmesi beklenen invariant: bir attacker, meşru şekilde elde etmediği validly-signed bir pointer üretemez. Azad'ın araştırması Apple'ın A12 hardening'ini inceledi ve attacker'ın hâlihazırda bir kernel read/write primitive'i varken bu sınırın aşılabileceğini gösterdi: CPU'nun kendi signing operasyonlarını (signing gadget'ları) yeniden kullanarak ya da signed pointer'ları okuyup/replay ederek, bir attacker JOP üzerinden kernel code çalıştırmaya yetecek kadar A-key signature'larını forge edebilir. Ayrıca PAC field'ı küçük olduğunda, başarısız bir authentication gözlemlenebilir olduğu için naive PAC brute-force edilebilir. Sonuç: PAC çıtayı yükseltir ama kernel R/W var olduğunda tam bir savunma değildir.
Walkthrough¶
Üst seviye, kavramsal (public Project Zero yazısından):
- Mevcut bir kernel read/write primitive'inden başla (ayrı bir memory-corruption bug'ından).
- Belirli kernel code path'lerinin A key'leriyle pointer imzaladığını gözlemle (signing gadget'ları).
- Attacker-seçimli bir değer için validly-signed bir pointer elde etmek üzere bu operasyonları zorla ya da yeniden kullan (key'i bilmeden PAC'ı forge ederek).
- Forge edilmiş, signed pointer'ları PAC check'lerini geçen bir JOP chain'i kurmak için kullan.
- Kernel'de arbitrary code çalıştır. (Azad bu tekniklerin çoğunlukla iOS 12.1.3'te düzeltildiğini bildirdi.) Tamamlayıcı brute-force açısı, PAC kısa olduğunda gözlemlenebilir auth-failure davranışını exploit eder.
Warning
Bu, turnkey bir exploit değil, PAC bypass sınıflarını gösteren bir araştırmadır. Önceden var olan bir kernel R/W primitive'ini varsayar ve Apple'ın sonradan hardening yaptığı, A12-dönemine özgü davranışı hedef alır.
Detection¶
- Apple platformlarında savunma öncelikle preventive'dir (hardware + signed boot); host-seviyesi tespit sınırlıdır. PAC/auth failure'larına atıf yapan beklenmedik kernel panic'leri brute-force ya da forgery denemelerine işaret edebilir.
- Cihazları güncel OS versiyonlarını raporlayacak/attest edecek durumda tut; güncel olmayan cihazlar maruziyettir.
Mitigation¶
- Patch: belirli signing-gadget/forgery teknikleri iOS update'lerinde (12.1.3'ten itibaren) ele alındı; cihazları güncel tut.
- Mimari hardening: daha büyük PAC field'ları, çeşitlendirilmiş key'ler/context'ler ve gadget azaltma; kernel R/W'nin weaponize edilmesini zorlaştırmak için CTRR ve PPL ile birlikte kullan.
- PAC'ı tek bir bariyer değil, ARM Pointer Authentication tabanlı defense-in-depth'in bir katmanı olarak ele al.