版权归原作者所有,如有侵权,请联系我们

[科普中国]-内核页表隔离

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

内核页表隔离(Kernel page-table isolation,缩写KPTI,也简称PTI,旧称KAISER)是Linux内核中的一种强化技术,旨在更好地隔离用户空间与内核空间的内存来提高安全性,缓解现代x86 CPU中的“熔毁”硬件安全缺陷。

前身KPTI补丁基于KAISER,它是一个用于缓解不太重要问题的早期补丁,当时业界还未了解到Meltdown的存在。

如果没有KPTI,每当执行用户空间代码(应用程序)时,Linux会在其分页表中保留整个内核内存的映射,并保护其访问。这样做的优点是当应用程序向内核发送系统调用或收到中断时,内核页表始终存在,可以避免绝大多数上下文交换相关的开销(TLB刷新、页表交换等)。

2005年,Linux内核采用了地址空间配置随机加载(KASLR)隐匿用户空间中的相关内核地址,增加了利用其他内核漏洞的难度。尽管阻止了对这些内核映射的访问,但在此后发现,现有的英特尔x86处理器(截至2017年12月)还存在着多处可能泄露这些内存位置的旁路攻击,可能绕过KASLR。AMD称其处理器不受这些攻击的影响,所以不需要KPTI作为缓解措施。1

Meltdown漏洞与KPTI2018年1月,影响Intelx86处理器的熔毁漏洞被公布。KAISER补丁改为修复此问题,并更名为KPTI,因为新型攻击很类似,尽管更为严重。1

实现KPTI通过完全分离用户空间与内核空间页表来解决页表泄露。支持进程上下文标识符(PCID)特性的x86处理器可以用它来避免TLB刷新,但即便如此,它依然有很高的性能成本。据KAISER原作者称,其开销为0.28%;一名Linux开发者称大多数工作负载下测得约为5%,但即便有PCID优化,在某些情况下开销高达30%。

KPTI在2018年早期被合并到Linux内核4.15版,并被反向移植到Linux内核4.14.11。Windows和macOS也发布了类似的更新。

使用内核启动选项“pti=off”可以部分禁用内核页表隔离。依规定也可对已修复漏洞的新款处理器禁用内核页表隔离。2

用户空间在操作系统中,虚拟内存通常会被分成用户空间(英语:User space,又译为使用者空间),与核心空间(英语:Kernel space,又译为内核空间)这两个区块。

这是存储器保护机制中的一环。内核、核心扩充(kernel extensions)、以及驱动程序,运行在核心空间上。而其他的应用程序,则运行在用户空间上。所有运行在用户空间的应用程序,都被统称为用户级(userland)。2

地址空间配置随机加载在计算机科学中,地址空间配置随机加载(英语:Address space layout randomization,缩写ASLR,又称地址空间配置随机化地址空间布局随机化)是一种防范内存损坏漏洞被利用的计算机安全技术。ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数。现代操作系统一般都加设这一机制,以防范恶意程序对已知地址进行Return-to-libc攻击。2

本词条内容贡献者为:

李嘉骞 - 博士 - 同济大学