PACMAN (speculative PAC oracle)¶
ARM Pointer Authentication'ı brute-force edilebilir bir oracle'a çevir: tahmin edilen PAC değerlerini speculatively doğrula, böylece yanlış tahminler asla crash etmesin, ve doğrulama sonucunu bir microarchitectural side channel (TLB Prime+Probe) üzerinden oku — PAC'ın Apple M1'de control-flow hijacking'e karşı son hat rolünü etkisiz kıl.
Mechanism¶
Neden çalışır
ARM Pointer Authentication (PAC) kriptografik bir imzayı (PAC) bir pointer'ın
kullanılmayan üst bit'lerinde saklar. aut* instruction PAC'ı yeniden hesaplar
ve eşleşmezse fault verir, dolayısıyla sahte bir pointer normalde programı
crash ettirir — 16-bit PAC'ı brute force etmeyi zorlaştıran şey tam da budur:
her yanlış tahmin gürültülü ve ölümcüldür.
PACMAN doğrulamayı speculatively yaparak crash'leri ortadan kaldırır:
- PACMAN gadget:
if (cond) { verified = aut(guess_ptr); load(verified); }biçiminde bir kod deseni. Attackercond'u (gadget'ı tetikleyen) veguess_ptr'i (mevcut bir memory read/write bug üzerinden) kontrol eder. - Crash yok:
autve ona bağlıloadbir mispredicted / speculative yolda gerçekleşir. Tahmin edilen PAC yanlışsa fault squash edilir ve asla architectural hale gelmez — yani program crash etmez ve attacker her değeri deneyebilir. - Oracle / decode: doğru vs. yanlış PAC tahminleri farklı
microarchitectural ayak izleri bırakır. PACMAN bunları TLB üzerinde
Prime+Probe ile okur: bir TLB set'ini bir eviction set ile prime'la,
gadget'ı tetikle, sonra probe et — doğru bir PAC, speculative
load'un yürütülüp bir entry'yi evict etmesine izin verir ki bu bir timing değişimi olarak gözlemlenebilir.
M1 PAC'ı 16 bit olduğundan, crash'ler bastırıldığında tüm değerleri tek tek denemek ucuzdur — paper geçerli bir PAC bulmayı ortalama yaklaşık 2.94 dakika olarak tahmin eder. PACMAN "pointer authentication kullanarak korunan bir platformda control-flow hijacking saldırıları yürütmenin önündeki birincil engeli kaldırır" ve altta yatan microarchitectural davranış software'de yamalanamaz.
Walkthrough¶
PACMAN, bir memory-corruption bug'ını (tahmin edilen pointer'ı yerleştirmek için) bir speculative PAC oracle ile birleştirir.
// Conceptual PACMAN oracle. cond is mistrained to be speculatively-taken;
// the architectural path keeps cond false so no real fault commits.
// guess_ptr carries the attacker's candidate PAC in the high bits.
if (cond) { // speculated TRUE, architecturally FALSE
void *verified = aut(guess_ptr, ctx); // speculative PAC check
(void)*verified; // speculative load -> touches TLB iff PAC ok
}
Gadget etrafındaki Prime+Probe oracle:
1. PRIME fill a target TLB set with a known eviction set
2. TRIGGER invoke the PACMAN gadget with a candidate PAC guess
3. PROBE time the eviction set:
- an entry was evicted -> speculative load ran -> PAC GUESS CORRECT
- no eviction -> PAC guess incorrect
4. repeat over all 2^16 candidate PACs -> recover the valid PAC, no crashes
Apple M1'de brute-force maliyeti:
PAC size 16 bits (2^16 candidate values)
crash on wrong guess none (suppressed via speculative execution)
avg time to forge ~2.94 minutes
Warning
PACMAN tek başına bir remote exploit değildir. Victim'de mevcut bir memory-corruption güvenlik açığını ve kullanılabilir bir PACMAN gadget'ını önkoşul olarak varsayar; o bug'ın pointer authentication'ı bypass etmesine izin veren eksik parçayı — crash etmeden geçerli bir PAC forge etmeyi — sağlar. PoC'ler Apple M1'de farklı ayrıcalık seviyelerinde gösterildi.
Mitigation¶
- Alttaki memory-safety bug'ını düzelt: PACMAN'in çalışmak için bir memory read/write primitive'ine ihtiyacı vardır; onu ortadan kaldırmak saldırıyı yok eder.
- PACMAN gadget'larından kaçın: değerini bir attacker'ın etkileyebileceği bir pointer'ı speculatively authenticate-edip-dereference etme; PAC ile doğrulanmış pointer'lara speculation barrier ekle.
- PAC-check sonucunun microarchitectural state üzerinden sızmasını önleyen hardware/firmware speculation kontrolleri.