EntryBleed (CVE-2022-4543)¶
Prefetch + iTLB timing, KPTI altında bile Linux kernel KASLR base'ini sızdırır, çünkü syscall entry trampoline'i user page table'larında mapped kalır.
Mechanism¶
Bug sınıfı: KPTI, entry text'i userspace'e TLB-görünür bırakır
Kernel Page Table Isolation (KPTI, bkz. ../mitigation/kpti.md), userspace'e
kernel'ı map'lemeyen soyulmuş bir page table vererek kernel memory'nin
Meltdown tarzı okunmasını durdurmak için tanıtıldı. Ama kernel'a geri dönüş
geçişi gerçekleşebilsin diye CPU, user mode'da çalışırken yine de bir miktar
kernel kodunu mapped tutmak zorundadır. Bu yüzden KPTI, entry_SYSCALL_64
dahil küçük bir entry trampoline'i user page table'da mapped tutar — ve o
mapping, randomize edilmiş kernel image'inin geri kalanıyla birlikte hareket
eder.
EntryBleed (William Liu, CVE-2022-4543), hâlâ mapped olan bu entry text'in bir
microarchitectural timing channel üzerinden KASLR slide'ını sızdırdığını gözlemler.
prefetch instruction'ı fault etmez ve hiçbir architectural sonuç üretmez, ama
hedef virtual address zaten TLB'de mevcutken daha hızlıdır ve bir page-table
walk gerektiğinde daha yavaştır. User kodu, entry page'i sadece syscall yaparak
instruction TLB'de resident tutabildiğinden, bir attacker prefetch'i aday kernel
adreslerine karşı time'layıp hit eden adresi tespit edebilir — kernel'ın nereye
yüklendiğini ortaya çıkararak. Kırılan invariant address-layout gizliliği'dir:
KPTI kernel verisini okumalardan saklar ama entry text'in konumunu bir
TLB-timing oracle'ından saklamaz.
Walkthrough¶
Public Will's Root yazısından ve HASP 2023 paper'ından yüksek seviyeli bir reproduction. Burada exploit kodu yeniden üretilmiyor.
Kavramsal KASLR-base geri elde etme
- iTLB'yi ısıt.
entry_SYSCALL_64içeren page instruction TLB'de cache'lensin diye herhangi bir syscall'ı tekrar tekrar çalıştır. -
Aday base'leri süpür. Kernel text, bilinen randomize edilmiş bir pencerede (
0xffffffff8...bölgesi) bir yerde yaşar. KASLR granularity'sindeki her aday adres için: -
Hızlı olanı seç. Tutarlı şekilde en hızlı prefetch eden aday, TLB-resident entry page'e karşılık gelir; offset'i KASLR slide'ını ortaya çıkarır. ~onlarca-yüzlerce iterasyon üzerinden ortalama almak, saniyenin epey altında neredeyse kusursuz doğruluk verir.
- Slide'ı kullan. Geri elde edilen base, kernel sembollerini de-randomize eder ve aksi halde exploit'i zor kernel bug'larını güvenilir hale getirir. Teknik, bir KVM guest'inin kernel base'ini sızdırmak için de çalışır.
Warning
EntryBleed özel bir privilege veya yanlış yapılandırma gerektirmez — etkilenen bir Intel sistemindeki herhangi bir yerel unprivileged process onu çalıştırabilir; bu yüzden KPTI altında evrensel bir KASLR bypass olarak tanımlanır.
Detection¶
- Prefetch +
rdtsc(p)loop'ları: kernel-text adres aralığı üzerindeprefetch/prefetchnta'yırdtscpile karıştıran sıkı loop'lar güçlü bir davranışsal sinyaldir; EDR/host monitoring bu pattern'ı sergileyen binary'leri işaretleyebilir. - HPC anomalileri: performans araçları olmayan process'lerden gelen patlamalı TLB aktivitesi ve timing enstrümantasyonu olağandışıdır; performance-counter monitor'ları bunu yüzeye çıkarabilir.
- Probe öncesi syscall flooding: entry page'i TLB-resident tutmak için kullanılan anormal bir önemsiz syscall patlaması, timing süpürmesinden önce gelebilir.
- Honeypot canary'leri: timing yoluyla KASLR penceresini brute-force ediyor gibi görünen process'leri izlemek, exploit-staging'i yakalayabilir.
Mitigation¶
- FGKASLR: Function-Granular KASLR, kernel fonksiyon konumlarını base'den bağımsız olarak randomize eder; böylece entry trampoline'i sızdırmak artık kernel'ın geri kalanını de-randomize etmez.
- Entry text'i base'den decouple et: entry trampoline'i randomize edilmiş kernel'dan sabit bir offset olmayan bir adrese map'le; bu, oracle'ın dayandığı korelasyonu kaldırır.
- Prefetch timing hassasiyetini düşür / channel'ı kısıtla:
prefetchtabanlı TLB timing'i körelten mitigation'lar oracle'ı kaldırır (../sidechannel/prefetch-side-channel-attack.md ve ../mitigation/prefetch-side-channel-kaslr-break.md'ye karşı kullanılan aynı savunma sınıfı). - Daha güçlü isolation: kernel exit'te user-görünür TLB entry'lerini flush'lamak veya partition'lamak; kernel'ları yamalı tutmak (Red Hat ve diğerleri CVE-2022-4543'ü izliyor).
- Defense in depth: KASLR yalnızca olasılıksal bir sertleştirme katmanı olduğu için, yalnızca layout gizliliğine güvenmek yerine onu CFI, stack canary'leri ve bug-sınıfı eliminasyonu ile birleştirin.