Skip to content

PARTS: Pointer Integrity using ARM Pointer Authentication

Code ve data pointer'larını, PAC modifier'ı olarak pointer'ın static type'ını kullanarak ARM Pointer Authentication ile imzalayan LLVM tabanlı bir runtime-safety framework'ü ("PAC it up"); böylece imzalanmış bir pointer yalnızca kendi doğru type'ı olarak kullanılabilir.

Mechanism

Neden çalışır

ARMv8.3-A Pointer Authentication, bir pointer'ı bir key ve bir modifier ile imzalayabilir ve değer ile oynanmışsa kullanımda fault verir. Naif kullanıldığında her pointer tek bir modifier paylaşır, dolayısıyla saldırgan bir imzalanmış pointer'ı bir başkasıyla swap edebilir. PARTS, modifier'ı dikkatlice seçerek imzalanmış bir pointer'ın ne olmasına izin verildiğini daraltır.

PARTS, PA modifier'ı olarak bir type-ID kullanır: pointer imzalanırken pointer'ın static type'ı (LLVM ElementType) modifier'ın içine hash'lenir. Invariant şu hale gelir: type T için imzalanmış bir pointer yalnızca type T olarak authenticate olur. Bu, bir tür pointer integrity sağlar:

  • Code pointer'ları (function pointer'ları, return address'leri) imzalanır; böylece forward- ve backward-edge control flow yalnızca amaçlanan türde pointer'ı hedefleyebilir — ROP/JOP'a karşı çıtayı yükseltir.
  • Data pointer'ları type-ID'leri ile imzalanır; böylece saldırgan bir type'taki pointer'ı bir başkasının yerine koyamaz, type-confusion'ı ve belirli memory-corruption pivot'larını köreltir.

Type modifier'ın içine gömülü olduğu için, geçerli şekilde imzalanmış bir struct A *'yı alıp bir struct B *'nin beklendiği yere yazmak AUTIA'da başarısız olur — yeniden hesaplanan modifier farklıdır — her ikisi de aynı address space'e işaret etse bile.

Walkthrough

Yüksek seviyeli; makaleden. PARTS, pointer'ların store/load edildiği yerlerde PA instruction'ları emit eden bir compiler pass'i artı runtime'dır.

1. Tanımda imzala. Type T'li bir pointer üretildiğinde, onu type'tan türetilen modifier ile imzala:

; x_mod = type_id(T)
PACIA  x_ptr, x_mod        ; bind signature to this pointer's type

2. Kullanımda authenticate et. Dereference veya indirect branch'ten önce, aynı type-ID'ye karşı doğrula:

AUTIA  x_ptr, x_mod        ; wrong type / tampered -> poisoned pointer -> fault

3. Type-mismatch substitution başarısız olur. Bir type olarak imzalanmış bir pointer, başka bir type'ın modifier'ı altında authenticate edilemez; dolayısıyla cross-type reuse sessizce dereference edilmek yerine kriptografik olarak reddedilir.

Type-ID vs. sade PAC

Sade pac-ret, return address'leri stack pointer gibi bir context ile imzalar. PARTS bunu tüm korunan pointer'lara genelleştirir ve modifier'a semantik anlam (type) taşıtır; böylece savunma data pointer'larını kapsar ve hangi imzalanmış değerlerin birbirinin yerine geçebileceğini sınırlar.

Detection

  • Dereference veya indirect-call site'larında PAC authentication fault'ları, type'ı eşleşmeyen veya ile oynanmış bir pointer'a işaret eder — yani seal tarafından yakalanan bir exploitation denemesi; poison'lanmış pointer'dan SIGSEGV/SIGILL olarak gözlemlenir.
  • Indirect call'larda veya belirli data-structure erişimlerinde crash kümelenmesi, control-flow hijack veya type-confusion denemelerine işaret eder.
  • Korumalı bir binary'nin tekrarlanan yoklama crash'leri, saldırganın imzalamayı yenmeden önce bir signing oracle avladığına işaret edebilir.

Mitigation

PARTS'ın kendisi zaten hardening'dir — type'a bağlı pointer integrity eklemek için ARMv8.3-A+ PA hardware üzerinde PARTS LLVM toolchain'i ile derleyin.

  • En güçlü kapsama için hem code- hem data-pointer korumasını etkinleştirin; bildirilen overhead makuldür (makalenin değerlendirmesinde yüzde birkaç mertebesinde).
  • Tamamlayıcı savunmalarla birleştir. Landing-pad enforcement için BTI ile ve PACStack gibi zincirlenmiş bir backward edge ile eşleştirin; en sıkı pointer başına binding için PACTight'a bakın.

Bilinen uyarılar

Type-ID modifier'ları hâlâ aynı type içinde reuse'a izin verir — aynı type'tan iki pointer bir modifier paylaşır ve swap edilebilir. PARTS, konuma veya nesne kimliğine bağlanmaz (o boşluğu PACTight ele alır). Güvenlik PA-key gizliliğine bağlıdır; speculative forgery (PACMAN) ve artakalan signing gadget'ları (PAC signing-gadget bypass) artık risk olarak kalır.

References