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: disabledSTIBP: forcedSTIBP: 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).