Skip to content

Meltdown-US (CVE-2017-5754)

Orijinal Meltdown ("Rogue Data Cache Load", Variant 3): transient out-of-order execution, ertelenmiş User/Supervisor permission check'lerini suistimal ederek userspace'ten kernel bellegini okur ve sızıntıyı bir cache covert channel üzerinden taşır.

Mechanism

Kırılan invariant

Userspace'teki (CPL 3) bir load'un, kernel'e map'lenmiş (User/Supervisor = supervisor) bir adrese erişmesi fault üretmeli ve hiçbir şey döndürmemelidir. Meltdown-US bunu kırar çünkü etkilenen out-of-order CPU'larda permission (U/S) check'i ile data forwarding sırasız gerçekleşir: load transient olarak cache/memory hierarchy'den karşılanır ve secret byte, başarısız permission check'inden kaynaklanan page-fault retire olmadan önce bağımlı instruction'lara forward edilir. Fault sonunda architectural sonucu squash eder, ama transient instruction'lar microarchitectural state'i (bir cache line) çoktan değiştirmiştir; bir side channel de bunu okuyup çıkarır. Aşılan sınır, temel user/kernel bellek isolation'ıdır — pratikte ~1995'ten beri her Intel out-of-order core'u (CVE-2017-5754 Intel'e özgüdür; benzer transient-execution sorunları bazı Arm ve IBM POWER core'larını ayrı CVE'ler altında etkiler).

Walkthrough

Üst düzey, herkese açık Meltdown makalesinden (meltdownattack.com) ve Intel INTEL-SA-00088'den alınmıştır:

  1. Transient secret load. Erişilemeyen bir kernel adresine yapılan load transient olarak çalışır; dönen byte, fault teslim edilmeden önce kullanılır.
  2. Cache'e encode et. Secret byte, büyük bir probe array'i indeksler (olası her değer için bir cache line) ve tam olarak bir line'ı cache'e çeker.

    Kavramsal transient dizisi (yalnızca fragment)

    transient: secret = *(kernel_addr)        ; rolled back by fault
    transient: access probe[secret * 4096]    ; leaves a cache trace
    
    Sadece mantıksal şekil gösterilmiştir — çalışan bir PoC, adres veya fault-handling yapıştırma kodu yok.

  3. Fault'u bastır / handle et. Fault üreten erişim, yürütme devam edebilsin diye sarmalanır — örneğin transactional memory ile fault suppression, signal handling ya da branch misprediction ile eşleştirme.

  4. Flush+Reload ile recover et. Saldırgan probe array boyunca erişimleri zamanlar; tek hızlı (cache'lenmiş) line secret byte'ı ele verir. Iterasyon, keyfi kernel (ve dolayısıyla fiziksel) belleği boşaltır.

Warning

Meltdown, architectural olarak cache'lenmiş/map'lenmiş ama permission ile korunan veriyi okur. Bu, kurbana kendi verisini sızdırtmak için CPU'nun predictor'larını mistrain eden Spectre'dan farklıdır — bkz. Spectre.

Detection

  • Side-channel imzaları. Fault üreten load'ların hemen ardından gelen yüksek frekanslı, yapılandırılmış cache probing (page-stride bir array üzerinde flush/reload taramaları) temel gözlemlenebilir işarettir.
  • Fault-rate anomalileri. Sıkı bir loop içinde çok sayıda handle edilmiş segmentation fault üreten ya da TSX abort kalıpları kullanan bir process şüphelidir.
  • Performance counter'lar. Fault teslimiyle correlate olan yükselmiş cache-miss / mem_load kalıpları, izlenen host'larda exploitation girişimlerini işaretleyebilir.
  • EDR/davranışsal. Kernel adres aralıklarına tekrar tekrar dokunup oluşan fault'ları yakalayan userspace kodu anormaldir.

Mitigation

  • KPTI / KAISER. Kernel Page Table Isolation, userspace çalışırken çoğu kernel page'ini map'ten çıkarır, böylece secret transient olarak load edilecek şekilde map'li değildir; bu birincil OS düzeltmesidir (Linux KPTI, Windows, macOS karşılıkları).
  • PCID. Process-Context Identifier'lar, page-table isolation'ın aksi takdirde dayattığı TLB-flush performans maliyetini azaltır.
  • Hardware/firmware. Yeni CPU'lar Meltdown-US'i silikonda düzeltir; microcode ve OS güncellemelerini uygula (INTEL-SA-00088).
  • İlgili variant'lar. Aynı deferred-check kalıbı, Foreshadow / L1 Terminal Fault ve meltdown-kernel-memory-read içindeki kernel-memory read primitive'i gibi akrabaların da temelinde yatar.

References