Skip to content

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:

  1. Forge edilemez — secret key ve doğru modifier olmadan geçerli bir PAC üretilemez.
  2. 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.
  3. 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:

AUTIA  x_ptr, x_modifier      ; fails if moved, replayed, or object freed

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/SIGILL olarak 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