最近披露了一组新的漏洞。作为补丁的一部分,内核引入了一个新的特性,叫做内核页表隔离(Kernel Page Table Isolation, KPTI)。在当前内核开发周期的较晚的时候,这个特性合并进入了主线,但这是一个很大的更改;尽管这个特性会带来一些性能损失,但它提供了重要的保护措施。更新后的Fedora版本内核包含了KPTI补丁。本文概要地介绍下KPTI如何工作。

现代桌面处理器提供了不同的安全级别来运行代码。内核代码运行在最高特权级别(“内核空间”),因为内核需要访问所有的硬件。大部分其他的应用程序运行在比较低的特权级别(“用户空间”),并且使用系统调用来调用内核代码,访问特权数据。

现代桌面处理器也支持虚拟内存。内核设置页表(page table)来控制虚拟地址和物理地址的映射。内核空间和用户空间之间的访问同样也是由页表控制的。一个内核页是不能被用户空间程序访问的,但是内核能够访问用户空间的数据。

翻译这些映射地址可能非常耗时,所以硬件上有一个翻译后备缓冲器(TLB)来存储映射。有时需要删除旧的映射关系(“刷新TLB”),但是这样做代价很高;为了减少这种情况,我们使用了一些技巧。一个技巧是:在用户进程运行时,始终保持着内核页表的映射。页表权限能防止用户空间访问内核地址,但是内核可以在系统调用时立即访问映射(而不需要刷新TLB)。

熔断漏洞以及 KPTI 如何缓解它

熔断漏洞表明,在用户空间中使用内核空间的地址映射是有风险的。现代处理器从所有的地址映射中预取数据以尽可能快地运行。哪些数据被预取取决于CPU的实现。当一个用户空间程序访问一个内核映射的地址时,它将产生一个错误,并且通常会使程序崩溃。然而,CPU可以预取内核数据,而不会对运行程序造成任何更改。预取通常不是一个安全风险,因为在访问地址时仍然有权限检查,所以用户空间程序并不能访问内核数据。但研究人员发现,有可能测量数据访问的耗时,以获取有关系统的信息。这就是所谓的旁路攻击。KPTI补丁修改了页表的设置,以便内核地址不再在用户空间页表中映射。这意味着用户空间不能预取任何内核数据,因此可以缓解该漏洞。

实际上,编写一个攻击程序利用这个漏洞从系统内核中收集有用的数据可能需要几个星期或几个月的时间。不过,为了安全起见,KPTI补丁被合并来缓解这个漏洞。用户空间没有内核页表的副作用是必须更频繁地刷新TLB,从而会导致性能损失。默认情况下,为了用户安全性考虑,Fedora开启了KPTI特性。如果用户不希望性能受到影响,可以通过在启动命令行上添加“nopti”来关闭KPTI特性。

本文翻译自 Laura Abbott 的文章 KPTI — the new kernel feature to mitigate “meltdown”