Speculative Store Bypass Disable¶
SSBD, load'ların örtüşen adreslere yapılan daha eski, çözülmemiş store'ları speculative olarak bypass etmesini durduran bir CPU control bit'i (IA32_SPEC_CTRL[SSBD]) set eder — Spectre Variant 4 (CVE-2018-3639) için mitigation.
Mechanism¶
Note
Kavramsal: NEDEN çalışır, invariant/teori.
Out-of-order CPU'lar bir memory disambiguation predictor kullanır: bir load hazır ama daha eski bir store'un adresi henüz hesaplanmamışken, predictor store ile load'un alias yapmadığını tahmin edebilir ve load'un memory/cache'te zaten var olan değere karşı speculative olarak çalışmasına izin verebilir. Tahmin yanlışsa (gerçekten örtüşüyorlarsa), load bayat bir değer okudu — daha eski store commit etmeden önce var olan değer. Pipeline sonradan çakışmayı tespit eder ve load'u architectural olarak yeniden çalıştırır, böylece programın nihai sonucu doğrudur.
Spectre Variant 4 ("Speculative Store Bypass", CVE-2018-3639), o düzeltmeden önceki transient pencereyi suistimal eder: bu sırada sandbox'lanmış bir attacker, bir load'a bayat bir değer okutabilir ve sonra onu, microarchitectural footprint'ini (cache state) attacker'ın ölçebileceği bağımlı bir operasyona forward edebilir. Bir dil sandbox'ında (ör. JIT'lenmiş bir JavaScript engine'i) bu, attacker'ın kontrol ettiği kodun okumaması gereken memory'yi okumasına izin verebilir.
Mitigation, Speculative Store Bypass Disable (SSBD), prediction'ı tamamen
kaldırır: IA32_SPEC_CTRL MSR'ında SSBD bit'ini set etmek core'a load'ları
çözülmemiş store'ların ötesinde speculate etme der — load, önceki store
adresleri bilinene kadar bekler. Geri getirilen invariant şudur: hiçbir load
değeri bir store-bypass misprediction'a bağlı olamaz. Bu güvenliğin bir
maliyeti vardır: load/store sıralamasını daha katı serialize eder ve dikkate
değer bir performance etkisi taşır; SSBD'nin varsayılan olarak her process için
koşulsuz enable edilmemesinin nedeni budur.
Linux, SSBD'yi birkaç policy ile sunar çünkü çoğu kod untrusted sandbox'lanmış kod barındırmaz ve ona ihtiyaç duymaz:
- off — speculative store bypass'ı asla disable etme (CPU'yu hızlı, vulnerable bırak).
- on — speculative store bypass'ı sistem genelinde koşulsuz disable et.
- auto — kernel CPU için uygun davranışı seçer.
- prctl — thread başına opt-in: bir process SSBD'yi
prctl()üzerinden ister. - seccomp —
prctlgibi, ama her seccomp-sandbox'lanmış thread, açıkça opt-out yapmadıkça varsayılan olarak SSBD alır.
x86'da bu güncellenmiş microcode (Intel) gerektirir; AMD implementasyonları da control'ü sunar. POWER ve arm64'ün benzer mitigation'ları var.
Walkthrough¶
Mevcut vulnerability/mitigation durumunu sysfs üzerinden kontrol edin:
Tipik çıktılar:
veya, hiçbir mitigation aktif değilken:
(Dosyanın yokluğu, çalışan kernel'in mitigation'dan önce olduğu anlamına gelir.)
Boot-zamanı policy'sini inceleyin:
Tek bir programı runtime'da SSBD'ye opt-in yapmak için, PR_SET_SPECULATION_CTRL
/ PR_SPEC_STORE_BYPASS ile prctl() kullanın:
#include <sys/prctl.h>
#include <stdio.h>
int main(void) {
/* Query current state */
int s = prctl(PR_GET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, 0, 0, 0);
printf("PR_SPEC_STORE_BYPASS state = %d\n", s);
/* Disable speculative store bypass for this thread (and children) */
if (prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS,
PR_SPEC_DISABLE, 0, 0) != 0)
perror("prctl PR_SPEC_DISABLE");
/* PR_SPEC_FORCE_DISABLE makes it permanent for all descendants */
return 0;
}
Yetkili bir host'ta compile edip çalıştırın:
Beklenen (örnek) çıktı, dönen flag'lerin prctl state'ini encode ettiği yerde (ör. enabled vs disabled bit'leri):
Detection¶
- sysfs dosyası
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass, yetkili durumdur:Vulnerable,Not affected, veya birMitigation: ...string'i. - Belirli bir process'in SSBD'sinin açık olup olmadığı yalnızca kendi
PR_GET_SPECULATION_CTRLsorgusu üzerinden görünür, global olarak değil.
Mitigation¶
spec_store_bypass_disable=seccompile boot edin (yaygın varsayılan policy): sandbox'lanmış (seccomp) workload'lar SSBD'yi otomatik alır; geri kalan her şey hızlı kalır.- Untrusted JIT'ler için,
prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_STORE_BYPASS, PR_SPEC_DISABLE)üzerinden açıkça opt-in yapın. - Microcode'u güncel tutun; Intel'de SSBD MSR bit'i bunu gerektirir.
- İlgili speculation savunmaları: bkz. indirect-branch-restricted-speculation ve retpoline.