ARM PACBTI (combined PAC + BTI)¶
Pointer Authentication'ı (return address'leri sign'lar) Branch Target Identification (landing pad'ler) ile birleştiren, Cortex-M için Armv8.1-M extension'ı; microcontroller'larda ROP ve JOP'u birlikte mitige eder.
Mechanism¶
Neden çalışır
ROP, return address'leri corrupt eder; JOP, indirect-branch target'larını corrupt eder. PACBTI, iki AArch64-tarzı savunmayı M-class mimarisine getirerek Armv8.1-M (Cortex-M) profilinde her ikisine de değinir:
- PAC yarısı return address'i sign'lar.
PACinstruction'ı, bir secret ile keyed ve stack pointer ile tweak'lenmiş bir cryptographic signature'ı değer (LR) üzerinden hesaplar; 32-bit PAC, spare pointer bit'leri yerine ayrı bir GPR'da (R12) tutulur (M-profile pointer'larının spare top bit'i yoktur).AUT, değer kullanılmadan önce yeniden doğrular. - BTI yarısı, indirect-branch hedeflerinin landing-pad instruction'ları olmasını gerektirir, tam olarak AArch64'teki gibi — function ortasına gadget girişini block eder.
İlgili instruction'lar (Arm'a göre): PAC/AUT (LR'ı SP modifier'ı ile
sign/authenticate), PACG/AUTG (genel GPR signing), BXAUT (authentication'lı
indirect branch), BTI ve combined PACBTI. Encoding'ler NOP space'te oturur,
dolayısıyla eski M-core'lar bunları NOP olarak execute eder (binary compatibility).
Key'ler 128-bit'tir (PAC_KEY_P/PAC_KEY_U, secure/non-secure _S/_NS
varyantlarıyla); CONTROL.PAC_EN ve CONTROL.BTI_EN üzerinden enable edilir. İlk
core'lar: Cortex-M85 ve Cortex-M52.
Invariant şu: corrupt edilmiş bir return address AUT'u fail eder ve corrupt
edilmiş bir indirect target bir pad'in dışına land olur — her iki path de control'ü
yönlendirmek yerine fault verir.
Walkthrough¶
1. Combined branch protection ile build et.
$ arm-none-eabi-gcc -mcpu=cortex-m85 -mbranch-protection=standard -c f.c
# GCC: 'standard' "turns on all types of branch protection features"
# (equivalent to pac-ret + bti for the profile)
2. Korunan bir function, entry'de LR'ı sign'lar, exit'te authenticate eder.
foo:
pac r12, lr, sp ; sign LR (PAC -> R12)
push {r4, lr}
...
pop {r4, lr}
aut r12, lr, sp ; verify; corrupted LR -> fault
bx lr
3. Bir ROP denemesinde fault'u gözlemle. Stack'teki kayıtlı return address'i
overwrite edip epilogue'un AUT'u çalıştırmasına izin vermek, attacker gadget'ına
dönmek yerine başarısız bir authentication üretir: "an INVSTATE UsageFault exception is
generated."
Microcontroller-scoped
PACBTI, AArch64 PAC + BTI'nın M-profile (Armv8.1-M) karşılığıdır; embedded/IoT firmware'i hedef alır. Oradaki PAC, bir register'da 32-bit bir tag'tir, dolayısıyla brute-force surface'i 64-bit-pointer AArch64 durumundan farklıdır.
Mitigation¶
(Residual risk.) AArch64 bileşenleri gibi: BTI coarse'tur (herhangi bir geçerli pad ulaşılabilir) ve attacker-controlled data herhangi bir noktada sign edilip sonucu gözlemlenirse PAC, signing oracle'lar üzerinden saldırıya uğrayabilir; PACBTI, CFI'yı garanti etmekten ziyade çıtayı yükseltir.
References¶
- Arm Community. Armv8.1-M Pointer Authentication and Branch Target Identification Extension. — https://developer.arm.com/community/arm-community-blogs/b/architectures-and-processors-blog/posts/armv8-1-m-pointer-authentication-and-branch-target-identification-extension
- Arm. Introducing Cortex-M52. — https://developer.arm.com/community/arm-community-blogs/b/internet-of-things-blog/posts/introducing-cortex-m52