Skip to content

Heap localization

Bir L1-cache Prime+Probe side channel'ı kullanarak bir kernel heap objesinin tam intra-page slot'unu kurtar; böylece SLUB grooming'i hiçbir memory disclosure olmadan deterministik hale getir.

Mechanism

Buddy allocator page'leri SLUB'a verir; SLUB onları objelere böler. Freelist randomization (CONFIG_SLAB_FREELIST_RANDOM), sprayed objelerin sıralı, öngörülebilir slot'lar işgal ettiği varsayımını kırar. Heap Localization (Lee et al., IEEE S&P 2026) bu belirsizliği, objenin pozisyonunu kernel memory'den değil CPU cache'inden okuyarak aşar.

Note

Exploit edilen donanım invariant'ı, L1 data cache'inin VIPT (virtually-indexed, physically-tagged) olmasıdır: set index virtual adresin alt 12 bit'inden gelir. 64-byte line'lar ve 64 set ile, 4 KB'lık bir page cache line'larına bire bir map'lenir. Bir kernel access'inin hangi cache line'a dokunduğunu gözlemlemek, dolayısıyla erişilen objenin intra-page offset'ini ortaya koyar — slot'unu, hiç kernel-memory read'i olmadan kurtarır.

  4 KB page (SLUB slab)              L1 d-cache (VIPT, 64B line, 64 set)
  ┌──────────────┐ slot A  ─ acc ─►  ┌──────────────┐
  │  obj slot 0  │                   │  set 0       │
  │  obj slot 1  │ ── alt 12 bit ──► │  set 1       │  ◄─ Prime+Probe
  │     ...      │   = set index     │   ...        │     hangi set
  │  obj slot n  │                   │  set 63      │     "evict" oldu?
  └──────────────┘                   └──────────────┘
  intra-page offset ───────── 1:1 ─────────► cache set
  (slot pozisyonu)        (page→line eşlemesi)   (gözlemlenebilir sinyal)

Diyagram conceptual'dir; gerçek set/line geometrisi mikromimariye göre değişir. Kernel-memory read'i yok — yalnızca hangi set'in dokunulduğu çıkarılır.

Warning

Primitive, SLUB internals'ından bağımsız olarak paylaşılan L1 donanım indexing'ine dayanır; dolayısıyla cache-partitioning-agnostic mitigation'lar (randomized kmalloc cache'leri, slab bucket'ları, freelist randomization, KASLR, SMAP/SMEP, KPTI) objelere hangi cache'in eşlik ettiğini değiştirir ama localization'ın kendisini yenmez.

Walkthrough

Makaleden (Linux v6.16 üzerinde değerlendirildi), localization objesi msg_msg'dir — ayrı allocate/deallocate/access primitive'leri ve az sayıda fazladan kernel access'i vardır, dolayısıyla cache footprint'i temizdir:

  1. Drain: hedef cache'i taze, boş bir page'e boşalt; böylece vulnerable obje ve localization objesi onun üzerinde birlikte ikamet etsin.
  2. Probe: bir msg_msg allocate et, L1 set'leri üzerinde Prime+Probe çalıştır ve intra-page offset'ini oku. Localization objesi istenen slot'u işgal edene kadar tekrarla.
  3. Swap: SLUB'ın LIFO freelist'ini exploit et — istenen slot'taki msg_msg'i free et, sonra hemen vulnerable objeyi allocate et ki tam o slot'u yeniden kullansın. Window küçücüktür; bu da interleaving'e direnir.
Cross-cache hizalama

Bir cross-cache adımı için (örn. kmalloc-128 vs cred_jar'da 192 byte), iki obje boyutu yalnızca ortak katlarda hizalanır (örn. 1920), dolayısıyla localization birlikte ikamet eden kesin slot'u sabitler. Makale idle iken ~%99.3, yük altında ~%95.7 reliability ve dört CVE genelinde altı end-to-end privilege escalation bildiriyor.

Not: bazı CTF write-up'ları "heap localization"ı gayriresmî olarak tek bir CPU'ya pin'leme (sched_setaffinity() ile CPU_SET) anlamında kullanır; böylece allocation'lar tek bir per-CPU slab paylaşır. Bu gerçek bir grooming yardımcısıdır ama yukarıdaki adlandırılmış teknik değildir ve o kaynaklarda genellikle "heap localization" diye anılmaz.

Mitigation

Makale, brute-force "son slot'a düşene kadar retry" grooming'inin panic olasılığını yükselttiğini ve tespit edilebilir anomaliler ürettiğini not eder; Heap Localization deterministik olarak bundan kaçınır. Savunmaların yalnızca slab layout'unu randomize etmek yerine VIPT timing sinyalini kırması gerekir (user-kernel boundary'si boyunca cache partitioning / flushing). PoC: github.com/MPI-SysSec/Heap-Localization.

References