Skip to content

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 bir index 0'a zorlanır. array_index_mask_nospec()'ten inşa edilir; bu, index < size olduğ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 bir LFENCE (bir speculation barrier; Arm'da csdb) yayar — örneğin user-copy yolundaki access_ok() testi etrafında kullanılır, böylece mispredict edilmiş bir access_ok() speculative olarak kernel memory'sini okuyamaz.

  • swapgs alt-varyantı için, entry yolları FENCE_SWAPGS_KERNEL_ENTRY / FENCE_SWAPGS_USER_ENTRY üzerinden LFENCE kazanı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.

References