Skip to content

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.
  • seccompprctl gibi, 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:

cat /sys/devices/system/cpu/vulnerabilities/spec_store_bypass

Tipik çıktılar:

Mitigation: Speculative Store Bypass disabled via prctl and seccomp

veya, hiçbir mitigation aktif değilken:

Vulnerable

(Dosyanın yokluğu, çalışan kernel'in mitigation'dan önce olduğu anlamına gelir.)

Boot-zamanı policy'sini inceleyin:

grep -o 'spec_store_bypass_disable=[a-z]*' /proc/cmdline

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:

cc -o ssbd_demo ssbd_demo.c && ./ssbd_demo

Beklenen (örnek) çıktı, dönen flag'lerin prctl state'ini encode ettiği yerde (ör. enabled vs disabled bit'leri):

PR_SPEC_STORE_BYPASS state = 2

Detection

  • sysfs dosyası /sys/devices/system/cpu/vulnerabilities/spec_store_bypass, yetkili durumdur: Vulnerable, Not affected, veya bir Mitigation: ... string'i.
  • Belirli bir process'in SSBD'sinin açık olup olmadığı yalnızca kendi PR_GET_SPECULATION_CTRL sorgusu üzerinden görünür, global olarak değil.

Mitigation

  • spec_store_bypass_disable=seccomp ile 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.

References