LWN:改进CPU漏洞防护措施的配置方式!

关注了就能看到更多这么棒的文章哦~

Better CPU vulnerability mitigation configuration

By Daroc Alden
March 19, 2025
Gemini-1.5-flash translation
https://lwn.net/Articles/1013640/

现代 CPU 都存在多个硬件漏洞,内核需要缓解这些漏洞;仅在 x86_64 架构上,6.13 版本的内核就有 14 个需要修复的安全敏感 CPU 漏洞。其中一些漏洞有多个变种,或者存在适用于不同微架构的多种缓解措施。每种缓解措施都有不同的内核命令行选项,这给试图配置其系统的用户带来了困惑。 David Kaplan 最近发布了 一个补丁集,该补丁集添加了一个统一的命令行选项来控制缓解措施,并简化了检测、配置和应用这些措施的逻辑。如果该补丁集合并,用户将更容易地驾驭 CPU 漏洞及其缓解措施的复杂组合。

内核通过 sysfs 提供有关其所知的漏洞的信息。 /sys/devices/system/cpu/vulnerabilities/ 目录包含每个已知攻击类别的文件,其中包含有关系统是否易受攻击以及已启用哪些缓解措施的信息。其中一些文件很容易解释,只是说明缓解措施是打开还是关闭。另一些则有些晦涩难懂。例如,我的 x86_64 机器对 Spectre v2 的描述如下:

Mitigation: Enhanced / Automatic IBRS; IBPB: conditional; RSB filling; \     PBRSB-eIBRS: SW sequence; BHI: BHI_DIS_S

这一行意味着内核启用了 增强型间接分支限制推测 (Enhanced Indirect Branch Restricted Speculation, Enhanced IBRS)、间接分支预测器屏障 (Indirect Branch Predictor Barrier, IBPB)、返回栈缓冲区 (Return Stack Buffer, RSB) 填充、屏障后返回栈缓冲区增强型 IBRS (Post-barrier Return Stack Buffer Enhanced IBRS, PBRSB-eIBRS) 以及 分支历史注入 (Branch History Injection, BHI)。增强型 IBRS 是一种阻止 CPU 通过间接分支进行推测的技术。 IBPB 引入了一个屏障(barrier),以防止屏障之前的代码影响屏障之后的 分支预测 。 RSB 填充确保 CPU 在遇到返回指令时可能推测的任何返回地址在上下文切换时被覆盖。 PBRSB-eIBRS 将该保护扩展到某些 CPU 上虚拟机 的退出。最后,BHI 防止代码操纵分支预测器以通过分支进行推测。理论上,所有这些缓解措施加在一起应该使我的计算机在很大程度上免受基于 Spectre 的攻击。

这些缓解措施中的每一个都由 spectre_v2 , spectre_v2_user 和 spectre_bhi 内核命令行选项控制。其他缓解措施有它们自己特有的命名选项。内核的 硬件漏洞文档 描述了各种选项,但是了解给定系统的最佳配置需要了解如何滥用不同的漏洞。实际上,大多数用户可能会将其设置保留为默认值,这对安全性有好处,但会带来明显的性能损失。

Kaplan 的补丁重新构建了内核的缓解配置逻辑,使其依赖于单个命令行选项 mitigations 。该选项已经存在,但目前只能设置为 "off" 或 "auto"。 Kaplan 的补丁扩展了它,以便用户可以附加一个分号和一个逗号分隔的列表,其中包含不需 要缓解的特定攻击向量:

  • no_user_kernel

     — 不要缓解来自恶意用户空间程序尝试泄漏内核数据的攻击。

  • no_user_user

     — 不要缓解一个用户空间程序对另一个用户空间程序的攻击。

  • no_guest_host

     — 不要缓解来自恶意虚拟机试图从其 hypervisor (虚拟机管理程序)中提取数据的攻击。

  • no_guest_guest

     — 不要缓解一个虚拟机对另一个虚拟机的攻击。

  • no_cross_thread

     — 不要缓解从一个 同步多线程 (simultaneous multithreading, SMT) 核心上运行的程序或虚拟机对在其同级核心上运行的代码的攻击。

默认设置为缓解所有这些攻击向量,因此没有单独的 "on" 设置。例外情况是跨线程攻击,通常只有禁用同步多线程才能完全阻止。由于性能影响很大,通常不希望这样做,因此用户需要指定 "auto,nosmt" 而不是仅仅 "auto" 才能获得该行为。通常,启用所有缓解措施是一个安全的选择。但是对于不会运行虚拟机的系统,例如,将 "mitigations= auto;no_guest_host,no_guest_guest" 添加到内核命令行可以挽回一些损失的性能。在 Kaplan 的 cover letter (提案信) 中,他证明了切换到这组命令行选项的合理性:

虽然许多用户可能不太熟悉这些 CPU 漏洞的细节,但他们可能更了解其系统的预期用途。因此,可以禁用不需要的缓解措施,从而让用户获得更多性能。

当用户指定其中一个新攻击向量选项时,内核会利用其有关计算机 CPU 中存在的 bug 的知识来启用该情况下最佳的缓解措施。目前,它们仅在 x86 (和 x86_64) 上有效,其他架构的维护者需要提供有关哪些缓解措施应与每个选项关联的意见。现有的特定于缓解措施的命令行选项将继续正常运行,尽管它们的使用量可能会大大减少。

这种特殊的设计是 Kaplan 补丁集先前版本上的 extended discussion (扩展讨论) 的结果。该版本有五个不同的新命令行选项,每个选项对应一个潜在的攻击向量。但是,审阅者发现该设计不必要地复杂,并最终同意使用上述更简单的接口。 Pawan Gupta 、 Josh Poimboeuf 和 Kaplan 都提出了各种想法,但是 Borislav Petkov 提出了建议,该建议最终与 Kaplan 在新版本补丁集中采用的建议最为接近。

审阅者并未完全被 Kaplan 对潜在攻击的分类所说服,尽管他们似乎普遍认为这比令人困惑的现状要好。 Poimboeuf 认为 尤其是跨线程组,将其与其他组分开没有多大意义。在跨线程攻击中,在攻击 SMT 核心 (也称为硬件线程) 上运行的代码必须是用户空间程序或虚拟机;因此, Poimboeuf 认为,任何跨线程攻击都应属于 Kaplan 提出的其他四个类别之一。

Kaplan 并没有不同意,尽管他 在讨论中早些时候 指出,禁用 SMT 必须进行特殊处理。尽管存在围绕 SMT 的复杂性, Kaplan 的命令行选项仍然比现有选项集简单得多。

用于选择缓解措施的内部逻辑 (internal logic) 也受到了审阅者的广泛关注,尽管仅以代码风格注释的形式出现,但也得到了清理。以前,该代码有些错综复杂。通过 Kaplan 的更改,功能应该相同,但是该实现已分为 "select" (选择) 、 "update" (更新) 和 "apply" (应用) 函数,用于内核知道的每种缓解措施。 select 函数确定是否应启用缓解措施, update 函数允许根据已选择的其他缓解措施来更改缓解措施的特定配置,而 apply 函数则完成将缓解措施应用于内核的实际工作。

Kaplan 的补丁集的最新版本于 3 月 10 日发布,因此没有足够的时间引起任何其他讨论。鉴于先前版本收到的积极反响,这些新命令行选项很可能很快可用于 x86 和 x86_64,希望其他架构也能紧随其后。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值