RSB 相关缓解措施¶
警告
请保持本文档最新,否则您将被要求更新它并将其转换为 bugs.c 中很长的一段注释!
自 2018 年以来,出现了许多与返回栈缓冲区 (RSB)(有时在 AMD 上称为返回地址栈 (RAS) 或返回地址预测器 (RAP))相关的 Spectre CVE。
关于这些 CVE 以及如何缓解它们的信息分散在无数个微架构特定的文档中。
本文档旨在将所有相关信息整合到一个地方,并阐明当前 RSB 相关缓解措施背后的原因。它力求尽可能简洁,只关注当前的内核缓解措施:RSB 相关的攻击向量是什么?目前是如何缓解它们的?
它不旨在描述 RSB 机制如何运作或漏洞如何利用。有关这些的更多详细信息可以在下面的参考文献中找到。
相反,这基本上是一段被美化了的注释,但又太长了,无法真正成为注释。因此,当下一个 CVE 出现时,内核开发人员可以快速参考此文档,作为回顾,了解我们正在做什么以及为什么这样做。
从宏观层面看,RSB 攻击分为两类:RSB 污染(Intel 和 AMD)和 RSB 下溢(仅限 Intel)。对于每个攻击向量(以及适用的微架构),必须单独考虑它们。
RSB 污染(Intel 和 AMD)¶
SpectreRSB¶
RSB 污染是 SpectreRSB [1] 使用的一种技术,攻击者通过污染 RSB 条目来导致受害者的返回指令推测到攻击者控制的地址。这可能发生在上下文切换或 VMEXIT 后 CALL/RET 不平衡的情况下。
所有攻击向量都可以通过在不受信任和受信任域之间转换时,使用 RSB 填充序列 [2] [3] 刷新任何被污染的 RSB 条目来缓解。但这会影响性能,应尽可能避免。
危险
FIXME:目前我们正在刷新 32 个条目。但是,一些 CPU 型号的条目超过 32 个。对于这些型号,循环计数需要增加。需要关于 RSB 大小的更详细信息。
在上下文切换时,用户态到用户态的缓解措施要求在上下文切换期间,IBPB 被写入时 [4] 确保 RSB 被填充或清除
在上下文切换时,用户态到内核态的攻击通过 SMEP 阻止。用户空间只能将用户空间地址插入 RSB。甚至非规范地址也无法插入,因为 TASK_SIZE_MAX 保留的用户规范地址空间末尾存在页间隙。指令获取时的 SMEP #PF 阻止内核推测性地执行用户空间。
在 VMEXIT 时,访客到主机攻击通过 eIBRS(如果需要,还包括 PBRSB 缓解)进行缓解
- AMD
“当启用自动 IBRS 时,用于返回地址预测的内部返回地址栈在 VMEXIT 时被清除。” [11]
- Intel
“在具有增强型 IBRS 的处理器上,RSB 覆盖序列可能不足以阻止近距离返回的预测目标使用在权限较低的预测器模式中创建的 RSB 条目。软件可以通过启用 SMEP(用于从用户模式到管理模式的转换)以及在 VM 出口时设置 IA32_SPEC_CTRL.IBRS 来防止这种情况。具有增强型 IBRS 的处理器仍然支持 IBRS 仅在 OS/VMM 中为启用 SMEP 的操作系统设置的使用模型。为此,即使在 VM 出口时未设置 IBRS,此类处理器也将确保一旦设置了 IBRS,访客行为就无法在 VM 出口后控制 RSB。” [12]
请注意,某些 Intel CPU 容易受到屏障后返回栈缓冲区预测 (PBRSB) [13] 的影响,其中访客的最后一次 CALL 可用于预测第一次不平衡的 RET。在这种情况下,除了 eIBRS 之外,还需要 PBRSB 缓解。
AMD RETBleed / SRSO / 分支类型混淆¶
在 AMD 上,污染的 RSB 条目也可以由 AMD RETBleed 变体 [14] [15] 或推测性返回栈溢出 [16] (Inception [17]) 创建。内核通过将内核中的每个 RET 替换为跳转到单个安全 RET 来保护自身。
RSB 下溢(仅限 Intel)¶
RSB 替代 (RSBA) (“Intel Retbleed”)¶
某些 Intel Skylake 代的 CPU 容易受到 RETBleed 的 Intel 变体 [14](返回栈缓冲区下溢 [18])的影响。如果在 RSB 缓冲区因不匹配的 CALL/RET 或从深层调用栈返回而为空时执行 RET,分支预测器可能会回退到使用分支目标缓冲区 (BTB)。如果用户强制 BTB 冲突,则 RET 可能会推测性地分支到用户控制的地址。
请注意,RSB 填充不能完全缓解此问题。如果存在足够多的不平衡 RET,RSB 仍可能下溢并回退到使用被污染的 BTB 条目。
在上下文切换时,用户态到用户态下溢攻击通过上下文切换时的条件 IBPB [4] 缓解,该措施有效清除 BTB
“间接分支预测器屏障 (IBPB) 是一种间接分支控制机制,它建立一个屏障,阻止在屏障之前执行的软件控制在屏障之后在同一逻辑处理器上执行的间接分支的预测目标。” [19]
在上下文切换和 VMEXIT 时,用户态到内核态和访客到主机态的 RSB 下溢通过 IBRS 或 eIBRS 缓解
“启用 IBRS(包括增强型 IBRS)将缓解研究人员演示的‘RSBU’攻击。如前所述,Intel 建议使用增强型 IBRS(如果支持)。这包括枚举 RRSBA 但未枚举 RRSBA_DIS_S 的任何处理器。” [18]
但是,请注意 eIBRS 和 IBRS 不会缓解模式内攻击。与下面的 RRSBA 一样,这通过在内核入口处清除 BHB 来缓解。
作为经典 IBRS 的替代方案,调用深度跟踪(结合 retpolines)可用于跟踪内核返回并在 RSB 接近空时填充它。
受限 RSB 替代 (RRSBA)¶
一些较新的 Intel CPU 具有受限 RSB 替代 (RRSBA) 行为,与上面描述的 RSBA 类似,在 RSB 下溢时也会回退到使用 BTB。唯一的区别是当启用 eIBRS 时,预测目标被限制在当前域内
“受限 RSB 替代 (RRSBA) 行为允许在 RSB 为空时,近距离 RET 指令使用替代分支预测器。当启用 eIBRS 时,这些替代预测器的预测目标被限制在属于当前预测域的间接分支预测器条目。” [20]
当一个具有 RRSBA 的 CPU 容易受到分支历史注入 [21] [22] 攻击时,RSB 下溢可用于模式内 BTI 攻击。这通过在内核入口处清除 BHB 来缓解。
但是,如果内核使用 retpolines 而不是 eIBRS,则需要禁用 RRSBA
“如果软件使用 retpoline 作为 BHI 或模式内 BTI 的缓解措施,并且处理器同时枚举 RRSBA 和枚举 RRSBA_DIS 控制,则应禁用此行为。” [23]