今天发布了一系列针对 Linux 内核的大补丁,允许在运行时启用/禁用 CPU 安全缓解措施,而不是目前只能通过各种 Linux 内核命令行参数在启动时管理的处理方式。因此,由于不断变化的安全需求、不同的工作负载要求不同的 CPU 安全关注点等因素,这个提议的功能将允许 Spectre、Meltdown 以及其他 CPU 安全缓解措施在运行时进行切换。
AMD 工程师 David Kaplan 最近完成了 Linux 内核的攻击向量控制工作,接下来他将注意力转向动态缓解措施:能够在运行时启用/禁用 CPU 安全缓解措施,而无需重启或执行 Kexec 到新内核。
为了克服只能在启动时更改 CPU 安全缓解措施的局限性,今天发布的补丁以“征求意见”的形式,允许将 CPU 安全缓解选项值写入到/sys/devices/system/cpu/mitigations。例如,echo “mitigations=off” > /sys/devices/system/cpu/mitigations 来禁用所有 CPU 安全缓解措施,或者将其他现有的内核启动参数值,如”spectre_v2=retpoline tsa=off”,写入这个新的 sysfs 缓解措施文件。
“由于 CPU 缓解措施的性能成本可能很大,选择正确的缓解措施集对于实现性能/安全性的正确平衡非常重要。”
预期的用例包括更好的运行时策略处理、根据新的 CPU 安全发现更改缓解措施,但无需重启系统/服务器、快速缓解措施测试以避免重启等。

AMD 的 David Kaplan 接着解释了如何处理内核的运行时补丁以实现缓解措施:
重新打补丁内核预计将是一个非常罕见的操作,并且是在非常大的压力下进行的。所有任务都被放入冷冻状态,然后重新打补丁是在(新的)stop_machine_nmi()例程下进行的。
要重新打补丁内核,首先将其恢复到编译时的状态。在启动过程中保存了替代方案、retpolines 等原始字节数据,以便稍后用于恢复原始内核映像。之后,根据新的功能标志对内核进行打补丁。
这简化了重新打补丁的过程,因为恢复原始内核映像相对直接。换句话说,我们不需要直接从缓解措施 A 重新打补丁到缓解措施 B,而是首先恢复原始映像,然后从该映像打补丁到缓解措施 B,就像系统最初启动时选择了缓解措施 B 一样。
Kaplan 观察到内核的运行时重新打补丁大约需要 50 毫秒。
对大 56 补丁 RFC 系列感兴趣的人可以在 Linux 内核邮件列表上找到所提出的动态缓解代码。
转自 AMD Dev Proposes Dynamic Mitigations For Linux: Run-Time Toggling Of CPU Mitigations – Phoronix
Linuxeden开源社区