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:
- 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.
-
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.
-
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.
- 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_loadkalı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.