Skip to content

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. PAC instruction'ı, 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