Skip to content

Single Thread Indirect Branch Predictors

STIBP, bir core üzerindeki SMT sibling thread'ler arasında indirect-branch prediction'ı izole eder ve cross-thread Spectre v2'yi (branch target injection) bloklar.

Mechanism

Note

STIBP (Single Thread Indirect Branch Predictors), bir indirect-branch control mekanizmasıdır ve bir logical processor üzerindeki indirect branch'lerin predicted target'larının, aynı physical core'un sibling logical processor'ında çalışan software tarafından etkilenmesini engeller.

Spectre v2 (Branch Target Injection, CVE-2017-5715), indirect Branch Target Buffer'ın (BTB) paylaşılan bir microarchitectural kaynak olması gerçeğini suistimal eder. Simultaneous multithreading (SMT / Hyper-Threading) ile iki logical processor bir core'un BTB'sini paylaşır. Bir thread'deki attacker, predictor'ı eğitebilir; böylece sibling thread'deki bir victim'in indirect branch'i attacker'ın seçtiği bir gadget'a mis-speculate eder ve bir cache side channel üzerinden secret'lar sızar.

STIBP bu spesifik cross-thread eğitim yolunu kapatır. Bir processor desteği CPUID.(EAX=07H,ECX=0):EDX[27] üzerinden enumerate eder. Bir logical processor'da IA32_SPEC_CTRL MSR'ının (adres 0x48) bit 1'ini (STIBP) set etmek, o core'un herhangi bir logical processor'ındaki indirect-branch target'larının aynı core'un başka bir logical processor'ındaki kod tarafından kontrol edilmesini engeller.

Teoriden iki sonuç çıkar:

  • STIBP'nin etkisi yalnızca SMT aktifken vardır. Core başına bir thread varken izole edilecek bir sibling yoktur, bu yüzden kernel onu çalışan SMT processor'ları olmayan sistemlerde arm etmez.
  • IBRS / enhanced IBRS yürürlükteyken zaten cross-thread injection'ı kapsar, bu yüzden STIBP ayrıca set edilmesi gerekmez. Intel eIBRS'te STIBP koruması ima edilir; AMD Automatic IBRS userspace'i korumaz ve legacy IBRS, userspace'e dönüşte bit'i temizler, bu yüzden o yollar STIBP'yi açıkça enable eder.

Walkthrough

STIBP, IA32_SPEC_CTRL MSR'ı üzerinden sunulur. Kavramsal olarak kernel, bit 1'i herhangi bir IBRS bit'inin yanında set eder:

IA32_SPEC_CTRL (MSR 0x48)
  bit 0  IBRS   - Indirect Branch Restricted Speculation
  bit 1  STIBP  - Single Thread Indirect Branch Predictors
  bit 2  SSBD   - Speculative Store Bypass Disable

Topyekûn STIBP, "indirect branch prediction'ı disable et"e yakın davrandığı ve SMT hardware'inde büyük regression'lara yol açtığı için, Linux onu spectre_v2_user= üzerinden opt-in yapar:

spectre_v2_user=prctl        # IBPB+STIBP off by default; per-process via prctl()
spectre_v2_user=prctl,ibpb   # IBPB applied globally; STIBP only for opted-in tasks
spectre_v2_user=seccomp      # like prctl, but seccomp tasks get STIBP unconditionally
spectre_v2_user=seccomp,ibpb # IBPB global; STIBP for seccomp + opted-in tasks
spectre_v2_user=on           # force STIBP/IBPB on
spectre_v2_user=off          # disable
spectre_v2_user=auto         # kernel chooses

STIBP durum satırı dahil runtime state'i kontrol edin:

cat /sys/devices/system/cpu/vulnerabilities/spectre_v2
# e.g. Mitigation: Enhanced IBRS, IBPB: conditional, RSB filling, ...; STIBP: conditional

sysfs raporu şunlardan birini kullanır:

  • STIBP: disabled
  • STIBP: forced
  • STIBP: conditional

Bir task, prctl() ile process başına koruma talep edebilir:

#include <sys/prctl.h>
prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_INDIRECT_BRANCH,
      PR_SPEC_DISABLE, 0, 0);   /* enable STIBP for this task */

Warning

Topyekûn STIBP büyük bir performance kaybı olabilir. Varsayılan değiştirilirken tartışıldığı gibi, onu geniş çapta enable etmek etkilenen workload'lar için indirect branch prediction'ı fiilen kapatır; kernel'in onu always-on yerine conditional/opt-in göndermesinin nedeni budur. STIBP ayrıca, gerçekten SMT-enabled processor'ları çalışmayan herhangi bir sistemde disable edilir.

Detection

/sys/devices/system/cpu/vulnerabilities/spectre_v2, STIBP'nin disabled, forced veya conditional olup olmadığını raporlar. CPUID leaf 7 EDX bit 27 hardware desteğini gösterir; IA32_SPEC_CTRL[1]'in değeri (msr driver üzerinden register 0x48 olarak okunabilir) şu an set olup olmadığını yansıtır.

Mitigation

Kapsam ve sınırlamalar:

  • Yalnızca cross-thread (sibling) yolu. STIBP, same-thread Spectre v2'yi ele almaz; bunun için retpoline, indirect-branch-restricted-speculation veya enhanced-ibrs gerekir. Ayrıca bir context switch içindeki önceki BTB eğitimini flush etmez — o indirect-branch-prediction-barrier (IBPB)'dir.
  • IBRS/eIBRS altında gereksiz. İlgili privilege transition'ları için IBRS aktifken STIBP gereksizdir, bu yüzden kernel onu çift-arm etmekten kaçınır.
  • SMT-kapılı. Aktif SMT sibling'leri olmadan etkisi yoktur (ve enable edilmez).

References