内核页表隔离
编辑内核页表隔离(KPTI 或 PTI,以前称为 KAISER)是一项 Linux 内核功能,可缓解 Meltdown 安全漏洞(主要影响 Intel 的 x86 CPU)并改进内核强化以防止试图绕过内核地址空间布局随机化 (KASLR) . 它通过更好地隔离用户空间和内核空间内存来工作。 KPTI 被合并到 Linux 内核版本 4.15 中,并向后移植到 Linux 内核 4.14.11、4.9.75 和 4.4.110。 Windows 和 macOS 发布了类似的更新。 KPTI 不解决相关的 Spectre 漏洞。
KAISER 的背景
编辑KPTI 补丁基于 KAISER,该技术于 2016 年构思并于 2017 年 6 月发布,当时 Meltdown 尚不为人所知。 KAISER 使击败 KASLR 变得更加困难,KASLR 是 2014 年针对一个不那么严重的问题的缓解措施。
2014 年,Linux 内核采用了内核地址空间布局随机化 (KASLR),这使得利用其他内核漏洞变得更加困难,这些漏洞依赖于对用户空间隐藏的内核地址映射。 尽管禁止访问这些内核映射,但事实证明,现代处理器中存在多种边信道攻击,可以泄漏该内存的位置,从而可以绕过 KASLR。
KAISER 通过消除一些地址泄漏源解决了 KASLR 中的这些问题。 KASLR 仅仅防止地址映射泄漏,而 KAISER 还防止数据泄漏,从而涵盖了 Meltdown 案例。
KPTI 基于 KAISER。 如果不启用 KPTI,每当执行用户空间代码(应用程序)时,Linux 也会将其整个内核内存映射到页表中,尽管受到访问保护。 优点是当应用程序对内核进行系统调用或接收到中断时,内核页表始终存在,因此可以避免大多数与上下文切换相关的开销(TLB 刷新、页表交换等)。
Meltdown漏洞和KPTI
编辑这是一个比 KAISER 最初打算修复的 KASLR 绕过严重得多的漏洞:发现内核内存的内容也可能被泄露,而不仅仅是内存映射的位置,就像之前认为的那样。
KPTI(概念上基于 KAISER)通过防止大多数受保护位置被映射到用户空间来防止 Meltdown。
目前未知 AMD x86 处理器是否会受到 Meltdown 的影响,并且不需要 KPTI 来缓解它们。 但是,当禁用 KPTI 时,AMD 处理器仍然容易受到 KASLR 绕过的影响。
实施
编辑KPTI 通过完全分离用户空间和内核空间页表来修复这些漏洞。 一组页表包括内核空间和用户空间地址,和以前一样,但它只在系统运行在内核态时使用。 在用户模式下使用的第二组页表包含用户空间的副本和一组最小的内核空间映射,提供进入或退出系统调用、中断和异常所需的信息。
在支持进程上下文标识符 (PCID) 的处理器上,可以避免转换后备缓冲区 (TLB) 刷新,但即便如此,它也会带来显着的性能成本,尤其是在系统调用繁重和中断繁重的工作负载中。
根据 KAISER 的原作者测量,开销为 0.28%; 一位 Linux 开发人员测得,对于大多数工作负载,它大约为 5%,在某些情况下高达 30%,即使使用 PCID 优化也是如此; 对于数据库引擎 PostgreSQL,Intel Skylake 处理器上的只读测试的影响为 7-17%(或 16-23%,没有 PCID),而完整的基准测试损失了 13-19%(Coffee Lake 与 Broadwell-E)。 许多基准测试由 Phoronix 完成,Redis 的速度降低了 6-7%。 Haswell 上的 Linux 内核编译速度降低了 5%。
可以使用 nopti 内核引导选项部分禁用 KPTI。 如果较新的处理器修复了信息泄漏,还制定了禁用 KPTI 的规定。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/195675/