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:
- PHT'yi train et. Gadget'ı in-bounds
xile birçok kez çağır, böylece branch predictor "taken / in-bounds"'u öğrenir. - Channel'ı flush et.
array2'yi cache'ten evict et (bkz. Flush+Reload). - Mis-speculate ettir. Out-of-bounds bir
xile bir kez çağır. Core,array1[x]'i (bir secret byte) speculative olarak hesaplar ve bunu bounds check resolve olmadan önce spesifik birarray2line'ını load etmek için kullanır. - Recover et.
array2boyunca 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) veCSDB(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.