Skip to content

Memory Tagging Extension (MTE)

Armv8.5-A kilit-ve-anahtar memory safety: belleğin her 16-byte granule'ü 4-bit'lik bir allocation tag taşır, her pointer top byte'ında eşleşen 4-bit'lik bir address tag taşır ve load/store'da bir tag mismatch fault'lar — use-after-free ve out-of-bounds erişimini probabilistik olarak yakalar.

Mechanism

Sınır neden tutar

MTE, spatial ve temporal memory-safety bug'larını donanımsal tag-check failure'larına çevirir. Mimari, uyuşması gereken iki tag tutar:

  • Address (pointer) tag — 64-bit'lik bir virtual address'in kullanılmayan top byte'ında taşınan 4-bit'lik bir değer (bit 59–56, Top-Byte-Ignore üzerine).
  • Allocation (memory) tag — tagged belleğin her aligned 16-byte granule'ü için out of band saklanan 4-bit'lik bir değer.

Her tag-checked load/store'da CPU, pointer'ın address tag'ini granule'ün allocation tag'iyle karşılaştırır. Eşleşme → erişim devam eder; mismatch → bir tag check fault. Bir allocator, bitişik allocation'lara farklı tag'ler verir (böylece bir linear overflow mismatch eden bir granule'e iner) ve free'de belleği re-tag eder (böylece free-edilip-yeniden-allocate-edilen belleğe ait bir dangling pointer eski tag'i taşır ve mismatch eder). Tespit probabilistik — kabaca 16'da 1'dir, çünkü yalnızca 16 tag değeri vardır; residual ~1/16 collision asıl uyarıdır.

Raporlamanın üç modu vardır: synchronous (fault tam fault'layan instruction'da iletilir, erişim bastırılır), asynchronous (fault flag'lenir ve sonra iletilir, erişim tamamlanır — daha ucuz, daha az precise) ve asymmetric (sync read'ler, async write'lar). MTE, PAC ve BTI ile birlikte çalışır — onların yerini almaz.

Walkthrough

Yüksek seviye, kamuya açık ARM/Linux dokümantasyonundan alınmıştır — çalışan bir exploit değil.

1. Bir bölgeyi tag'le. Allocator page'leri taggable işaretler ve tag atar:

mmap(..., PROT_READ|PROT_WRITE|PROT_MTE, ...)   ; make memory tag-checked
IRG   x0, x0          ; Insert Random tag into pointer's top byte
STG   x0, [x0]        ; STore allocation tag of the granule(s)
LDG   x1, [x0]        ; LoaD a granule's tag (e.g. to compare)

2. Pointer ve bellek artık bir tag paylaşır. x0 üzerinden normal erişimler eşleşir.

3. Bir bug mismatch üretir. Bir linear overflow x0bir sonraki allocation'a (farklı tag) ya da free-edilip-yeniden-tag'lenmiş bir bölgeye (stale tag) yürütür; tag-checked erişim belleği sessizce bozmak yerine fault'lar.

Linux per-thread konfigürasyonu

Userspace thread başına opt-in yapar; kernel reporting mode'u seçer:

prctl(PR_SET_TAGGED_ADDR_CTRL,
      PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | (mask << PR_MTE_TAG_SHIFT),
      0, 0, 0);

Sync fault'lar si_code = SEGV_MTESERR ile SIGSEGV olarak gelir; async fault'lar SEGV_MTEAERR ve si_addr = 0 (adres geri kazanılamaz) ile SIGSEGV olarak gelir. Privileged bir per-CPU tercihi /sys/devices/system/cpu/cpu<N>/mte_tcf_preferred'de bulunur. Checking geçici olarak PSTATE.TCO (Tag Check Override) ile bastırılabilir (MSR TCO, #1); kernel onu signal handler'larında 0'a zorlar.

Detection

  • Tag-check-fault crash'leri. SEGV_MTESERR (sync) ya da SEGV_MTEAERR (async) ile SIGSEGV, yakalanan bir memory bug'ının birincil high-fidelity sinyalidir. Bunları sıradan crash'ler değil, güvenlik olayları olarak gör.
  • Crash telemetry'si / tombstone'lar. Android'de MTE crash tombstone'ları, fault'layan tag'i beklenen tag'e karşı ve yakındaki allocation/free stack'lerini kaydeder — UAF'a karşı overflow için güçlü triage kanıtı.
  • Mode downgrade'leri. Sessizce async ya da ignore moduna düşen process'ler (örn. per-CPU tercihi ya da eksik bir opt-in yoluyla) kapsamı azaltır; güvenlik-kritik servislerin gerçekten sync modda çalıştığını izle.
  • Bir component'ten gelen tekrarlı near-miss fault'lar bir saldırganın tag'leri brute-force ettiğini düşündürür (bkz. MTE tag brute-force).

Mitigation

Mitigation zaten MTE'dir; deployment rehberi ve bilinen sınırları:

  • Güvenlik sınırları için synchronous modu tercih et — async/asymmetric suçlu erişimin tamamlanmasına izin verir ve bir exploitation window bırakır (bkz. MTE As Implemented).
  • Tag-aware bir allocator ile birlikte kullan (Scudo/hardware-tagged malloc) ki bitişik allocation'lara farklı tag'ler atasın ve free'de re-tag etsin, ayrıca JIT/mmap bölgeleri dahil tüm process tree için MTE'yi açık tut.
  • Residual risk: ~1/16 tag collision; async erteleme; tag-leak ve tag-brute-force oracle'ları; büyük bir allocation içinde same-tag karışıklığı. MTE en iyi, mutlak değil, HWASan tarzı testleri tamamlayan güçlü bir probabilistik savunma olarak anlaşılır. Enhanced/MIE deployment'ları çıtayı daha da yükseltir (memory-integrity-enforcement-enhanced-mte).

References