Skip to content

TLB/Cache KASLR Timing Oracle

Mapped ve unmapped kernel page'leri arasındaki access-timing farklarını kullanarak randomize edilmiş kernel base'i kurtar; KASLR'ı unprivileged bir process'ten kır.

Mechanism

Kernel ASLR (KASLR), kernel code ve data'sının virtual address space'in paylaşımlı üst yarısında nereye düştüğünü randomize ederek kernel'in base'ini gizler. Sır, kernel'in o aralıkta nereye map'lendiğidir. Kritik nokta: bu adresleri besleyen page table'lar, TLB ve cache'ler paylaşımlı microarchitectural kaynaklardır: bir user process ile kernel aynı TLB entry'leri ve cache line'ları için yarışır ve MMU, unprivileged process data'yı okumaya yetkili olmasa bile, mapped bir page'i unmapped olandan farklı ele alır.

Neden çalışır

Mapped bir kernel page'ine yapılan bir memory access (ya da address-translation denemesi) mevcut bir page-table entry üzerinden çözülür ve sıcak bir TLB entry'sine veya cache line'a hit edebilir; unmapped bir page'e yapılan access ise page table'ları walk etmek ve sonunda fault vermek zorundadır. Bu iki sonucun farklı, ölçülebilir latency'leri vardır. Aday kernel base adreslerini page granularity'sinde tarayıp her probe'u süreölçerek, saldırgan hangi page'lerin mapped olduğunun bir haritasını çıkarır — ve mapped bölgenin sınırı randomize kernel base'i ele verir. Permission check'leri kernel data'yı okumanı engeller, ama translation/fault handling'in timing ayak izini silmez.

Walkthrough

Hund, Willems ve Holz (IEEE S&P 2013) bu timing aralığını unprivileged bir user process'ten istismar eden üç somut oracle gösterir:

  • Double page fault — Fault veren bir kernel adresine eriş, fault'u yakala, sonra ona tekrar eriş. Fault delivery/handling'in timing'i, o adres için altta yatan bir paging structure'ın mevcut olup olmamasına göre değişir; mapping bilgisini bir paging structure granularity'sinde sızdırır.
  • Cache probing — Cache'i prime et, bir kernel access dene (ki fault verir), sonra attacker-controlled line'ların eviction/access timing'ini ölç. Mapped bir kernel page için address translation, cache state'i unmapped olandan farklı bozar.
  • TLB timing — Mapped bir kernel page'ine dokunmak bir TLB entry kurabilir ya da refresh edebilir; TLB state'ine bağlı sonraki bir işlem, unmapped bir page'inkine göre ölçülebilir derecede daha hızlı çalışır ve hangi page'lerin resident olduğunu açığa çıkarır.

Genel probing loop'u (pseudocode, çalıştırılabilir bir exploit değil):

// For each candidate kernel base page, measure access/fault latency.
for (uintptr_t cand = KERNEL_LOW; cand < KERNEL_HIGH; cand += PAGE_SIZE) {
    flush_relevant_state();               // TLB/cache hygiene before the probe
    uint64_t t0 = rdtscp_serialized();
    probe_faulting_access(cand);          // faults; handler returns control
    uint64_t t1 = rdtscp_serialized();
    record(cand, t1 - t0);                // mapped vs unmapped -> distinct timing
}
// The transition in the timing histogram marks the start of mapped kernel pages.
Timing histogram'ını yorumlamak

Aday aralığı boyunca bimodal bir dağılım beklersin: mapped/translatable page'lere karşılık gelen bir "hızlı" sample kümesi ve unmapped page'ler için bir "yavaş" sample kümesi (ya da oracle'a göre tam tersi). İki küme arasındaki kenar — gürültüyü bastırmak için birçok deneme boyunca tekrarlanır — kernel base'i randomization granularity'sine göre tam olarak işaretler.

Kalibrasyon ve gürültü

Tam threshold'lar, cycle sayıları ve hangi oracle'ın en iyi çalıştığı microarchitecture'a özgüdür. Orijinal paper'daki sayılar yazarların test ettiği belirli CPU'lara uygulanır; başka hardware'de bunları varsayma. SMT, prefetcher'lar, frequency scaling ve interrupt'ların hepsi gürültü ekler; bu yüzden gerçek saldırılar aday başına birçok sample'ın ortalamasını alır.

Detection

  • Genel side-channel telemetry zayıftır, ama access pattern alışılmadıktır: kernel adreslerine yapılan faulting access'lerin sıkı loop'ları artı high-resolution timing (rdtsc/rdtscp). Tek bir process'ten gelen aşırı minor/segfault oranları heuristic bir sinyal olabilir.
  • Bu bir building block'tur; aşağı akıştaki privilege escalation (asıl exploit) genelde EDR/auditing'in chain'i yakaladığı yerdir.

Mitigation

Yapısal düzeltme, kernel'i user page table'larından unmap etmektir; böylece user-mode probe'larının süreölçecek mapped kernel page'i kalmaz. Tam olarak KPTI (Kernel Page-Table Isolation) bunu yapar: user mode'da kernel'in mapping'leri yoktur, bu da kernel adresleri için mapped/unmapped timing ayrımını çökertir. KPTI esas olarak Meltdown için deploy edildi ama bu sınıf KASLR timing oracle'ını da körler.

Residual risk ve ilgili çalışmalar:

  • KPTI küçük bir trampoline/entry bölgesini mapped bırakır; sonraki saldırılar (prefetch side-channel KASLR break ve EntryBleed tarzı probe'lar) residual mapped structure'ları hedef alır ya da prefetch instruction'ının translation'a bağlı timing'ini kullanır. Ayrıca bkz. prefetch-timing-kaslr-bypass.
  • Daha ince granular / re-randomizing KASLR (örn. function-granular layout'lar) saldırganın işini yükseltir ama timing kanalını tek başına ortadan kaldırmaz.
  • Genel hardening: untrusted code'a sunulan timer resolution'ını düşür ve cross-thread varyantın önemli olduğu yerlerde SMT'yi disable et.

References

  • Ralf Hund, Carsten Willems, Thorsten Holz, "Practical Timing Side Channel Attacks Against Kernel Space ASLR", IEEE S&P 2013 — https://www.ieee-security.org/TC/SP2013/papers/4977a191.pdf
  • NDSS programme page (authors/date) — https://www.ndss-symposium.org/ndss2013/ndss-2013-programme/practical-timing-side-channel-attacks-against-kernel-space-aslr/
  • Gruss et al., "Prefetch Side-Channel Attacks: Bypassing SMAP and Kernel ASLR", CCS 2016 — https://gruss.cc/files/prefetch.pdf