Indirect Branch Prediction Barrier¶
IBPB, bir privilege/context sınırında indirect branch predictor'ları flush'layan bir x86 indirect-branch kontrolüdür (
IA32_PRED_CMDbit 0'a yazılır); böylece barrier öncesi yazılım, barrier sonrası indirect-branch tahminlerini yönlendiremez — Spectre-v2 cross-context BTI training'ine karşı kullanılır.
Mechanism¶
Note
IBPB'nin uyguladığı invariant: barrier'dan önce çalışan yazılım, aynı
logical processor üzerinde barrier'dan sonra yürütülen indirect branch'lerin
tahmin edilen hedeflerini kontrol edemez. Kernel barrier'ı, IA32_PRED_CMD
MSR'ına bit 0 (IBPB) set edilmiş şekilde bir WRMSR yaparak verir; bu, bir
attacker'ın poison etmiş olabileceği Branch Target Buffer durumunu invalidate
eder / flush'lar. Destek CPUID üzerinden enumerate edilir (IBRS'i enumerate
eden aynı Intel feature bit'i; AMD ise IBPB'yi ayrı enumerate eder).
Kernel Spectre belgelerine göre IBPB, bir context sınırında branch target buffer'ı temizlemek için kullanılır:
the Indirect Branch Prediction Barrier (IBPB) is issued to clear the branch target buffer when context switching to and from such process
Bu, farklı trust domain'lerindeki process'ler arasında isolation sağlar (ve STIBP'nin yanında user-space Spectre-v2 mitigation'ının bir parçasıdır).
Warning
IBPB, IBRS gibi kalıcı bir mode değil, tek seferlik bir barrier'dır.
Yalnızca yazma işleminden sonra yapılan tahminleri etkiler; kernel'in,
korumak istediği her sınırda (özellikle karşılıklı güvensiz process'ler
arasındaki context switch'ler ve VM exit'ler) onu yeniden vermesi gerekir.
IA32_PRED_CMD'ye yapılan bir WRMSR mimari olarak serializing değildir.
Walkthrough¶
Observe IBPB usage in the spectre_v2 sysfs node
Barrier'ın dağıtım policy'si Spectre v2 status string'inin bir parçası olarak raporlanır:
$ cat /sys/devices/system/cpu/vulnerabilities/spectre_v2
Mitigation: Enhanced IBRS, IBPB: conditional, RSB filling
IBPB: always-on, IBPB: conditional veya IBPB: disabled, kernel'in
context switch'te barrier'ı ne kadar agresif eklediğini yansıtır.
User-space IBPB policy'si kernel command line üzerinden kontrol edilir, örn.:
spectre_v2_user=on # always issue IBPB on context switch + STIBP
spectre_v2_user=prctl # opt-in per task via prctl(PR_SET_SPECULATION_CTRL)
spectre_v2_user=seccomp # IBPB for seccomp-confined tasks
CPU'nun feature'ı enumerate ettiğini doğrula:
Detection¶
/proc/cpuinfo flag'lerinde ibpb'nin bulunması hardware/microcode desteğini
gösterir; spectre_v2 sysfs node'undaki IBPB: alanı, kernel'in onu kullanıp
kullanmadığını ve nasıl kullandığını gösterir.
Mitigation¶
IBPB, tam Spectre-v2 kapsaması için retpoline / IBRS / enhanced IBRS ile ve SMT boyutu için STIBP ile birlikte çalışır. Indirect Target Selection (CVE-2024-28956), güncellenmiş microcode uygulanmadığı sürece IBPB'nin bazı parçalarda zayıflatılabildiğini gösterdi. Bunların hepsi microcode mitigations'a bağlıdır.