Logo

Linux 内核

6.16.0-rc4

快速搜索

目录

  • 开发过程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发过程文档
  • 核心 API
  • 驱动程序 API
  • 子系统
  • 锁
  • 许可规则
  • 编写文档
  • 开发工具
  • 测试指南
  • Hacking 指南
  • 跟踪
  • 故障注入
  • 热补丁
  • Rust
  • 管理
    • 内核管理通用指南
      • Linux 内核发行版 6.x <https://linuxkernel.org.cn/>
      • Linux 分配设备 (4.x+ 版本)
      • 所有架构的功能状态
      • 如何访问 sysfs 中信息的规则
      • /proc/sys 文档
      • 如何通过 sysfs 导出 CPU 拓扑信息
      • Linux ABI 描述
      • 硬件漏洞
      • Linux 安全模块使用
      • Perf 事件和工具安全
    • 启动内核
    • 跟踪和识别问题
    • 核心内核子系统
    • 块层和文件系统管理
    • 设备特定指南
    • 工作负载分析
    • 其他
  • 构建系统
  • 报告问题
  • 用户空间工具
  • 用户空间 API
  • 固件
  • 固件和设备树
  • CPU 架构
  • 未分类文档
  • 翻译

本页

  • 显示源码

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 被填充或清除

    • AMD

      在 Zen 4+ 上,IBPB(或如果使用 SBPB [5])会清除 RSB。这通过 CPUID 中的 IBPB_RET [6] 指示。

      在 Zen < 4 上,除了 IBPB [7] 之外,RSB 填充序列 [3] 必须始终执行。这由 X86_BUG_IBPB_NO_RET 指示。

    • Intel

      IBPB 总是清除 RSB

      “在 IBPB 命令执行之前执行的软件不能控制该命令之后在同一逻辑处理器上执行的间接分支的预测目标。这里的间接分支包括近距离返回指令,因此这些预测目标可能来自 RSB。” [8]

  • 在上下文切换时,用户态到内核态的攻击通过 SMEP 阻止。用户空间只能将用户空间地址插入 RSB。甚至非规范地址也无法插入,因为 TASK_SIZE_MAX 保留的用户规范地址空间末尾存在页间隙。指令获取时的 SMEP #PF 阻止内核推测性地执行用户空间。

    • AMD

      “最后,被预测为‘返回’指令的分支从返回地址预测器 (RAP) 获取其预测目标。AMD 建议软件使用 RAP 填充序列([2] 中的缓解措施 V2-3)和/或管理模式执行保护 (SMEP),以确保 RAP 中的地址对于推测是安全的。我们统称这些缓解措施为‘RAP 保护’。” [9]

    • Intel

      “在具有增强型 IBRS 的处理器上,RSB 覆盖序列可能不足以阻止近距离返回的预测目标使用在权限较低的预测器模式中创建的 RSB 条目。软件可以通过启用 SMEP(用于从用户模式到管理模式的转换)以及在 VM 出口时设置 IA32_SPEC_CTRL.IBRS 来防止这种情况。” [10]

  • 在 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]


参考文献¶

[1]

Spectre Returns! Speculation Attacks using the Return Stack Buffer

[2]

“Skylake 代的空 RSB 缓解”在 Retpoline:分支目标注入缓解

[3] (1,2)

“缓解措施 V2-3”在 管理推测的软件技术

[4] (1,2)

是否写入 IBPB 取决于前一个和/或下一个任务是否受到 Spectre 攻击的保护。它通常需要按任务或系统范围选择加入。有关更多详细信息,请参阅 内核命令行参数 中 spectre_v2_user 命令行选项的文档。

[5]

IBPB,不刷新分支类型预测。仅存在于 AMD。

[6]

“功能 8000_0008h -- 处理器容量参数和扩展功能识别”在 AMD64 架构程序员手册第 3 卷:通用和系统指令。根据 这封邮件,SBPB 行为相同。

[7]

Spectre 攻击:利用推测执行

[8]

“引言”在 屏障后返回栈缓冲区预测 / CVE-2022-26373 / INTEL-SA-00706

[9]

“现有缓解措施”在 分支类型混淆缓解技术指南

[10]

“增强型 IBRS”在 间接分支受限推测

[11]

“扩展功能启用寄存器 (EFER)”在 AMD64 架构程序员手册第 2 卷:系统编程

[12]

“增强型 IBRS”在 间接分支受限推测

[13]

屏障后返回栈缓冲区预测 / CVE-2022-26373 / INTEL-SA-00706

[14] (1,2)

RETBleed:使用返回指令的任意推测性代码执行

[15]

分支类型混淆缓解技术指南

[16]

关于推测性返回栈溢出的技术更新

[17]

Inception:通过瞬态执行中的训练暴露新攻击面

[18] (1,2)

返回栈缓冲区下溢 / 返回栈缓冲区下溢 / CVE-2022-29901, CVE-2022-28693 / INTEL-SA-00702

[19]

间接分支预测器屏障

[20]

“RSBU 指南”在 返回栈缓冲区下溢 / 返回栈缓冲区下溢 / CVE-2022-29901, CVE-2022-28693 / INTEL-SA-00702

[21]

分支历史注入:硬件缓解跨权限 Spectre-v2 攻击的有效性

[22]

分支历史注入和模式内分支目标注入 / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598

[23]

“Retpoline”在 分支历史注入和模式内分支目标注入 / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598

©内核开发社区。| 由 Sphinx 5.3.0 & Alabaster 0.7.16 提供支持 | 页面源