Spectre v1 ASLR/Memory Disclosure (bounds-check bypass leak)¶
Spectre v1 (CVE-2017-5753) bir conditional branch'i yanlış eğitir, böylece CPU speculative olarak bir out-of-bounds array erişimi yapar, sonra speculative olarak okunan byte'ı bir cache side channel üzerinden dışarı sızdırır — (K)ASLR'ı yenen memory içeriklerini ve pointer değerlerini ifşa eder.
Mechanism¶
Note
Kavramsal: NEDEN çalışır, invariant/teori.
Spectre Variant 1, "Bounds Check Bypass," bir CPU'nun bir conditional branch'i speculate etmesi ile o branch'i resolve etmesi arasındaki boşluğu suistimal eder. Kanonik victim gadget'ını düşünün:
if (x < array1_size) /* bounds check */
y = array2[array1[x] * 4096]; /* dependent, attacker-influenced load */
Attacker önce gadget'ı in-bounds x ile çok kez çağırarak branch predictor'ı
yanlış eğitir, böylece predictor branch'in taken olduğunu öğrenir. Sonra
onu out-of-bounds bir x ile invoke eder. CPU array1_size'ın (genellikle
kasıtlı olarak cache'ten evict edilmiş) resolve olmasını beklerken,
speculative olarak "taken" predict eder ve gövdeyi kötü niyetli x ile
çalıştırır. array1[x], array'in dışından gizli bir byte okur; o byte sonra
array2'yi indexler ve cache'e secret-dependent bir cacheline çeker.
Architectural state, misprediction tespit edildiğinde geri alınır — ama
cache footprint geri alınmaz. Sonradan array2 üzerinde bir
FLUSH+RELOAD probe, hangi line'ın artık hızlı olduğunu zamanlar ve gizli
byte'ı açığa çıkarır.
Leak data byte'larıyla sınırlı değildir: speculative read'i pointer'lara, return address'lere veya bilinen-formatlı kernel yapılarına nişanlayarak attacker adresleri geri kazanır ve bu da ASLR/KASLR'ı derandomize eder. Speculation-tabanlı probing, kod veya data'nın nereye map'lendiğine dair tahminleri test etmek için de kullanılabilir (bir code-region derandomization primitive'i), çünkü doğru bir tahmin ölçülebilir bir speculative side effect üretir, yanlış olan üretmez.
Spectre'nin kırdığı kritik invariant: architectural yoldaki bir bounds check, speculative yolu kısıtlamaz. Bağımlı, attacker'ın etkilediği bir memory erişimini koruyan herhangi bir conditional bir aday gadget'tır.
Walkthrough¶
Kernel'in vulnerability ve aktif mitigation hakkındaki görüşünü kontrol edin:
$ cat /sys/devices/system/cpu/vulnerabilities/spectre_v1
Mitigation: usercopy/swapgs barriers and __user pointer sanitization
Linux mitigation'ı topyekûn bir fence değildir; vulnerable site'ları annotate eder:
array_index_nospec(index, size), user'ın kontrol ettiği bir index'i clamp'ler ki, speculative olarak bile, out-of-bounds birindex0'a zorlanır.array_index_mask_nospec()'ten inşa edilir; bu,index < sizeolduğunda bir all-ones mask, aksi halde bir all-zeros mask hesaplar, CPU'nun mispredict edebileceği bir branch olmadan:
/* conceptual usage at a vulnerable site */
if (x < array1_size) {
x = array_index_nospec(x, array1_size); /* speculation-safe clamp */
y = array2[array1[x] * 4096];
}
-
barrier_nospec(), speculation'ın bir kontrolün önünden gitmesini durdurmak için birLFENCE(bir speculation barrier; Arm'dacsdb) yayar — örneğin user-copy yolundakiaccess_ok()testi etrafında kullanılır, böylece mispredict edilmiş biraccess_ok()speculative olarak kernel memory'sini okuyamaz. -
swapgs alt-varyantı için, entry yolları
FENCE_SWAPGS_KERNEL_ENTRY/FENCE_SWAPGS_USER_ENTRYüzerindenLFENCEkazanır.
Beklenen: yamalı bir kernel'de spectre_v1 dosyası sanitization + barrier
mitigation'ını yukarıdaki gibi raporlar; mitigate edilmemiş bir sistemde
Vulnerable okunur.
Warning
Her branch'te topyekûn LFENCE çok yavaştır, bu yüzden Spectre v1 savunması
site-by-site'tır. Kapsam bu yüzden ancak audit kadar iyidir — annotate
edilmemiş, attacker'ın erişebileceği herhangi bir gadget exploitable kalır ve
araştırmalar index-masking mitigation'larının speculative-store ve
type-confusion varyantlarına karşı eksik olabileceğini gösterdi.
Detection¶
- Durumu görmek için
/sys/devices/system/cpu/vulnerabilities/spectre_v1'i okuyun. - Leak bir cache covert channel'a dayanır; high-resolution timer suistimali ve bir probe array üzerinde tekrar eden FLUSH+RELOAD / eviction loop'ları davranışsal sinyallerdir, ancak pratikte gürültülüdür.
Mitigation¶
- Kernel'i yamalı tutun ki vulnerable site'lar
array_index_nospec()/barrier_nospec()kullansın; yeni, attacker'ın erişebileceği bounds check'leri denetleyin. - Side-channel çözünürlüğünü azaltın (browser JS engine'leri gibi sandbox'larda high-precision timer'ları kabalaştırın veya kısıtlayın).
- KASLR'ı güçlendiren özelliklerle katmanlayın; başarılı bir v1 leak'inin info-leak-pointer-leak-aslr-bypass workflow'larını besleyebileceğini unutmayın.