英特尔CPU曝重大设计缺陷:Linux、Windows需修改内核
作者: 日期:2018年01月04日 阅:7,652

其他操作系统也需更新,性能受损。

程序员们匆忙上马,彻底检查开源Linux内核虚拟内存系统。同时,微软有望在下一个周二更新日为Windows操作系统做出必要的修改:针对11月和12月推出的 Windows Insider Fast-ring 测试版。

基本上,Linux和Windows的这次更新都将对英特尔产品的性能产生影响。影响有多大尚有待衡量,但粗略估计会在5%-30%之间——依具体任务和处理器模型而定。更新一些有PCID之类功能的英特尔芯片可以减小性能损失。各用户的情况不一而足。

因为缺陷出自英特尔x86-64硬件,且似乎微代码更新无法解决该问题,所以类似的操作系统(如苹果的64位macOS)也需要更新。要么在操作系统级软件修复该问题,要么新买一块不带该设计缺陷的处理器,自己选吧!

该漏洞的细节目前尚未披露,大概会在微软下周二的更新日适时推出吧。实际上,Linux内核的补丁已经推出,只是源代码中抹去了注释以防漏洞细节太过明显。

不过,我们还是可以从中探得几分究竟。

影响

据了解,该漏洞出现在过去10年中生产的现代英特尔处理器中,可令普通用户程序——从数据库应用到浏览器JavaScript脚本,在一定程度上获悉受保护内核内存区域的布局或内容。

内核页表隔离(KPTI)技术将用户进程与内核内存完全隔开可以解决该问题。事实上,Linux内核团队曾一度考虑用中断间接跳转强制完全解除内核映射(FUCKWIT),这么极端的办法都认真考虑过,可想而知这个漏洞给开发人员造成了多大的麻烦。

正在运行的程序无论什么时候想干点儿什么有用的事,比如写个文件或者打开个网络连接啥的,都得暂时将处理器控制权交给内核去执行这些工作。为使用户态和内核态之间的切换快速高效,即便程序本身看不到内核,内核还是会出现在所有进程的虚拟内存地址空间里。需要内核的时候,程序就执行一个系统调用,处理器切换到内核模式。而在用户态下,内核的代码和数据对用户不可见,但存在于进程的页表里。

可以把内核比作天上的神仙,端坐云头俯瞰大地。凡人看不到神仙,但是可以向神仙许愿。

KPTI补丁将内核放到一个完全隔离的地址空间,让它不仅仅对进程不可见,甚至根本不在进程里了。其实本没必要做到这一步,但很明显,英特尔的芯片里确实出现了可令内核访问防护机制被绕过的漏洞。

这一隔离方式的缺点就在于时间开销太高昂了。每次系统调用都要在两个隔离的地址空间来回倒腾,还有超级费时的硬件中断,想想都让人生无可恋。这些切换不会即时发生,还会导致处理器废弃缓存的数据而去内存中重新加载信息。所有这些都会增加内核的开销,拖慢计算机的速度。

黑客会怎么滥用这个安全漏洞呢?

至少,这个漏洞可以被恶意软件用来更加容易地利用其他安全漏洞。

最坏情况的话,就是被程序和已登录用户利用来读取内核内存里的内容了。总之,情况很不妙。内核内存空间之所以对用户进程不可见,是因为它有可能含有各种各样的秘密,比如口令、登录密钥、缓存的磁盘文件等等。不难想象,一旦浏览器里运行的JavaScript脚本,或者共享公共云服务器上的恶意软件能够嗅探内核中受保护的数据,那会是怎样一个恐怖的场景。

尤其是,该漏洞可被滥用来击溃KASLR(内核地址空间布局随机化)——操作系统在虚拟内存的随机位置部署内核组件的一种防御机制。该机制可挫败滥用内核中其他漏洞的企图:通常是漏洞利用代码,尤其是面向返回编程的漏洞利用代码——依赖对内存中已知位置的计算机指令的重用。

如果内核代码在内存中的位置被随机化了,漏洞利用代码就找不到所需的内部组件,也就不能完全破坏系统了。该处理器设计缺陷有可能被用来找出内核在内存中存放其数据和代码的位置,因此,必须赶紧打上软件补丁。

