StickyTags: Efficient and Deterministic Spatial Memory Error Mitigation¶
ARM MTE'yi kalıcı, per-size-class tag'lerle kullanan bir VUSec tasarımı; öyle ki komşu object'ler her zaman farklıdır — probabilistic MTE'yi, bounded buffer overflow'ların deterministic tespitine, düşük overhead ile çevirir.
Mechanism¶
Invariant: komşu object slot'ları farklı MTE tag'leri taşır, dolayısıyla bounded bir over/underflow her zaman bir tag-check fault'unu tetikler
ARM Memory Tagging Extension (MTE), pointer top-byte'ında ve per-16-byte-granule memory metadata'sında 4-bit'lik bir tag saklar; pointer tag ≠ memory tag ise bir load/store fault eder (bkz. memory-tagging-extension, mte-as-implemented). Geleneksel MTE allocator'ları (Scudo, MemTagSanitizer) allocation başına random tag seçer; bu da yalnızca ~1/16 probabilistic tespit verir ve her alloc/free'de bir re-tagging maliyeti öder.
StickyTags (Gorter, Kroes, Bos, Giuffrida — VUSec), garantiyi bounded spatial error'lar için deterministic yapar. Heap'i ve stack'i size-class region'lara organize eder ve bir region'ın slot'ları arasında sabit, tekrar eden bir tag pattern'i (round-robin) uygular. Proje sayfasına göre, "memory'yi bir object slot'unun ilk kullanımında tag'ler ve tag'in farklı object'lerin ömürleri boyunca kalıcı olmasına izin verir," çünkü "object'ler her zaman aynı slot size'ını kullanır, dolayısıyla bir region'daki tag layout'u sabittir."
Ortaya çıkan invariant: komşu slot'ların her zaman farklı tag'leri vardır. Yani bir komşuya geçen contiguous bir overflow (ya da underflow) hemen bir tag mismatch'e tosar ve fault eder — probabilistic olarak değil, deterministic olarak, "tag sayısı çarpı slot size ile bounded." Tag layout'u sabit olduğu ve tag'ler her allocation'da yeniden atılmadığı için, pahalı per-alloc retagging'den kaçınılır.
Walkthrough¶
Üst düzey çalışma, kamuya açık makale/proje materyalinden:
- Size-class layout. Allocation'lar her slot'un aynı size class olduğu region'lara yönlendirilir (yaygın bir allocator yapısı). Stack de benzer şekilde size class'a göre bölümlenir.
- Kalıcı (sticky) tagging. Her slot'un granule'leri bir kez, slot ilk kullanıldığında tag'lenir; ardışık slot'lar farklı olsun diye deterministic bir pattern izlenir. Tag "yapışır" ve o slot'taki o size class'ın gelecekteki object'leri tarafından yeniden kullanılır — free/realloc'ta retag yok.
- Pointer tagging. Verilen pointer'lar slot'un tag'ini top byte'larında taşır; in-bounds erişimler eşleşir, dolayısıyla native MTE hızında çalışırlar.
- Deterministic spatial yakalama. Bir linear over/underflow object'in slot'undan çıkar ve construction gereği tag'i farklı olan komşu bir slot'a iner → hardware tag-check fault.
Bir Google Pixel 8 Pro üzerinde raporlanan overhead (SPEC CPU2006): heap ~%3.1 (Scudo ~%5.8'e karşı), stack ~%1.2 (MemTagSanitizer ~%15.2'ye karşı), kombine ~%4.0 (~%20.2'ye karşı) — ve önceki bir probabilistic-MTE değerlendirmesindeki 8 spatial CVE'den 7'sini tamamen mitigate etti. IEEE S&P 2024'te yayımlandı.
Spectre-MTE: random tagging speculative probing ile yenilebilir
İkinci bir katkı, yalnızca bir savunma değil, bir saldırı motivasyonudur. Yazarlar random-tagging MTE'nin sanıldığından zayıf olduğunu gösterir: bir saldırgan contention-based / speculative side channel'lar üzerinden "bir tag check'in bir ihlalle sonuçlanıp sonuçlanmadığını çıkarsayabilir," tag'leri leak eder ve Scudo / MemTagSanitizer'ın 1/16 probabilistic modelini zayıflatır. StickyTags'in deterministic komşuluk garantisi buna yanıttır — saldırganın prob edip öğreneceği per-object random bir tag yoktur.
Bir saldırganın StickyTags'e karşı ne yapması gerekir
- Komşu-olmayan / unbounded sıçramalar: komşu (farklı-tag'li) slot'u atlayıp bir same-tag region'a ulaşan bir write spatial check'ten kaçabilir — dolayısıyla coverage "tag sayısı × slot size ile bounded"dır, sınırsız aralık değil.
- Intra-object overflow'lar: bir object'in slot'unun içinde kalan corruption bir spatial komşu geçişi değildir ve yakalanmaz.
- Tag side-channel'ları: layout deterministic olduğu için saldırgan onu prob etmekten bir şey kazanmaz; random MTE'yi kıran speculative-probing zayıflığı uygulanmaz.
Detection¶
MTE'nin devrede olduğunu ve tag-check fault'larının yüzeye çıktığını doğrula
- Hardware/OS desteği: StickyTags, MTE etkin ARMv8.5 MTE-yetenekli silicon gerektirir (örn. Pixel 8/8 Pro sınıfı).
HWCAP2_MTE'yi ve allocator/runtime'ın synchronous (ya da asymmetric) tag checking istediğini doğrula — kesin, anlık fault'ları veren synchronous mode'dur. - Fault telemetry: MTE ihlalleri
SEGV_MTESERR(sync) /SEGV_MTEAERR(async) ile birSIGSEGVolarak teslim edilen bir tag-check fault'u kaldırır. Hardened bir binary'den bunları yakalayan crash-reporting / EDR, doğrudan bir out-of-bounds tespit sinyalidir —si_codeile sıradan segfault'lardan ayırt et. - Build attestation: binary'lerin stok bir random-tagging MTE allocator'ı yerine StickyTags allocator + MTE instrumentation'ına (GitHub'daki araştırma prototipi) karşı compile/link edildiğini doğrula, çünkü deterministic özellik tek başına MTE'den değil layout'tan gelir.
Mitigation¶
Deterministic-tag spatial koruma dağıtmak ve sınırları
- MTE hardware'inde etkinleştir: güvenlik-kritik process'ler için deterministic / size-class-region tagging allocator'ı (StickyTags tarzı) artı synchronous mode'da MTE benimse; async mode kesinliği hıza takas eder. OS allocator'ının MTE desteğiyle eşle.
- Neden random yerine deterministic tagging tercih edilir: random per-alloc MTE yalnızca probabilistic'tir ve makaleye göre speculative probing ile öğrenilebilir; deterministic komşuluk her iki zayıflığı da kaldırırken overhead'i SPEC CPU2006'da ≤ ~%4 tutar.
- Katmanları birleştir: StickyTags spatial (bounded over/underflow) error'larını ele alır. use-after-free (
use-after-free) için temporal-safety önlemleri (allocator quarantine, init-on-free), artı stack canaries (stack-canaries) ve daha geniş MTE ailesi (arm-memory-tagging-extension,mte-as-implemented) ekle. - Bilinen uyarılar: coverage bounded'dır (yeterince büyük bir atlama bir same-tag region'a ulaşabilir — bkz. Walkthrough); intra-object overflow'lar yakalanmaz; MTE-yetenekli hardware'e ve doğru synchronous-check configuration'ına bağlıdır. StickyTags bir araştırma prototipidir, shipping bir OS default'u değil.