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:
2. Kullanımda authenticate et. Dereference veya indirect branch'ten önce, aynı type-ID'ye karşı doğrula:
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/SIGILLolarak 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¶
- Liljestrand, Nyman, Wang, Perez, Ekberg, Asokan. PAC it up: Towards Pointer Integrity using ARM Pointer Authentication. USENIX Security 2019. — https://www.usenix.org/conference/usenixsecurity19/presentation/liljestrand
- PARTS / PAC it up paper (preprint, arXiv:1811.09189). — https://arxiv.org/abs/1811.09189
- Project page. — https://pointer-authentication.github.io/