Meltdown-P¶
Foreshadow / L1 Terminal Fault: bir page-table entry'sinin present bit'i clear olduğunda, CPU yine de PTE'nin ham physical bit'leriyle adreslenen L1 data cache'ten data'yı speculative olarak forward eder ve terminal fault retire olmadan önce L1'de resident olan herhangi bir line'ı transient olarak sızdırır.
Mechanism¶
Neden çalışır
x86'da bir load için address translation aşamalı ilerler. CPU bir page table'ı walk ettiğinde ve present bit'i clear (ya da reserved bit'leri set) olan bir PTE bulduğunda, access fault vermek zorundadır — bu bir terminal fault'tur. Ama o fault architectural olarak yükseltilmeden önce, etkilenen Intel core'ları, sanki page present'miş gibi speculative olarak devam eder, PTE'nin kendisinde encode edilmiş physical-address bit'lerini alır ve onlarla L1 data cache'i probe eder.
Eğer o (attacker'ın etkilediği) physical address'teki bir line şu anda L1D'de ise, byte'ları dependent instruction'lara transient olarak forward edilir. Fault daha sonra teslim edilir ve architectural state geri alınır — ama secret zaten bir covert channel aracılığıyla cache'e encode edilmiştir.
Canella et al. taxonomy'sinde bu Meltdown-P'dir (P = present bit). Intel buna L1 Terminal Fault (L1TF) der. Üç sınır etkilenir:
- SGX üzerinde Meltdown-P / Foreshadow (CVE-2018-3615): orijinal saldırı, enclave memory'sini — attestation ve sealing key'lerini — enclave'de herhangi bir code güvenlik açığı olmadan, enclave'in dışından okur.
- OS / SMM (CVE-2018-3620): bir attacker, physical bit'leri bir victim physical page'e işaret eden non-present bir PTE oluşturur; transient L1 read, o page'i user/kernel sınırı boyunca sızdırır.
- VMM / hypervisor (CVE-2018-3646): forward edilen adres bir host physical address'tir, dolayısıyla kötü amaçlı bir guest, diğer VM'ler ve hypervisor dahil L1'de resident olan herhangi bir data'yı okuyabilir — EPT isolation'ını çürütür. Bu, Foreshadow-NG genellemesidir.
Sibling taxonomy'den farkı: Meltdown-P'yi belirleyen şey, PTE'nin present bit'i clear olduğunda yükseltilen terminal fault'tur ve sızdırılan şey L1D'de resident olan herhangi bir line'dır — bounds ihlali (#BR, Meltdown-BR), system register read (#GP, Meltdown-GP), lazy-FPU #NM (Meltdown-NM), PKU/PKRU bypass (Meltdown-PK) ya da read-only R/W-bit transient store (Meltdown-RW) değil.
Leak/transmit/decode invariant'ı:
- Leak: non-present (terminal-faulting) bir load, PTE physical bit'leriyle adreslenen bir L1D line'ını transient olarak okur.
- Transmit: transient değer bir probe array'i indeksler ve onu cache'e encode eder.
- Decode: Flush+Reload byte'ı geri kazanır.
Walkthrough¶
Attacker, present bit'i clear olan ama physical bit'leri hedef line'a işaret eden bir PTE ayarlar, ardından bir transient read gönderir:
// Conceptual L1TF leak. Requires a non-present PTE under attacker control
// (e.g. a swapped-out / PROT_NONE mapping the attacker can influence).
flush(probe); // clear the covert channel
TRANSIENT { // fault is suppressed/handled
uint8_t v = *(volatile uint8_t *)mapping; // PTE present=0; phys bits -> L1D
(void)probe[v * 4096]; // encode transient L1 byte
}
uint8_t leaked = reload_index(probe); // Flush+Reload recovers v
VMM varyantı için forward edilen "physical bit'ler" bir host physical address'tir, dolayısıyla bir guest, EPT sınırı boyunca okumak için L1'de resident olan host physical page'leri tarar.
Kısıt: data L1D'de olmalı
L1TF yalnızca L1D'de resident olan data'yı sızdırır. Pratik saldırılar önce victim/host'un hedefi L1'e getirmesini sağlar (örneğin victim'in kendi access'leri aracılığıyla ya da aynı L1D'yi paylaşan sibling SMT thread'de schedule ederek).Detection¶
Kernel'in vulnerability raporlama arayüzünü okuyun:
$ cat /sys/devices/system/cpu/vulnerabilities/l1tf
Mitigation: PTE Inversion; VMX: cache flushes, SMT vulnerable
Değerler Not affected'tan, eklenen VMX (cache-flush) ve SMT durumuyla birlikte
Mitigation: PTE Inversion'a kadar değişir. Victim'in içinden bir L1TF attacker'ı
doğrudan tespit etmek zordur; host tarafında, sıkı fault-handling + Flush+Reload
timing loop'ları zayıf bir sezgidir.
Mitigation¶
- PTE inversion (koşulsuz, ölçülebilir maliyet yok): non-present PTE'ler için OS, physical-address bit'lerini tersine çevirir ki non-cacheable / unbacked memory'ye işaret etsinler; bu da attacker'a yararlı bir physical hedef vermez.
- VM entry'de L1D flush microcode aracılığıyla (
L1D_FLUSHMSR). KVM,kvm-intel.vmentry_l1d_flush=cond(varsayılan, denetlenmiş path'lerden sonra flush) ya da=always(her VMENTER'da flush) sunar; enclave/SMM exit'te de flush. - SMT'yi devre dışı bırak (
nosmt) ya da core scheduling kullan ki bir attacker bir sibling hyperthread'de bir victim ile L1D paylaşamasın. RDCL_NO'yu enumerate eden yeni Intel CPU'ları etkilenmez ve flush gerektirmez.