Skip to content

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ç duymazJavaScript 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