PACTight: Tightly Seal Your Sensitive Pointers with PAC¶
Her hassas pointer'ı benzersiz, konuma özgü bir modifier'a bağlayan PAC tabanlı bir şema; böylece pointer forge edilemez, kopyalanamaz ve dangling olamaz hale gelir — yalnızca type ile imzalamanın bıraktığı PAC-reuse/replay boşluğunu kapatır.
Mechanism¶
Neden çalışır
Sade PAC imzalama ve type tabanlı şemalar (PARTS), aynı type'a sahip birçok pointer için aynı modifier'ı reuse eder. Bu reuse, saldırganın yakaladığı imzalanmış bir pointer'ı replay etmesine veya onu aynı type'tan başka bir slot'a kopyalamasına izin verir. PACTight, her korunan pointer'a güçlü, benzersiz bir modifier vererek reuse'u kaldırır.
Modifier, imzayı saldırganın serbestçe yeniden üretemeyeceği iki şeye bağlar:
- nesneye göre key'lenen bir yan metadata table'da tutulan bir pointer başına rastgele unique ID ve
- pointer'ın bulunduğu storage address.
Bunlardan, PACTight bir hassas pointer üzerinde üç özellik uygular:
- Forge edilemez — secret key ve doğru modifier olmadan geçerli bir PAC üretilemez.
- Kopyalanamaz — storage address modifier'ın bir parçası olduğu için, slot A'da imzalanmış bir pointer slot B'ye taşınırsa authentication'da başarısız olur; saldırgan imzalanmış bir pointer'ı başka yere transplant edemez.
- Dangling olamaz — unique ID, nesne free edildiğinde geçersiz kılınan metadata'da yaşar; bu yüzden reclaim edilmiş belleğe işaret eden bayat bir pointer artık authenticate olmaz — korunan pointer'lar üzerindeki use-after-free'i ele alır.
Bunlar birlikte modifier'ı replay edilemez kılar: her (location, identity)
çifti ayrıdır, dolayısıyla PAC'ler slot'lar arası veya nesne ömürleri arası
reuse edilemez.
Walkthrough¶
Yüksek seviyeli; makalenin instrumentation'ından. PACTight korumayı dört seviyede otomatikleştirir ve gerçek ARM PA instruction'ları kullanır.
1. Store'da imzala. Bir hassas pointer yazıldığında, unique ID'sini ara/tahsis
et, modifier'ı (unique_id, storage_address)'ten türet ve imzala:
; modifier = combine(unique_id_from_metadata, &slot)
PACIA x_ptr, x_modifier ; seal pointer to this identity + location
2. Kullanımda authenticate et. Dereference veya indirect branch'ten önce, modifier'ı mevcut slot ve metadata'dan yeniden hesapla ve doğrula:
3. Dört koruma seviyesi. Instrumentation şunları kapsar: (a) forward-edge code pointer'ları / function pointer'ları, (b) backward-edge return address'leri, (c) C++ VTable pointer'ları ve (d) genel sensitive data pointer'ları.
Copy ve dangling neden ikisi de başarısız olur
Kopyalama storage_address'i değiştirir, bu yüzden yeniden hesaplanan modifier
artık seal edilmiş PAC ile eşleşmez. Nesneyi free etmek metadata girdisini
geçersiz kılar, bu yüzden kullanım anındaki unique-ID lookup'ı farklı (veya
eksik) bir değer verir — yine bir modifier uyumsuzluğu. İki kontrol için de yeni
bir signing oracle gerekmez.
Detection¶
- Forward edge'lerde, vtable dispatch'inde veya pointer dereference'lerinde
PAC authentication fault'ları copy/replay veya bayat-pointer kullanımına
işaret eder; poison'lanmış pointer'dan gelen
SIGSEGV/SIGILLolarak yüzeye çıkar. - C++ virtual-call site'larında veya free edilmiş nesne erişimlerinde crash kümelenmesi, seal tarafından yakalanan UAF/type-confusion exploitation denemelerine işaret eder.
- Metadata-table anormallikleri (free edilmiş ID'ler için lookup'lar), runtime'ın bunları açığa çıkardığı yerde bir host telemetri sinyali olarak instrument edilebilir.
Mitigation¶
PACTight'in kendisi zaten hardening'dir — hassas kodu ARMv8.3-A+ PA hardware üzerinde PACTight LLVM instrumentation'ı ile derleyin.
- Enforcement seviyesini riske göre seç. Dört seviyenin tümünü etkinleştirmek, mütevazı bir maliyetle en güçlü savunmayı verir (NGINX dahil 30 uygulamada bildirilen ortalama overhead ~%4.07).
- Tamamlayıcı savunmalarla birleştir. Indirect-branch landing pad'leri için BTI ile ve zincirlenmiş bir backward edge'in tercih edildiği yerde PACStack ile eşleştirin.
Bilinen uyarılar
Güvenlik hâlâ PA-key/secret gizliliğine ve metadata bütünlüğüne dayanır. PACMAN gibi speculative PAC-forgery saldırıları ve artakalan signing/verification gadget'ları (PAC signing-gadget bypass) artık risklerdir. Yalnızca compiler'ın sensitive olarak sınıflandırdığı pointer'lar seal edilir; korumasız data pointer'ları bozulabilir kalır.
References¶
- Ismail, Quach, Jelesnianski, Jang, Min. Tightly Seal Your Sensitive Pointers with PACTight. USENIX Security 2022. — https://www.usenix.org/conference/usenixsecurity22/presentation/ismail
- PACTight paper (preprint, arXiv:2203.15121). — https://arxiv.org/abs/2203.15121
- PACTight source code. — https://github.com/cosmoss-jigu/pactight