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。
注意:只有当任务的亲和性限制为在非 SMT 模式下运行的核心时,任务选择加入 L1D 刷新才有效。如果请求 L1D 刷新的任务被调度到启用 SMT 的核心上,则内核会向该任务发送 SIGBUS。