然而,英特尔芯片中的漏洞有可能造成比上述缓解措施被绕过更糟糕的后果。圣诞节时,AMD给Linux内核邮件列表发了封电子邮件,称AMD处理器不受该漏洞影响。然而,该邮件中的措辞实际上透露了该漏洞利用上的一些细节:

AMD处理器不受内核代码数据读取攻击的影响。AMD微架构不允许内存引用,包括猜测性的引用,也就是可导致页面出错的低权限模式下对高权限数据的访问。

此处的关键词是“猜测性”。英特尔之类现代处理器会进行猜测性代码执行——CPU尽最大努力猜测下一个要执行的代码是哪段并取来执行,以使其内部管道布满一系列应执行的指令,提升CPU指令执行的效率。

从上面AMD软件工程师汤姆·兰达基所述看来,英特尔CPU的猜测性代码执行很可能缺乏必要的安全检查。似乎可以构造那么一种软件,让处理器开始执行通常会被阻止的指令(比如以用户态读取内核内存),并在权限检查发生前就将该指令执行完毕。

这么做就可以使Ring3级用户代码能够读取Ring0级内核数据了。当然,这不是什么好事。

该漏洞的细节还有待证实,关于其严重性的讨论也只是猜测,但考虑到Linux和Windows的大改,以及这些大幅更新推出的快速性,这一漏洞很可能比KASLR绕过更严重。

在Linux上隔离内核与用户地址空间的更新,是在名为KAISER的补丁集上做出的。创建KAISER补丁集的奥地利格拉茨技术大学科学家们,正是发现可以通过对CPU虚拟内存系统的边信道攻击,抽取内核内存布局信息以挫败KASLR防护的那个团队。该团队提出,分隔内核与用户空间可防止此类信息泄露,而他们的研究正是这一轮KPTI补丁的灵感来源。

7月份的时候,有人写了篇博客,记叙自己通过滥用猜测性执行来从用户态读取内核内存的尝试。尽管没给出任何可用的概念验证代码,这位仁兄提到:

我的结果表明,即便内核态和用户态之间的隔离被打破,猜测性执行确实还在进行。

KAISER补丁集似乎就与这篇博客文章相关,而格拉茨技术大学团队通过滥用虚拟内存布局突破KASLR防护的方法,也在某种程度上证明了这位博主的正确性——英特尔x86芯片上的猜测性执行是可以用来获取内核内存的。

共享系统

元旦时,一篇流传甚广的推特文章称,该漏洞将影响一系列大品牌云计算环境,包括亚马逊EC2、微软Azure和谷歌Compute Engine:

目前有个暂不公开的安全漏洞,影响当下所有实现了虚拟内存的英特尔CPU架构,需要硬件修改才能完全解决。目前已经开发出了紧急软件缓解措施,并已应用到Linux内核上,NT内核中的类似缓解措施似乎在11月份就出现了。最坏情况下,该软件补丁会导致正常工作负载的执行速度大幅变慢。有迹象表明,对这一漏洞的攻击会影响到常见虚拟化环境,包括亚马逊EC2和谷歌 Compute Engine……

微软的Azure云上运行有大量Linux系统和Windows系统,大概就是为了应用上述补丁,将于1月10日停机维护再重启。

AWS也通过电子邮件提示客户,将于本周五进行重大安全更新,但没有对更新内容进行详细说明。

2017年底的时候就有流言说存在严重的虚拟机管理程序漏洞——可能是在Xen开源虚拟机平台中。或许该流言中的漏洞就是这个硬件漏洞:通过内核内存访问可对虚拟机管理程序进行攻击。该漏洞必须得补上,因而也就会造成大量客户虚拟机的重启。

英特尔发言人对评论请求没有做出任何响应。

最新

英特尔处理器的缺陷已经被确认。一位在阿姆斯特丹自由大学攻读系统和网络安全的博士生给出了该 Chipzilla 漏洞的PoC程序,实现了在用户模式下读取内核的内存信息。

最终,苹果的macOS也已经发布补丁,修补了从10.13.2版本开始的芯片设计错误。并且,64位ARM Linux内核似乎也会收到KAISER补丁集,将内核与用户空间完全隔离开,以阻止任何试图突破KASLR的尝试。

相关阅读

英特尔CPU曝漏洞 可被利用绕过ASLR

英特尔CPU控制机制存在隐秘开关 可被黑客利用成为后门

红色警报!英特尔芯片中存活9年之久的远程执行漏洞

 

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章