L1D 刷新¶
随着围绕一级数据缓存(L1D)数据泄露的漏洞报告日益增多,内核提供了一种可选机制,可在上下文切换时刷新 L1D 缓存。
此机制可用于解决例如 CVE-2020-0550。对于应用程序而言,此机制可使其免受与 L1D 缓存数据泄露(窃听)相关的漏洞的侵害。
使用指南¶
详情请参阅文档:Documentation/userspace-api/spec_ctrl.rst。
注意:此功能默认禁用,应用程序需要特别选择启用此功能。
缓解¶
当为任务启用 PR_SET_L1D_FLUSH 时,在任务被调度出且进入的任务属于不同的进程,因此属于不同的地址空间时,将执行 L1D 缓存刷新。
如果底层 CPU 在硬件上支持 L1D 刷新,则使用硬件机制,不支持软件回退以进行缓解。
内核命令行上的缓解控制¶
内核命令行允许在启动时使用选项“l1d_flush=”控制 L1D 刷新缓解。此选项的有效参数为
on
启用 prctl 接口,如果未启用 l1d_flush,尝试使用 prctl() 的应用程序将失败并报错
默认情况下,该机制是禁用的。
限制¶
当系统上启用 SMT 时,该机制无法缓解属于不同进程且同时在物理 CPU 核心的兄弟线程上执行的任务之间的 L1D 数据泄露。
这可以通过控制进程在物理 CPU 核心上的放置或禁用 SMT 来解决。请参阅 L1TF 缓解文档中的相关章节:Documentation/admin-guide/hw-vuln/l1tf.rst。
注意:任务对 L1D 刷新的选择启用仅在任务的亲和性限于运行在非 SMT 模式下的核心时才有效。如果请求 L1D 刷新的任务被调度到启用 SMT 的核心上,内核将向该任务发送 SIGBUS 信号。