Pointer Authentication (PAC)¶
ARMv8.3-A Pointer Authentication, pointer'ları kullanılmayan üst bitlerinde saklanan key'li kriptografik bir MAC ile imzalar; böylece ile oynanmış code veya data pointer'ları kullanılmadan önce authentication'da başarısız olur — ROP/JOP ve pointer-corruption saldırılarına karşı çıtayı yükseltir.
Mechanism¶
Kapsam farkı
Bu not generic ARMv8.3-A mimarisini ele alır (QARMA cipher, ARMv8.6 FPAC, PACStack/PARTS/PACtight hardened şemaları). Apple'ın platforma özgü sertleştirilmiş arm64e konuşlandırması — per-boot key re-randomization ve Project Zero iPhone XS pipeline analizi — için bkz. PAC (arm64e Pointer Authentication).
Sınır neden tutuyor
64-bit bir virtual address bitlerinin yalnızca bir alt kümesini kullanır ve her
pointer'ın tepesinde boş bir alan bırakır. PAC o alanı bir Pointer
Authentication Code ile doldurur: secret 128-bit bir key ile key'lenmiş,
hafif tweakable bir cipher (QARMA) kullanılarak (pointer value, 64-bit
context/modifier) üzerinde hesaplanan kesilmiş bir MAC.
Mimari beş key sağlar — instruction/code pointer'ları için iki tane (APIAKey,
APIBKey), data pointer'ları için iki tane (APDAKey, APDBKey) ve bir general
key (APGAKey). Bir sign instruction'ı (PACIA, PACIB, PACDA, …) PAC'i
ekler; bir authenticate instruction'ı (AUTIA, AUTIB, …) onu yeniden hesaplar
ve kontrol eder, başarıda kullanılabilir bir pointer'ı geri yükler veya başarısızlıkta
onu poison'lar (böylece sonraki bir dereference fault verir). XPAC* bir PAC'i
kontrol etmeden çıkarır.
Sınır tutar çünkü korunan bir pointer'ı bozan bir saldırgan, secret key olmadan yeni değer için geçerli bir PAC üretemez. Context/modifier her PAC'i bir kullanım site'ına bağlar (örn. bir return address için stack-pointer değeri); geçerli şekilde imzalanmış bir pointer'ın farklı bir slot'a replay edilmesini engeller. Bu, forward-edge (indirect call/branch) ve backward-edge (return address) integrity'sini ucuza, hardware'de verir. Temel kayıt için ARM Pointer Authentication'a ve Apple'ın hardened konuşlandırması için examining PAC on the iPhone XS'e bakın.
Walkthrough¶
Yüksek seviyeli, kavramsal (ARM/Qualcomm belgelerinden ve herkese açık araştırmalardan):
- Üretimde imzala. Function girişinde compiler
PACIASPemit eder (LR'deki return address'i context olarak SP ile imzala); imzalanmış bir code pointer için uygun bir modifier ile birPAC*emit eder. - Store/transit. İmzalanmış pointer, PAC'i üst bitlerinde olacak şekilde bellekte yaşar.
- Kullanımda authenticate et. Bir return (
RETAA/RETAB) veya indirect branch (BRAA/BLRAA) öncesinde CPU authenticate eder; bir uyumsuzluk pointer'ı poison'lar ve sonraki fetch fault verir. - Apple hardening'i (A12+). Exception level başına farklı key'ler (EL0 vs EL1);
böylece userspace kernel-imzalı pointer'ları forge edemez; key'ler çeşitlendirilir ve
hardware-managed register'larda tutulur;
SCTLR_EL1'de key başına enable bitleri.
Sign / authenticate taslağı
Yalnızca kavramsal — key materyali, gadget chain'leri veya offset'ler verilmez.Bilinen bypass sınıfları
PAC eksiksiz bir CFI değildir. Herkese açık araştırmalar şunları gösterir:
signing gadget/oracle'lar (victim'i saldırgan-seçimi bir pointer imzalamaya
zorlama, örn. tarihsel AUTIA→PACIZA dizisi) — bkz.
PAC signing-oracle reuse;
PAC-verification sonuçlarını leak eden PACMAN speculative side channel'ı — bkz.
PACMAN;
yeniden denemelerin ucuz olduğu yerde küçük PAC alanının brute force'u; ve
context'ler benzersiz olmadığında cross-key / cross-context reuse. Hardened
şemalar (PACStack, PARTS, PACtight), replay boşluklarını kapatmak için context
seçimini sıkılaştırır.
Detection¶
- Tekrarlanan PAC-failure fault'ları (poison'lanmış-pointer dereference abort'ları,
ARMv8.6 fault-on-fail'de
FPACtrap'leri) güçlü bir tamper / exploitation sinyalidir — sessizce kurtulmak yerine onları crash telemetrisinde yüzeye çıkarın. - Poison'lanmış-pointer imzalarına sahip process crash patlamaları PAC brute-force'una işaret edebilir.
- Apple platformlarında, authentication başarısızlıklarına atıf yapan kernel panic'leri.
Mitigation¶
- Return address'leri ve code pointer'larını imzalayan bir toolchain ile PAC
konuşlandırın (
-mbranch-protection=pac-ret/standard; tam PACBTI için BTI ile birleştirin). Replay'i önlemek için context'leri pointer sınıfı/site başına benzersiz tutun. - Fault-on-authentication'ı (ARMv8.6 FPAC) benimseyin; böylece forge edilmiş bir pointer, daha sonraki, saldırganın etkilediği bir dereference yerine AUT* instruction'ında fault verir.
- Key maruziyetini sınırlamak için EL başına / process başına key çeşitlendirmesi (Apple'ın yaptığı gibi).
- Uyarılar: PAC, hem keyfi bellek erişimine hem de kullanılabilir bir signing gadget'a veya speculation oracle'ına sahip bir saldırganı durduramaz; onu MTE, CFI ve shadow stack'lerin yanında bir katman olarak ele alın.