Skip to content

Spectre-PHT (Variant 1, CVE-2017-5753)

Bounds Check Bypass: conditional-branch predictor'ı (Pattern History Table) mistrain ederek, attacker bir victim'in başarısız bir bounds check'in ötesinde speculative olarak execute etmesini sağlar ve bir cache covert channel üzerinden out-of-bounds memory okur.

Mechanism

Bug sınıfı / aşılan invariant

Conditional-branch yönü, son taken/not-taken sonuçlarını kaydeden bir Pattern History Table (PHT)'den predict edilir. Attacker önce PHT'yi öyle hazırlar ki bir guarded branch — örn. bir if (x < array1_size) bounds check'i — taken (in bounds) predict edilir. Ardından out-of-bounds bir index x verir. Core, comparison resolve olmadan önce in-bounds yolu speculative olarak execute eder; array'in ötesinde array1[x] gerçekleştirir ve o secret byte'ı ikinci bir probe array'i index'lemek için kullanır. Branch nihayet mispredict edilmiş olarak resolve olduğunda architectural state rollback edilir, ama cache'e getirilen secret-dependent line kalıcı olur. Kırılan invariant şudur: bir software safety check, speculation sırasında fiilen erişilen data'yı artık sınırlamaz — gerçekten de, Spectre yazarlarının belirttiği gibi, safety check'in kendisi attack surface'in bir parçası olur. Canella et al. bunu, transient execution attack'lerine ilişkin sistematizasyonlarında Spectre-PHT olarak sınıflandırır.

Walkthrough

Yüksek seviyeden, Kocher et al. (spectreattack.com) ve Canella et al., A Systematic Evaluation of Transient Execution Attacks and Defenses (USENIX Security 2019)'dan.

Kavramsal reprodüksiyon

Kanonik victim snippet'i:

if (x < array1_size)
    y = array2[ array1[x] * 256 ];
  1. PHT'yi train et. Gadget'ı in-bounds x ile birçok kez çağır, böylece branch predictor "taken / in-bounds"'u öğrenir.
  2. Channel'ı flush et. array2'yi cache'ten evict et (bkz. Flush+Reload).
  3. Mis-speculate ettir. Out-of-bounds bir x ile bir kez çağır. Core, array1[x]'i (bir secret byte) speculative olarak hesaplar ve bunu bounds check resolve olmadan önce spesifik bir array2 line'ını load etmek için kullanır.
  4. Recover et. array2 boyunca erişimleri zamanla; hızlı (cached) line, secret byte'ın değerini açığa çıkarır. Memory'yi dökmek için offset'ler boyunca tekrarla.

Detection

Sinyaller dolaylıdır

  • Exposure envanteri: Linux'ta /sys/devices/system/cpu/vulnerabilities/spectre_v1'i oku; bu, sanitization / usercopy / swapgs barrier'larının yerinde olup olmadığını raporlar.
  • Statik gadget avı: binary'leri/kernel'leri bounds-check-then-array-index pattern'i için tara (Spectre-PHT gadget'ları bulan türden araçların temeli); hardening yapılmamış gadget'ların varlığı gerçek risk surface'idir.
  • Behavioral sezgiler: tek bir guarded accessor'a sınıra yakın index'lerle tekrar tekrar isabet eden sıkı self-timed loop'lar çalıştıran untrusted kod şüphelidir, ama kesin değildir.
  • Tüm Spectre variant'larında olduğu gibi, tek bir transient read hiçbir architectural log bırakmaz; detection istatistikseldir.

Mitigation

  • Speculation-blocking accessor'lar. Check ile access arasına data-dependent bir barrier ekle — Linux'ta array_index_nospec(), speculative window'da index'i clamp eder; barrier_nospec() / LFENCE (x86) ve CSDB (Arm), copy-from-user yollarında speculation'ı serialize eder.
  • Site-by-site hardening. Variant 1'in toptan bir microcode fix'i yoktur; vulnerable bounds-checked gadget'lar belirlenip tek tek patch'lenmelidir.
  • Sandbox / process isolation ki sızdırılan bir byte bir security domain'i geçemesin, artı cache channel'ı zayıflatmak için azaltılmış timer resolution'ı.
  • Kernel'leri ve (nospec makroları ve barrier'ları uygulayan) language runtime'larını güncel tut; durumu yukarıdaki sysfs file üzerinden doğrula.

References