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 x0'ı bir 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 daSEGV_MTEAERR(async) ileSIGSEGV, 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/
mmapbö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).