文章目录
- 前言
- 一、Speculative Execution Side Channel Methods
- 二、Attack scenarios
- 三、Spectre system information
- 四、Turning on mitigation for Spectre variant 1 and Spectre variant 2
- 五、Mitigation control on the kernel command line
- 六、Mitigation selection guide
- 参考资料
前言
Spectre是两个最初的瞬态执行CPU漏洞之一(另一个是Meltdown),涉及微架构定时侧信道攻击。这些漏洞影响执行分支预测和其他形式的推测的现代微处理器。在大多数处理器上,由于分支预测错误导致的推测执行可能会留下可观察的副作用,这些副作用可能会将私有数据暴露给攻击者。例如,如果此类推测执行所执行的内存访问模式取决于私有数据,那么数据缓存的状态构成了一个侧信道,攻击者可以利用时序攻击从中提取有关私有数据的信息。
与Spectre相关的两个常见漏洞和暴露标识(Common Vulnerabilities and Exposures IDs)是CVE-2017-5753(边界检查绕过,Spectre-V1,Spectre 1.0)和CVE-2017-5715(分支目标注入,Spectre-V2)。发现用于JavaScript的JIT引擎存在漏洞。一个网站可以读取存储在浏览器中的另一个网站的数据,或者读取浏览器本身的内存。
2018年初,英特尔报告称将重新设计其CPU以帮助防护Spectre和相关的Meltdown漏洞(尤其是Spectre变种2和Meltdown,但不包括Spectre变种1)。2018年10月8日,据报道,英特尔已将有关Spectre和Meltdown漏洞的硬件和固件缓解措施添加到其最新的处理器中。
Spectre是一类侧信道攻击(side channel attacks),利用现代CPU中的分支预测和乱序执行特性来读取内存中的数据,可能绕过访问控制。具体来说,Spectre利用了CPU中的分支预测和乱序执行机制,通过推测执行的方式读取内存中的敏感信息。
这里所提到的文档涵盖了Spectre的Variant 1和Variant 2两个变种。
推测执行(Speculative execution)的侧信道方法影响了广泛的现代高性能处理器,因为大多数现代高速处理器都使用了分支预测和推测执行技术。
由于现代高性能处理器广泛采用了分支预测和推测执行机制,因此这些处理器都存在受到Spectre漏洞影响的风险。这包括许多主流的处理器架构和制造商,如Intel、AMD和ARM等。
以下CPU易受攻击:
Intel Core, Atom, Pentium, and Xeon processors
AMD Phenom, EPYC, and Zen processors
IBM POWER and zSeries processors
Higher end ARM processors
Apple CPUs
Higher end MIPS CPUs
Likely most other high performance CPUs. Contact your CPU vendor for details.
可以从sysfs中的Spectre漏洞文件中读取处理器是否受到影响。
以下CVE条目描述Spectre变体:
CVE-2017-5753 | Bounds check bypass | Spectre variant 1 |
CVE-2017-5715 | Branch target injection | Spectre variant 2 |
CVE-2019-1125 | Spectre v1 swapgs | Spectre variant 1 (swapgs) |
处理器使用推测执行操作来提高性能。这种推测执行的过程可能会在处理器的缓存、缓冲区和分支预测器中留下内存访问或计算的痕迹。恶意软件可以通过影响推测执行路径,利用处理器缓存和缓冲区中推测执行的副作用,推断出在推测执行期间访问的特权数据。
分支预测一般有两种情况:
(1)预测方向
(2)预测目标地址(直接跳转和间接条状)
Spectre Variant 1利用了条件分支(预测方向)的推测执行,而Spectre Variant 2则利用了间接分支(预测目标地址)的推测执行,以泄露特权内存。
(1)在Spectre Variant 1攻击中,恶意软件利用了条件分支的推测执行。当处理器在执行条件分支时,会根据预测的分支方向进行推测执行,即使分支的条件尚未完全确定。攻击者可以通过精心构造的代码序列,使得处理器错误地预测分支的方向,从而导致推测执行的分支访问了本应该受限制的内存,进而泄露敏感信息。
if(test-expr)
then-statement
else
else-statement
预测Taken or Not Taken。
条件分支预测器是一种分支预测器的类型,专门用于预测条件分支指令(如if…else…语句)的执行结果,即判断是否需要进入条件分支。
条件分支预测器通过观察程序的历史执行情况,尤其是条件分支指令的结果,来进行预测。它会记录条件分支指令的历史执行结果,比如条件为真或假的次数,并根据这些信息进行预测。
当程序执行到条件分支指令时,条件分支预测器会根据历史执行结果进行预测。如果预测为"进入"(Taken),即预测条件为真,处理器会执行条件分支中的代码块。如果预测为"不进入"(Not Taken),即预测条件为假,处理器会跳过条件分支中的代码块。
预测的准确性对程序的性能影响很大。如果预测准确,处理器可以提前准备好相应的指令和数据,避免流水线中断和延迟,提高执行效率。然而,如果预测错误,处理器需要废弃之前准备的指令和数据,重新执行不同的代码路径,导致性能下降。
(2)Spectre Variant 2攻击则利用了间接分支的推测执行。在程序执行过程中,存在一些间接分支,其目标地址取决于程序运行时的条件。恶意软件可以通过欺骗处理器的分支预测器,使其错误地预测间接分支的目标地址,从而导致执行恶意代码。这种攻击方式使得攻击者能够访问特权内存,将其内容泄露出来。
call *operand
jmp *operand
ret
预测目标地址。
分支目标预测器作用于间接跳转一类的指令例如 call rax、jmp [rax],他的作用是预测出跳转的目标地址,所以他的输出就是虚拟地址。
间接call和jmp的跳转目标是从寄存器或者内存位置中读出中,运行时才知道目标地址。
大部分程序中使用的间接跳转指令是用于调用子程序的 call/return 类型的指令,这类指令有着很强的规律性,容易被预测。
目前Linux 内核:
对于 Spectre Variant 1的防护措施使用array_index_nospec宏。
对于 Spectre Variant 2的防护措施使用"retpoline"机制。
更多关于这两种Spectre的文章请参考:https://lwn.net/Kernel/Index/#Security-Meltdown_and_Spectre
一、Speculative Execution Side Channel Methods
1.1 Speculative Execution
(1)推测执行是大多数现代高性能处理器用于提高性能的主要技术之一。推测执行的概念是在未确定其是否需要之前,提前执行指令。如果没有推测执行,处理器在执行后续指令之前需要等待前面的指令解析完毕。通过推测执行指令,可以通过最小化延迟和提取更大的并行性来提高性能。如果发现这些指令实际上不需要,执行的结果将被丢弃。
最常见的推测执行形式涉及程序的控制流。处理器使用一套高度复杂的机制来预测控制流,而不是等待所有分支指令解析以确定需要执行哪些操作。通常情况下,这些预测是正确的,这样就可以通过隐藏确定控制流的操作的延迟和增加处理器可以分析的指令池的并行性来实现高性能。然而,如果预测错误,那么被推测执行的工作将被丢弃,处理器将被重定向到正确的指令路径上执行。
尽管推测操作不会影响处理器的体系结构状态,但它们可以影响微体系结构状态,以创建偶发通道,例如修改缓存、转译查找缓冲器(Translation Lookaside Buffers — TLB)、微体系结构预测器和预取器中存储的内容。还可能存在其他偶发通道,如资源争用。侧信道方法利用了这样一个事实,即这些偶发通道(如缓存)可能会受到推测执行的影响。
简单点来说:
现代处理器(CPU)的运作机制中存在两个用于加速执行的特性,推测执行( Speculative Execution)和间接分支预测( Indirect Branch Prediction)。
表面上看,处理器是依次顺序执行既定的处理器指令。但是,现代处理器为了更好利用处理器资源,已经开始启用并行执行,这个技术已经应用了20年左右 (1995 年开始)。假设,基于猜测或概率的角度,在当前的指令或分支还未执行完成前就开始执行可能会被执行的指令或分支,会发生什么?如果猜对了,直接使用, CPU 执行加速了。如果猜测不正确,则取消操作并恢复到原来的现场(寄存器,内存等),结果会被忽略。整个过程并不会比没有猜测的时候慢,即 CPU的推测执行( Speculative Execution )技术。
不幸的是,尽管架构状态被回滚了,仍然有些副作用,比如TLB或缓存状态并没有被回滚。这些副作用随后可以被黑客通过旁道攻击 (Side Channel Attack) 的方式获取到缓存的内容。如果攻击者能触发推测执行去访问指定的敏感数据区域的话,就可能可以读取到更高特权级的敏感数据。
(2)Spectre是一种漏洞,它欺骗程序以访问程序内存空间中的任意位置。攻击者可以读取已访问内存的内容,从而可能获取敏感数据。
Spectre并不是一个单一且容易修复的漏洞,而是一类潜在漏洞。根据Spectre的研究论文,这些漏洞都基于利用推测执行的副作用,这是一种在现代微处理器中常用的隐藏内存延迟并加速执行的方法。具体而言,Spectre侧重于分支预测,这是推测执行的一个特例。与同时披露的相关漏洞Meltdown不同,Spectre并不依赖于单个处理器的内存管理和保护系统的特定功能,而是一个更广义的概念。
研究论文的出发点是将侧信道时序攻击应用于具有推测执行的现代微处理器的分支预测机制。在处理器数据手册中记录的体系结构层面上,任何错误预测的结果都应该被丢弃,但由此产生的推测执行仍可能留下副作用,例如已加载的缓存行。这些副作用可以影响后续的计算环境的非功能方面。如果这些副作用(包括但不限于内存访问时序)对恶意程序可见,并且可以被设计为依赖于受害进程持有的敏感数据,那么这些副作用可能导致这些数据变得可辨识。即使在正式的体系结构级安全安排按设计工作的情况下,这种情况仍可能发生,这时候,低层次的微体系结构级代码优化可能会泄露与正常程序执行的正确性无关的信息。
1.2 Side Channel Cache Methods
侧信道方法通过观察系统(例如测量系统的微体系结构属性)来获取信息。与缓冲区溢出和其他漏洞类别不同,侧信道不直接影响程序的执行,也不允许数据被修改或删除。
缓存时序侧信道涉及代理程序检测特定级别的处理器缓存中是否存在某个数据,其存在可以用来推断其他一些信息。一种检测所讨论的数据是否存在的方法是使用计时器来测量访问该地址的内存延迟。如果内存访问花费的时间很短,则表示数据必定存在于附近的缓存中。如果访问时间较长,则表示数据可能不在附近的缓存中。
几个安全研究人员和团队已经确定了几种可能利用缓存时序侧信道泄露机密信息的方法。
1.3 Spectre variant
1.3.1 Spectre variant 1 (Bounds Check Bypass)
边界检查绕过是一种利用条件分支指令后可能发生的推测执行的侧信道方法。边界检查绕过攻击(The bounds check bypass attack)利用了绕过用于内存访问边界检查的条件分支指令的推测执行(例如,检查数组索引是否在有效范围内进行内存访问)。这导致在验证检查解决之前,对无效内存(超出边界的索引)进行推测性内存访问。这种推测性内存访问可能会留下副作用,从而创建侧信道,将信息泄漏给攻击者。
有一些Spectre Variant 1攻击的扩展用于通过网络读取数据。然而,此类攻击难以实施,带宽较低,易受干扰,并被认为风险较低。
需要注意的是,尽管“Bounds Check Bypass”是其名称,Spectre Variant 1不仅仅涉及用户控制的数组边界检查。它可以影响任何条件检查。内核入口代码中的中断、异常和NMI处理程序都具有条件的swapgs检查。在Spectre Variant 1的情况下,这可能成为问题,因为内核代码可能会以用户GS的身份进行推测性运行。
Intel:
边界检查绕过方法利用了条件分支指令之后的推测执行。恶意行为者发现或造成了“困惑代理(confused deputy)”代码的创建,使攻击者能够利用推测操作推断出通常对其不可访问的信息。
该方法利用处理器在检查输入是否在边界内时进行的推测操作,例如检查正在读取的数组的索引是否在可接受的值范围内。它利用在边界检查解析之前进行的推测性内存访问来访问超出边界的内存。在某些情况下,这些内存访问可以被利用以向攻击者泄漏信息。
如果攻击者能够在较高权限级别中识别出适当的“困惑代理”,恶意行为者可能会利用该代理来推断出可由代理访问但对攻击者不可访问的内存内容。
这种技术的一个子变种称为边界检查绕过存储(bounds check bypass store),其使用推测存储来覆盖较新的推测加载,从而创建一个由恶意行为者控制的侧信道。
请参阅下面的边界检查旁路存储序列示例:
int function(unsigned bound, unsigned long user_key) {
unsigned long data[8];
/* bound is trusted and is never more than 8 */
for (int i = 0; i < bound; i++){
data[i] = user_key;
}
return 0;
}
以上代码序列有可能在推测执行过程中使用user_key来覆盖栈上的返回地址,从而允许恶意行为者指定一个实际上是泄露工具指令指针的user_key,以便进行推测性执行。
下面的步骤描述了使用这种方法进行示例攻击可能发生的情况:
(1)CPU的条件分支预测器错误地预测循环将执行10次,尽管实际上循环应该只执行8次。在第10次迭代之后,预测器将解析并执行后续指令。然而,循环的第9次迭代可能会在推测执行中覆盖栈上的返回地址。
(2)CPU解码RET指令,并根据返回栈缓冲器(RSB)中的预测推测性地获取指令。CPU可能会推测性地执行这些指令。
(3)RET指令加载它认为位于栈顶的值(来自步骤1中user_key的推测性存储),并将指令指针重定向到该值。在步骤2中推测性执行的任何操作结果都会被丢弃。
(4)user_key指令指针处的泄漏工具(由恶意行为者指定)在推测执行中执行,并创建一个可用于泄露恶意行为者指定数据的侧信道。
(5)应该结束循环的条件跳转执行,将指令指针重定向到循环后的下一条指令。这会丢弃在栈上覆盖返回地址的推测性存储,以及步骤1和步骤4之间的所有其他操作。
(6)CPU再次执行RET指令,程序继续执行。
SMEP(Supervisor Mode Execution Prevention,监管模式执行预防)可以防止该攻击导致监管模式RET推测性地执行用户模式页中的代码。控制流执行技术(Control flow Enforcement Technology — CET)也可以帮助防止在错误的间接分支目标上进行推测性执行。有关详细信息,请参阅《分析潜在的边界检查绕过存储攻击漏洞》白皮书中的边界检查绕过存储攻击部分。
可以通过以下几种方式缓解这个示例中的攻击:
(1)在RET指令之前(循环结束后)应用LFENCE指令,可以防止推测执行泄露敏感信息。
(2)使用边界剪裁技术确保存储操作不会超出数组的边界,即使是在推测性执行中,可以避免返回地址被覆盖。
(3)实施适当的检查和验证,以检测不正确的返回指针,并确保返回操作不会推测性地使用错误的值,也可以缓解这种攻击。
1.3.2 Spectre variant 2 (Branch Target Injection)
分支目标注入攻击利用了对间接分支的推测执行。处理器内部用于猜测间接分支目标的间接分支预测器可以被攻击者所影响,从而导致推测性地执行了小工具代码,从而暴露了受害者所触及的敏感数据。在推测执行期间留在CPU缓存中的副作用可以被测量,从而推断出数据的值。
在Spectre Variant 2攻击中,攻击者可以通过污染用于预测间接分支地址的CPU的分支目标缓冲区,将受害者的推测性间接分支引导到小工具代码中。这种污染可以通过间接分支进入现有代码来实现,攻击者可以控制间接分支的地址偏移量。由于受影响的硬件上的分支预测不能完全区分分支地址并使用偏移量进行预测,这可能导致特权代码的间接分支跳转到具有相同偏移量的小工具代码。
最有用的小工具接受攻击者控制的输入参数(例如寄存器值),从而可以控制内存读取。没有输入参数的小工具可能也是可能的,但攻击者对可以读取的内存几乎没有控制,从而降低了攻击泄露有用数据的风险。
另一种Variant 2攻击的方式是攻击者污染返回栈缓冲器(RSB),以导致推测性子程序返回指令执行跳转到小工具代码。攻击者不平衡的子程序调用指令可能会"污染"返回栈缓冲器中的条目,这些条目稍后会被受害者的子程序返回指令使用。可以通过在上下文切换或虚拟机(VM)退出时刷新返回栈缓冲器来缓解此类攻击。
在具有同时多线程(SMT)的系统中,攻击可能来自兄弟线程,因为一级缓存和分支目标缓冲器(BTB)可能在CPU核心的硬件线程之间共享。在兄弟线程上运行的恶意程序可以影响其对等线程的BTB,将其间接分支的推测引导到小工具代码,并测量一级缓存中推测执行的副作用,以推断出受害者的数据。
Variant 2的另一种攻击方式是攻击者污染分支历史缓冲器(BHB),以推测性地将间接分支引导到特定的分支目标缓冲器(BTB)条目,即使该条目与间接分支的源地址不相关。具体而言,即使存在增强型IBRS,BHB可能在特权级别之间共享。
目前,已知的现实世界中的BHB攻击向量仅通过非特权的eBPF实现。因此,强烈建议不要启用非特权的eBPF,特别是在使用eIBRS时(没有retpolines)。为了完全缓解BHB攻击,建议使用retpolines(或结合retpolines的eIBRS)。
Intel:
分支目标注入(branch target injection)方法利用处理器内部的间接分支预测器来指导推测性执行的操作。通过影响间接分支预测器的操作方式,攻击者可以导致恶意代码被推测性执行,并利用该代码对缓存的影响来推断数据值。
对于条件直接分支(conditional direct branches),推测性执行的代码只能是分支目标或者直接跟随分支指令的后续指令。攻击者无法导致代码在这些位置之外的地方被推测性执行。然而,间接分支可以导致在更广泛的目标上推测性执行代码。这种方法通过使间接分支推测性执行一个“gadget”(指令片段),从而创建一个基于敏感数据的侧信道。
干扰处理器的预测器以引发这种侧信道的能力高度依赖于微架构的实现,因此具体使用的方法可能在不同的处理器系列和代数之间有所差异。例如,一些处理器实现的间接分支预测器可能只使用地址的子集来索引预测器。如果攻击者可以确定使用的哪些位子集,攻击者可以利用这些信息来创建由于别名(aliasing)而引发的干扰。同样,在支持Intel® Hyper-Threading Technology(Intel® HT Technology)的处理器上,一个线程的行为是否可以影响另一个线程的预测也是需要考虑的因素。分支目标注入方法只适用于近间接分支指令。
二、Attack scenarios
以下攻击场景列表已被预期,但可能不包括所有可能的攻击向量。
2.1 A user process attacking the kernel
2.1.1 Spectre variant 1
攻击者通过寄存器或在系统调用期间通过已知内存地址向内核传递参数。内核可能会稍后将该参数用作数组的索引或导出指针,以进行Spectre Variant 1攻击。索引或指针是无效的,但在用于推测执行的代码分支中绕过了边界检查。这可能导致访问和泄漏特权内存。
针对已经确定存在数据指针可能受Spectre攻击影响的内核代码,使用新的"nospec"访问器宏来防止对数据的推测性加载。
2.1.2 Spectre variant 1 (swapgs)
省略
2.1.3 Spectre variant 2
在发出系统调用之前,Spectre Variant 2攻击者可以污染分支目标缓冲器(BTB),以发动攻击。进入内核后,内核可能在间接跳转时使用被污染的分支目标缓冲器,并在推测执行中跳转到小工具代码。
如果攻击者试图控制在推测执行期间泄漏的内存地址,他还需要通过寄存器或内存中已知的地址向小工具传递参数。小工具执行完毕后,攻击者可以测量其副作用。
内核可以通过为所有间接分支使用返回跳板(也称为"retpoline")来防止使用受污染的分支目标缓冲器条目。返回跳板会捕获推测执行路径,以防止在推测执行期间跳转到小工具代码。具备硬件中提供的增强型间接分支受限制推测(Enhanced IBRS)功能的x86 CPU应该使用该功能来缓解Spectre Variant 2,而不是使用retpoline。增强型IBRS比retpoline更高效。
固件中可能存在可以被恶意用户进程利用的小工具代码,可以通过Spectre Variant 2攻击进行利用。为了减轻在x86上发生此类攻击的风险,在内核调用任何固件代码之前,应启用间接分支受限制推测(IBRS)功能。
2.2 A user process attacking another user process
恶意用户进程可以尝试攻击另一个用户进程,无论是通过在同一硬件线程上进行上下文切换,还是通过在同时多线程(SMT)系统上共享物理处理器核心的兄弟超线程进行攻击。
Spectre Variant 1攻击通常需要在进程之间传递参数,这需要存在数据传递关系,例如远程过程调用(RPC)。这些参数在小工具代码中被用于导出访问受攻击进程中特权内存的无效数据指针。
Spectre Variant 2攻击可以通过污染分支目标缓冲器来从恶意进程中发起。这可以影响受害进程的间接分支目标,无论是在同一硬件线程上稍后运行,还是在共享同一物理核心的兄弟硬件线程上同时运行。
用户进程可以使用prctl()系统调用来禁用自身的间接分支推测,从而保护自己免受Spectre Variant 2攻击。管理员还可以通过禁用进程的间接分支推测来隔离不安全的进程,以防止其污染分支目标缓冲器。由于不使用间接分支推测并清除分支目标缓冲器,这会带来性能成本。在x86上启用SMT时,对于禁用间接分支推测的进程,将启用单线程间接分支预测器(STIBP)[4],以防止兄弟线程控制分支目标缓冲器。此外,在与此类进程进行上下文切换时,将发出间接分支预测屏障(IBPB)以清除分支目标缓冲器。
在x86上,上下文切换时会填充返回栈缓冲器。这可以防止在切换到更深的调用堆栈时,返回栈缓冲器下溢时使用分支目标缓冲器进行分支预测。上一个进程留下的任何污染条目也将被清除。
用户程序应该使用地址空间随机化来增加攻击的难度(设置/proc/sys/kernel/randomize_va_space = 1或2)。
2.3 A virtualized guest attacking the host
在虚拟化环境中,客户机攻击宿主机的机制与用户进程攻击内核类似。通过超级调用或其他虚拟化退出路径进入内核。
对于Spectre Variant 1攻击,恶意客户机可以通过超级调用传递参数(例如寄存器),以导出用于在进入内核后推测访问特权内存的无效指针。对于已经确定存在此类内核代码的位置,使用nospec访问器宏来阻止推测性内存访问。
对于Spectre Variant 2攻击,恶意客户机可以污染分支目标缓冲器或返回栈缓冲器,导致内核在推测执行路径中跳转到小工具代码。
为了缓解Variant 2攻击,宿主机内核可以对间接分支使用返回跳板来绕过被污染的分支目标缓冲器,并在虚拟机退出时刷新返回栈缓冲器。这可以防止恶意客户机影响宿主机内核中的间接分支。
为了保护宿主进程免受恶意客户机的攻击,宿主进程可以通过prctl()禁用间接分支推测。在切换到这些进程之前,分支目标缓冲器将被清除。
2.4 A virtualized guest attacking other guest
一个恶意客户机可能会攻击另一个客户机,以获取另一个客户机可访问的数据。
如果参数可以在客户机之间传递,那么Spectre Variant 1攻击是可能的。这可以通过共享内存或消息传递等机制来实现。这些参数可以用于导出受攻击客户机中特权数据的数据指针。在受害客户机的推测路径中,小工具代码可以访问这些特权数据。
Spectre Variant 2攻击可以通过污染分支目标缓冲器或返回栈缓冲器来从恶意客户机中发起。这些污染条目可以用于影响受害客户机中的推测执行路径。
Linux内核通过在虚拟机退出时刷新返回栈缓冲器,并在切换到新客户机之前清除分支目标缓冲器,来缓解对在同一CPU硬件线程上运行的其他客户机的攻击。
如果使用了SMT,管理员可以通过通过prctl()关闭不受信任的客户机的间接分支推测来缓解兄弟超线程中的Spectre Variant 2攻击。客户机还可以通过在客户机内部启用基于微码的缓解措施(例如在x86上的IBPB或STIBP)来保护自身。
三、Spectre system information
Linux内核提供了一个sysfs接口,允许用户检查系统对Spectre漏洞的当前缓解状态。
3.1 spectre_v1
显示Spectre变体1缓解状态的sysfs文件为:
/sys/devices/system/cpu/vulnerabilities/spectre_v1
此文件中可能的值为:
‘Not affected’ | 处理器不易受攻击。 |
‘Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers’ | swapgs保护被禁用;否则,它在内核中通过显式指针卫生和usercopy LFENCE屏障在逐个案例的基础上进行保护。 |
‘Mitigation: usercopy/swapgs barriers and __user pointer sanitization’ | 内核中的保护是基于具体情况的,并包括显式指针清理、usercopy LFENCE屏障和swapgs LFENCE屏障。 |
centos 7(3.10.0 - Intel x86_64):
# cat /sys/devices/system/cpu/vulnerabilities/spectre_v1
Mitigation: Load fences, usercopy/swapgs barriers and __user pointer sanitization
ubuntu20.04(5.15.0 - Intel x86_64):
# cat /sys/devices/system/cpu/vulnerabilities/spectre_v1
Mitigation: usercopy/swapgs barriers and __user pointer sanitization
可以看到这两个系统都是:
‘Mitigation: usercopy/swapgs barriers and __user pointer sanitization’
在处理涉及潜在漏洞的内核代码路径时,内核采取了显式指针清理的措施。这意味着在使用内存指针之前,内核会进行严格的验证和清理,以防止攻击者利用推测执行攻击的无效指针。
此外,在涉及从用户空间复制数据的内核代码路径中,内核还使用了usercopy LFENCE屏障。这些屏障是通过插入LFENCE指令来创建序列化点,确保推测执行不会越过屏障并访问可能的敏感数据。
另外,swapgs LFENCE屏障也被用于保护。swapgs指令的使用在上下文切换中是必要的,但为了减轻Spectre漏洞的影响,内核在swapgs指令的前后插入LFENCE指令,以确保推测执行不会越过这些屏障。
然而,这些保护措施是基于具体情况逐个实施的,并不能保证覆盖Spectre Variant 1的所有可能攻击向量。
3.2 spectre_v2
spectre_v2内核文件会报告内核是否已经编译了retpoline缓解措施,或者CPU是否具备硬件缓解措施,以及CPU是否支持额外的进程特定缓解措施。
该文件还会报告由微码启用的CPU功能,用于缓解用户进程之间的攻击:
间接分支预测栏障(IBPB):在不同用户的进程之间添加额外的隔离。
单线程间接分支预测器(STIBP):在同一核上运行的CPU线程之间添加额外的隔离。
这些CPU功能在使用时可能会影响性能,并可以基于具体情况逐个进程启用。
这些特性的启用可以提供额外的隔离,以减轻Spectre漏洞的影响。然而,由于对性能的影响,启用这些特性可能需要谨慎评估,并根据具体情况逐个进程进行启用。
显示Spectre变体2缓解状态的sysfs文件为:
/sys/devices/system/cpu/vulnerabilities/spectre_v2
此文件中可能的值为:
(1)Kernel status:
‘Not affected’ | 处理器不易受攻击 |
‘Mitigation: None’ | Vulnerable, no mitigation |
‘Mitigation: Retpolines’ | Use Retpoline thunks |
‘Mitigation: LFENCE’ | Use LFENCE instructions |
‘Mitigation: Enhanced IBRS’ | Hardware-focused mitigation |
‘Mitigation: Enhanced IBRS + Retpolines’ | Hardware-focused + Retpolines |
‘Mitigation: Enhanced IBRS + LFENCE’ | Hardware-focused + LFENCE |
(2)Firmware status:显示在调用固件时是否使用间接分支受限制预测(IBRS)来保护免受Spectre Variant 2攻击(仅适用于x86架构)。
‘IBRS_FW’ | 调用固件时防止用户程序攻击 |
(3)Indirect branch prediction barrier (IBPB) status:间接分支预测栏障(IBPB)的状态用于在不同用户的进程之间提供保护。该功能可以通过prctl()系统调用针对每个进程进行控制,或通过内核命令行选项进行控制。这是一个仅适用于x86架构的特性。
‘IBPB: disabled’ | IBPB unused |
‘IBPB: always-on’ | Use IBPB on all tasks |
IBPB: conditional’ | Use IBPB on SECCOMP or indirect branch restricted tasks |
(4)Single threaded indirect branch prediction (STIBP) status:单线程间接分支预测(STIBP)的状态用于在不同超线程之间提供保护。该功能可以通过prctl()系统调用针对每个进程进行控制,或通过内核命令行选项进行控制。这是一个仅适用于x86架构的特性。
‘STIBP: disabled’ | STIBP unused |
‘STIBP: forced’ | Use STIBP on all tasks |
‘STIBP: conditional’ | Use STIBP on SECCOMP or indirect branch restricted tasks |
(5)Return stack buffer (RSB) protection status:
‘RSB filling’ | Protection of RSB on context switch enabled |
(6)EIBRS Post-barrier Return Stack Buffer (PBRSB) protection status:
‘PBRSB-eIBRS: SW sequence | CPU is affected and protection of RSB on VMEXIT enabled |
‘PBRSB-eIBRS: Vulnerable’ | CPU is vulnerable |
‘PBRSB-eIBRS: Not affected’ | CPU is not affected by PBRSB |
完整的缓解措施可能需要来自CPU供应商的微码更新。当所需的微码不可用时,内核将报告漏洞存在。
对于某些漏洞,如Spectre和Meltdown,需要结合软件和硬件层面的缓解措施才能完全解决。软件层面的缓解通常是通过操作系统内核的更新来实现,而硬件层面的缓解则需要来自CPU供应商的微码更新。
centos7 (3.10.0 - Intel x86_64):
# cat /sys/devices/system/cpu/vulnerabilities/spectre_v2
Mitigation: Full retpoline, IBPB
ubuntu20.04(5.15.0 - Intel x86_64):
# cat /sys/devices/system/cpu/vulnerabilities/spectre_v2
Mitigation: IBRS, IBPB: conditional, STIBP: disabled, RSB filling, PBRSB-eIBRS: Not affected
四、Turning on mitigation for Spectre variant 1 and Spectre variant 2
4.1 Kernel mitigation
(1)对于Spectre variant 1使用 array_index_nospec 宏:
// linux-5.15/include/linux/nospec.h
/*
* array_index_nospec - sanitize an array index after a bounds check
*
* For a code sequence like:
*
* if (index < size) {
* index = array_index_nospec(index, size);
* val = array[index];
* }
*
* ...if the CPU speculates past the bounds check then
* array_index_nospec() will clamp the index within the range of [0,
* size).
*/
#define array_index_nospec(index, size) \
({ \
typeof(index) _i = (index); \
typeof(size) _s = (size); \
unsigned long _mask = array_index_mask_nospec(_i, _s); \
\
BUILD_BUG_ON(sizeof(_i) > sizeof(long)); \
BUILD_BUG_ON(sizeof(_s) > sizeof(long)); \
\
(typeof(_i)) (_i & _mask); \
})
(1)对于Spectre variant 2使用 retpoline 机制:
// linux-5.15/arch/x86/lib/retpoline.S
.macro RETPOLINE reg
ANNOTATE_INTRA_FUNCTION_CALL
call .Ldo_rop_\@
.Lspec_trap_\@:
UNWIND_HINT_EMPTY
pause
lfence
jmp .Lspec_trap_\@
.Ldo_rop_\@:
mov %\reg, (%_ASM_SP)
UNWIND_HINT_FUNC
ret
.endm
4.1.1 Spectre variant 1
对于Spectre Variant 1,通过代码审核或扫描工具确定的存在漏洞的内核代码将根据具体情况使用nospec访问宏来进行 bounds clipping,以避免泄露可用的漏洞利用。然而,这可能无法覆盖Spectre Variant 1的所有攻击向量。
对于来自用户空间的代码,使用 LFENCE barrier 来阻止access_ok()检查被错误地预测。这个barrier是通过barrier_nospec()宏实现的。
对于Spectre Variant 1的swapgs变种,根据需要在中断、异常和NMI入口处添加 LFENCE barriers 。这些 barriers 是通过FENCE_SWAPGS_KERNEL_ENTRY和FENCE_SWAPGS_USER_ENTRY宏实现的。
总结:缓解措施:修改软件程序以防止推测性加载。
(1)在大多数体系结构上,这需要插入串行化指令(例如“lfence”)。
代码示例:
If (untrusted_offset < limit) {
serializing_instruction(); // lfence 指令 -- prevent load speculation
trusted_value = trusted_data[untrusted_offset];
tmp = other_data[(trusted_value)&mask];
...
}
serializing_instruction(); // lfence 指令 -- prevent load speculation
(2)Linux添加了新的“nospec”访问器宏,以防止推测性加载。
代码示例:
If (untrusted_offset < limit) {
untrusted_offset = array_index_nospec(untrusted_offset, limit); //clamps value of untrusted_offset
trusted_value = trusted_data[untrusted_offset];
tmp = other_data[(trusted_value)&mask];
...
}
untrusted_offset = array_index_nospec(untrusted_offset, limit); //clamps value of untrusted_offset
// /linux-5.15/include/linux/nospec.h
/*
* array_index_nospec - sanitize an array index after a bounds check
*
* For a code sequence like:
*
* if (index < size) {
* index = array_index_nospec(index, size);
* val = array[index];
* }
*
* ...if the CPU speculates past the bounds check then
* array_index_nospec() will clamp the index within the range of [0,
* size).
*/
#define array_index_nospec(index, size) \
({ \
typeof(index) _i = (index); \
typeof(size) _s = (size); \
unsigned long _mask = array_index_mask_nospec(_i, _s); \
\
BUILD_BUG_ON(sizeof(_i) > sizeof(long)); \
BUILD_BUG_ON(sizeof(_s) > sizeof(long)); \
\
(typeof(_i)) (_i & _mask); \
})
(2)Spectre variant 2
针对Spectre Variant 2的缓解措施,编译器会将内核中的间接调用或跳转转换为等效的返回跳板(retpolines),以达到目标地址。在retpolines下,推测执行路径将被陷入无限循环,以防止任何推测执行跳转到漏洞利用代码段。
为了在受漏洞影响的CPU上启用retpoline缓解措施,内核需要使用支持-mindirect-branch=thunk-extern -mindirect-branch-register选项的gcc编译器进行编译。如果内核使用Clang编译器进行编译,编译器需要支持-mretpoline-external-thunk选项。内核配置的CONFIG_MITIGATION_RETPOLINE选项需要开启,并且CPU需要运行最新的微码更新。
在Intel Skylake时代的系统上,该缓解措施覆盖了大多数情况,但并非所有情况。
对于具有Spectre Variant 2的硬件缓解措施的CPU(例如x86架构上的IBRS或增强型IBRS),retpoline会在运行时自动禁用。
支持增强型IBRS(eIBRS)的系统在启动时通过设置IBRS位启用IBRS保护,从而自动对抗一些Spectre v2变种攻击。BHB(分支历史缓冲器)仍然可能影响间接分支预测器入口的选择,尽管在启用eIBRS时,分支预测器入口在模式之间是隔离的,但BHB本身在模式之间并没有隔离。支持BHI_DIS_S的系统将设置该选项以保护免受BHI攻击。
在Intel的增强型IBRS系统上,这还包括在SMT系统上进行的跨线程分支目标注入(STIBP)。换句话说,Intel的eIBRS也启用了STIBP。
AMD的自动IBRS不保护用户空间,而传统的IBRS系统在退出到用户空间时会清除IBRS位,因此两者都明确启用了STIBP。
对于受漏洞影响的CPU,默认情况下会启用retpoline缓解措施。管理员可以通过内核命令行和sysfs控制文件强制开启或关闭该缓解措施。请参阅内核命令行上的缓解控制。
在x86架构中,默认情况下在调用任何固件代码之前会启用间接分支受限推测,以防止使用固件的Spectre Variant 2漏洞利用。
使用内核地址空间随机化(在内核配置中设置CONFIG_RANDOMIZE_BASE=y和CONFIG_SLAB_FREELIST_RANDOM=y)可以增加对内核的攻击难度。
4.2 User program mitigation
用户程序可以通过使用LFENCE或"bounds clipping"来缓解Spectre Variant 1。
针对Spectre Variant 2的缓解措施,可以为间接分支编译具有返回跳板的个别用户程序。这样可以保护它们免受恶意软件留下的分支目标缓冲器中的有毒条目影响。
在传统的IBRS系统上,返回到用户空间时,隐式STIBP会被禁用,因为内核会清除IBRS位。在这种情况下,用户空间程序可以通过prctl()禁用间接分支推测(请参阅Documentation/userspace-api/spec_ctrl.rst)。在x86架构上,这将打开STIBP,以在用户程序运行时防止来自兄弟线程的攻击,并在切换到/从程序时使用IBPB刷新分支目标缓冲器。
对用户程序进行间接分支推测限制也将防止程序在x86架构上发动Variant 2攻击。管理员可以通过内核命令行和sysfs控制文件更改此行为。请参阅内核命令行上的缓解控制。
禁用间接分支推测的程序将具有更多开销并且运行较慢。
用户程序应该使用地址空间随机化(/proc/sys/kernel/randomize_va_space = 1或2)来增加攻击的难度。
4.3 VM mitigation
在内核中,针对来自恶意虚拟机的Spectre Variant 1攻击,会在虚拟机退出路径上逐个案例进行缓解。易受攻击的代码使用nospec访问器宏进行"边界剪裁",以避免泄露可用的攻击片段。然而,这可能无法覆盖所有Variant 1攻击向量。
针对来自恶意虚拟机对内核的Spectre Variant 2攻击,Linux内核使用retpoline或增强型IBRS来防止恶意虚拟机利用分支目标缓冲器中的有毒条目。它还在每次虚拟机退出时刷新返回栈缓冲器,以防止返回栈缓冲器下溢,从而可能利用有毒的分支目标缓冲器,或者攻击者虚拟机在返回栈缓冲器中留下有毒条目。
为了缓解同一CPU硬件线程中虚拟机之间的攻击,会在切换到新的虚拟机之前通过刷新来对分支目标缓冲器进行清理。
上述缓解措施在受漏洞影响的CPU上默认启用。
为了缓解在使用SMT时来自兄弟线程的虚拟机之间的攻击,管理员可以通过prctl()禁用兄弟线程中运行的不受信任的虚拟机的间接分支推测。
内核还允许虚拟机使用任何它们选择使用的基于微码的缓解措施(例如在x86上的IBPB或STIBP)来保护自身。
4.4 Intel Mitigations
4.4.1 Variant 1: Bounds Check Bypass Mitigation
对于边界检查绕过(bounds check bypass)方法,英特尔的缓解策略主要集中在软件修改上。
边界检查绕过可以通过修改软件来限制混淆代理程序中的推测执行来进行缓解。具体而言,软件可以在边界检查和后续可能引发推测侧信道的操作之间插入一个停止推测的屏障。LFENCE指令或任何序列化指令都可以作为这样的屏障。
英特尔推荐的软件缓解措施是在适当的位置插入一个屏障来停止推测执行。特别推荐使用LFENCE指令来实现这个目的。序列化指令和LFENCE指令都可以阻止 younger instructions 在 older instructions 退役之前执行,甚至是推测性执行,但是LFENCE相比其他序列化指令是更好的性能解决方案。在边界检查之后插入一个LFENCE指令可以防止边界检查退役之前 younger operations 执行。需要注意的是,插入LFENCE指令必须谨慎进行;如果使用过于频繁,性能可能会受到严重影响。
LFENCE指令和序列化指令确保在所有先前的指令本地完成之前,不会执行任何后续指令,即使是推测性执行也是如此。LFENCE指令的延迟较低,因此建议使用它。
可以创建一组静态分析规则来帮助找到软件中可能需要推测执行屏障的位置。例如,英特尔对Linux内核进行的分析只发现了少数几个需要插入LFENCE指令的地方,从而仅对性能产生了最小的影响。与所有静态分析工具一样,结果中可能会有误报,建议进行人工检查。
4.4.2 Variant 2: Branch Target Injection Mitigation
针对分支目标注入(branch target injection)方法,已经开发了两种缓解技术,使软件生态系统能够选择适合特定安全性、性能和兼容性目标的方法。
第一种技术引入了处理器和系统软件之间的新接口。该接口提供机制,允许系统软件防止攻击者控制受害者的间接分支预测,例如在适当的时间刷新间接分支预测器以减轻此类攻击。有关该接口的详细信息将在《Intel® 64和IA-32体系结构软件开发者手册》的未来修订版本中提供。此缓解策略需要更新的系统软件和加载支持新接口的微码更新以支持许多现有处理器。这个新接口也将支持未来的英特尔处理器。这种缓解策略现在将支持三个新功能。如果应用了适当的微码更新,这些功能将在现代现有产品上可用,并且在未来产品上,这些缓解措施的性能成本将得到改进。具体而言,这些功能包括:
(1)间接分支限制推测(Indirect Branch Restricted Speculation,IBRS):限制对间接分支的推测。
(2)单线程间接分支预测器(Single Thread Indirect Branch Predictors,STIBP):防止通过同一超线程控制间接分支预测。
Spectre问题的另一个方面是超线程。Sibling CPUs共享资源,包括分支预测缓冲区,因此在一个 sibling thread 上运行的代码可能会攻击另一个线程上运行的进程。某些Intel CPU提供的"单线程间接分支预测器"(STIBP)功能禁用了这种共享,因此可以阻止这些攻击。
(3)间接分支预测器屏障(Indirect Branch Predictor Barrier,IBPB):确保较早代码的行为不会控制后续的间接分支预测。
间接分支预测器屏障(IBPB)操作可用于刷新分支预测缓冲区,消除攻击者可能放置的任何污染。每当内核从一个进程切换执行到另一个进程时执行IBPB操作,可以防止大多数Spectre v2攻击。
第二种技术由Google开发,引入了“返回跳板”(return trampoline)的概念,也称为retpoline。基本上,软件会将间接近跳转和调用指令替换为一个代码序列,该序列将目标分支的目标推送到堆栈上,然后执行返回(RET)指令跳转到该位置,因为返回指令通常可以使用此方法进行保护。对于许多当前的英特尔处理器,对于某些工作负载,这种技术的性能可能优于第一种技术。
英特尔已经与各种开源编译器合作,以添加对返回跳板的支持,并与操作系统供应商合作,在适当的情况下使用这些技术。对于Broadwell一代及更高版本的英特尔® Core™处理器,这种retpoline缓解策略也需要应用微码更新,以使缓解措施完全有效。
4.5 Related Intel Security Features and Technologies
现有的英特尔产品或计划在未来的产品中都有一些安全功能和技术,这些功能和技术会降低前几节中提到的攻击的有效性。
4.5.1 Intel OS Guard
当启用英特尔 OS Guard(也称为Supervisor-Mode Execution Prevention或SMEP)时,操作系统将禁止直接执行应用程序代码,即使是推测性执行也不例外。这使得对操作系统进行分支目标注入攻击变得更加困难,攻击者必须在操作系统代码中寻找可用的代码片段(gadgets)。同时,应用程序也更难训练操作系统代码跳转到操作系统的代码片段。所有主要操作系统默认启用SMEP支持。
启用SMEP可以提供额外的保护层,限制了特权级操作系统模式下应用程序代码的执行。这在一定程度上减轻了分支目标注入攻击的风险,增强了系统的安全性。
建议启用SMEP作为一种安全实践,以防范利用操作系统漏洞的某些攻击类型。系统管理员和用户应确保在其系统上启用SMEP,并及时应用最新的安全补丁和更新,以保持操作系统的安全性。
4.5.2 Execute Disable Bit
执行禁用位(Execute Disable Bit)是一项基于硬件的安全功能,有助于减少系统受到病毒和恶意代码的威胁。执行禁用位允许处理器对内存中的特定区域进行分类,确定应用程序代码能否执行,甚至是推测性执行。这减少了可供利用的代码片段(gadget space),增加了分支目标注入攻击的难度。所有主要操作系统默认启用执行禁用位支持。鼓励应用程序将只有代码页面标记为可执行。
通过启用执行禁用位,处理器可以阻止在指定内存区域中运行非执行代码,从而减少了恶意代码执行的可能性。这种硬件层面的保护措施有助于提高系统的安全性。
对于应用程序而言,建议将只有代码的内存页面标记为可执行,以减少系统面临的潜在风险。执行禁用位是一项重要的安全功能,可以帮助抵御各种恶意代码和攻击。
4.5.3 Control flow Enforcement Technology (CET)
在未来的英特尔处理器上,控制流执行技术(Control Flow Enforcement Technology,CET)将允许将近的间接跳转和调用指令限制为只能目标到ENDBRANCH指令。这个功能可以减少非ENDBRANCH指令的推测范围。这大大减少了可供利用的代码片段(gadget space),增加了分支目标注入攻击的难度。
返回跳板(retpoline)可能会干扰CET的正常使用。英特尔建议在支持CET的情况下,软件使用CET和增强的IBRS而不是retpoline。
CET是一项重要的安全功能,可以帮助减轻分支目标注入攻击的风险。通过限制非ENDBRANCH指令的推测范围,CET显著减少了可供攻击者利用的代码片段。建议软件开发者在支持CET的系统上使用CET和增强的IBRS,以提高系统的安全性,而不是依赖retpoline。
4.5.4 Protection Keys
在未来的英特尔处理器上,如果同时支持硬件对抗Rogue Data Cache Load(IA32_ARCH_CAPABILITIES[RDCL_NO])和保护密钥(protection keys),保护密钥可以限制软件可以访问的数据。这可以用来限制分支目标注入或边界检查绕过攻击可能泄露的内存地址。
4.5.5 Supervisor-Mode Access Prevention (SMAP)
SMAP(Supervisor Mode Access Prevention)可以用于限制可用于基于缓存的侧信道攻击的内存地址,通过阻止应用程序行的分配。这可能使得应用程序更难对内核执行攻击,因为应用程序更难确定内核行是否被缓存,而不是应用程序行。
在具有硬件支持以减轻Rogue Data Cache Load(IA32_ARCH_CAPABILITIES[RDCL_NO])和SMAP的英特尔处理器上,由于SMAP而引发页面故障的加载操作即使在L1D缓存命中时也不会推测性地返回加载的数据,也不会对该地址进行任何缓存的填充或清除。
五、Mitigation control on the kernel command line
Spectre变体2缓解可以在内核命令行禁用或强制启用。
在内核中,可以通过设置特定选项来控制对Spectre Variant 1和Variant 2的缓解措施。下面是一些相关选项和其含义:
(1)nospectre_v1:
禁用Spectre Variant 1(边界检查绕过)的所有缓解措施。使用此选项可能导致系统中的数据泄漏。
(2)nospectre_v2:
禁用Spectre Variant 2(间接分支预测)的所有缓解措施。使用此选项可能允许数据泄漏,等效于spectre_v2=off。
(3)spectre_v2=:
控制Spectre Variant 2(间接分支推测)的缓解措施。默认情况下,内核保护免受来自用户空间的攻击。
on:
无条件启用缓解措施,相当于spectre_v2_user=on。
off:
无条件禁用缓解措施,相当于spectre_v2_user=off。
auto:
内核检测您的CPU型号是否受漏洞影响,并选择适当的缓解方法。
选择“on”将在运行时根据CPU、可用的微码、CONFIG_MITIGATION_RETPOLINE配置选项的设置以及内核构建时使用的编译器选择缓解方法。
选择“on”还将启用针对用户空间任务之间的攻击的缓解措施。
选择“off”将禁用内核和用户空间的保护措施。
还可以手动选择特定的缓解措施,例如retpoline、eibrs或ibrs。
未指定此选项相当于spectre_v2=auto。
通常情况下,内核会根据当前的CPU默认选择合理的缓解措施。要禁用Spectre Variant 2的缓解措施,请使用spectre_v2=off进行引导。无法禁用Spectre Variant 1的缓解措施。
(4)spectre_bhi=是用于控制分支历史注入(Branch History Injection,BHI)漏洞的缓解措施的选项。以下是相关选项的含义:
spectre_bhi=on:
(默认设置)根据需要启用硬件或软件缓解措施。
spectre_bhi=off:
禁用缓解措施。
使用spectre_bhi=on将根据需要启用硬件或软件缓解措施来应对分支历史注入漏洞。使用spectre_bhi=off将禁用这些缓解措施。
有关spectre_v2_user,请参阅内核的命令行参数。
六、Mitigation selection guide
(1)受信任的用户空间(Trusted userspace):
如果所有用户空间应用程序都来自受信任的来源,并且不执行外部提供的不受信任的代码,则可以禁用缓解措施。
(2)保护敏感程序(Protect sensitive programs):
对于具有机密信息(例如加密密钥)的安全敏感程序,可以通过在程序运行时禁用间接分支推测来防止Spectre Variant 2的攻击(请参阅Documentation/userspace-api/spec_ctrl.rst)。
(3)隔离不受信任的程序(Sandbox untrusted programs):
可以通过在运行不受信任的程序时禁用其间接分支推测来隔离可能成为攻击源的不受信任的程序(请参阅Documentation/userspace-api/spec_ctrl.rst)。这将防止不受信任的程序污染分支目标缓冲器。可以通过内核命令行和sysfs控制文件来更改此行为。请参阅内核命令行中的缓解控制。
(4)高安全模式(High security mode):
可以在启动时强制为所有程序启用Spectre Variant 2的所有缓解措施(请参阅内核命令行中的"on"选项)。这将增加开销,因为所有程序的间接分支推测将受到限制。
在x86上,当切换到新程序时,将使用IBPB刷新分支目标缓冲器。STIBP始终保持开启,以保护程序免受来自兄弟线程上运行的程序的Variant 2攻击。
或者,只有在运行明确禁用间接分支推测的程序时才使用STIBP,同时在切换到新程序时始终使用IBPB来清除分支目标缓冲器(请参阅内核命令行中的"ibpb"选项)。与始终开启STIBP的"on"选项相比,"ibpb"选项的性能开销较小。
参考资料
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/spectre.html
https://lwn.net/Kernel/Index/#Security-Meltdown_and_Spectre
https://zhuanlan.zhihu.com/p/393449780
Analysis of Speculative Execution Side Channels
Speculative Execution for Side-Channel Mitigations
Analyze Potential Vulnerabilities