Skip to content

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_CMD bit 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:

$ grep -o 'ibpb' /proc/cpuinfo | head -1
ibpb

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.

References