AnC (ASLR-Cache EVICT+TIME MMU attack)¶
MMU'nun page-table walk'unu time'layarak ASLR'ı JavaScript'ten derandomize et: PTE access'lerinin dokunduğu cache set'leri, bir victim virtual address'in page-table offset bit'lerini açığa çıkarır.
Mechanism¶
Neden çalışır
TLB'yi miss eden her virtual-to-physical translation, hardware MMU'yu page table'ları walk etmeye zorlar — x86_64'te dört memory access, paging level başına bir tane (PML4, PDPT, PD, PT). Bu page-table page'leri sıradan memory'dir, dolayısıyla walk'un load'ları shared last-level cache (LLC)'a düşer.
Kritik olan şu: her PTE access'in hangi cache set'ine map olduğu, kendi page table'ı içindeki offset'in bir fonksiyonudur ve o offset tam olarak translate edilen virtual address'in bir dilimidir (level başına 9 bit). Yani bir attacker, bir translation sırasında MMU'nun hangi cache set'lerine dokunduğunu söyleyebiliyorsa, level başına adresin 9 bit'ini öğrenir — yani tam da ASLR'ın randomize ettiği bit'leri.
AnC, bu walk üzerine bir EVICT+TIME cache saldırısıdır: aday cache set'lerini prime/evict et, victim translation'ı tetikle ve time'la; bir yavaşlama, walk'un evict edilen set'i kullandığını açığa çıkarır. Yalnızca temel memory access'lere ve timing'e dayandığı için hiçbir özel instruction ya da software feature'a ihtiyaç duymaz — JavaScript içinde çalışır ve browser'da ASLR'ı yener. VUSec, Linux üzerinde Firefox ve Chrome'da code ve heap ASLR'ının her ikisini de (28 bit entropy) reliable JavaScript attack ile ~150 saniyede kırdığını raporladı; iki timing çelişmez — "ASLR gone in 25 seconds", aynı attack'in optimize/hızlandırılmış demo variant'ıdır (150 saniye conservative/güvenilir tam ölçüm, 25 saniye ise hızlı demo). Kırılan invariant şu: ASLR adres bit'lerinin secret olduğunu varsayar, ama MMU page-table-offset bit'lerini cache üzerinden leak eder.
Walkthrough¶
AnC bir microarchitectural saldırıdır; workflow şöyle:
1. Allocate a large buffer and build LLC eviction sets (groups of lines that
map to the same cache set) — done with pointer-chasing + timing, no clflush.
2. Repeatedly dereference a target pointer to force MMU page-table walks for
its translation (or let the JS engine's own accesses do it).
3. For each paging level, EVICT a candidate set, then TIME the translation:
evict(set_i); t0 = now(); touch(target); dt = now() - t0;
A high dt means the MMU re-fetched a PTE from that set -> set_i holds a PTE
for this level -> that yields the 9 offset bits for the level.
4. Concatenate the recovered per-level offsets to reconstruct the randomized
virtual-address bits (code base / heap pointer).
Beklenen sonuç: dört level üzerinde timing toplandıktan sonra attacker, seçilen bir pointer'ın ASLR'lanmış bit'lerini geri kazanır ve code ya da heap'in randomize edilmiş base'ini çözer — tamamen sandbox'lanmış bir JS context'inden, onlarca saniye içinde.
Hardware leak — software ASLR bunu patch'leyemez
Leak, MMU'nun PTE'leri cache'lemesi olduğu için, hiçbir miktarda software re-randomization, page-table-walk caching'in kendisini bozmadan onu kapatamaz; önerilen mitigation'lar arasında non-cacheable page-table walk'lar ya da daha ince cache partitioning vardır.
Detection¶
Victim'in içinden pratikte tespit edilemez — yalnızca timing'tir. Savunma araştırmaları, probe'u tespit etmeye değil, browser tarafına (JS timer'larını kabalaştırmak) ve microarchitecture'a (cache'te page-table isolation) odaklandı.
Mitigation¶
(Onu durduran şey.) Browser'larda high-resolution timer'ları azaltmak/jitter'lamak çıtayı yükseltir; mimari olarak, CEASER gibi partitioned/randomized cache'ler ve page-table page'lerini shared LLC'de cache'lememek channel'ı ortadan kaldırır. Tek başına ASLR, AnC'ye karşı bir savunma değildir.
References¶
- VUSec. AnC. — https://www.vusec.net/projects/anc/
- Gras, Razavi, Bosman, Bos, Giuffrida. ASLR on the Line: Practical Cache Attacks on the MMU. NDSS 2017. — https://www.ndss-symposium.org/ndss2017/ndss-2017-programme/aslrcache-practical-cache-attacks-mmu/