EchoLoad¶
Physically-backed kernel adreslerini tespit etmek için stall eden bir load'u, transient çalışmış (ama sıfırlanmış) illegal bir load'dan ayırt et; böylece Meltdown/MDS'e dirençli CPU'larda ve JavaScript'ten bile KASLR'ı kır.
Mechanism¶
Neden çalışır
Hardware Meltdown mitigation'larına sahip yeni Intel core'larında (örn. Cascade Lake), present, privileged bir adrese yapılan illegal bir load artık gerçek değeri sızdırmaz — veri sıfırlanır. Ama load yine de transient çalışır: pipeline'ı stall etmez. Buna karşın non-present bir adrese yapılan bir load, page-table walk fault'u çözerken CPU'nun stall etmesine yol açar.
EchoLoad tam olarak bu asimetriyi exploit eder:
- Leak: transient çalışmış (sıfırlanmış) bir load hızlıca tamamlanır ve bağımlı bir instruction'ın cache'e encode etmesine izin verir; bir non-present load stall eder, dolayısıyla bağımlı instruction transient şekilde çalışmaz.
- Transmit/decode: bağımlı instruction bir probe line'a dokunur; o line'ı time'lamak (Flush+Reload), load'un physically backed (mapped) olup olmadığını ortaya çıkarır — adres başına bir mapped/unmapped oracle.
Aday kernel adreslerini süpürmek KASLR layout'unu sınıflandırır. EchoLoad yalnızca düz memory load'lara (egzotik bir instruction'a değil) ihtiyaç duyduğu için, son derece kısıtlı ortamlarda — SGX ve hatta JavaScript — çalışır ve Cascade Lake'te KASLR'ı onlarca mikrosaniyede kırar.
Walkthrough¶
Probe, (bastırılmış) illegal bir erişimin arkasında bağımlı bir load çalıştırır ve covert-channel line'ını time'lar:
// Conceptual EchoLoad probe (transient; needs fault suppression / TSX or signal).
flush(probe);
TRANSIENT {
char v = *(volatile char *)kernel_candidate; // zeroed if mapped, stalls if not
(void)probe[v * 4096]; // only runs if load didn't stall
}
uint64_t t = reload_time(&probe[0]); // fast => candidate is mapped
KASLR base adaylarının üzerinde iterate edip hangisinin hızlı bir reload ürettiğini kaydetmek, kernel base / slide'ı verir.
Beklenen davranış (kavramsal)
Mitigation¶
- FLARE (aynı paper'da önerildi), kullanılmayan kernel adreslerini reserved bir page'e map'ler ve komşu permission bit'lerini mirror'lar; böylece mapped ve unmapped kernel memory ayırt edilemez hale gelir — bkz. FLARE-targeted KASLR breaks.
- Tek başına daha güçlü KASLR entropy'si yardımcı olmaz; oracle adres başınadır.