该漏洞存在于英特尔的 x86 硬件之中,无法通过微码升级来解决,必须在系统层面通过安装软件、或者购买没有设计缺陷的新处理器来解决——所以包括苹果 64 位 macOS 等在内的其他系统也需要进行类似的更新和调整。
目前,英特尔芯片漏洞的具体细节尚未披露,预计会在下周二的微软补丁发布日公布。虽然 Linux 内核的修补程序可供所有人查看,但源代码中的注释已被改动以混淆该问题。
漏洞可能造成的影响
该 bug 存在于过去十年中所生产的现代英特尔处理器中,它能在一定程度上允许普通的用户程序识别受保护区域的内核布局及内容——从数据库应用到网页浏览器中使用的 Java。
一般的解决方法是使用 KPTI隔离,将内核的内存与用户进程完全分开。如果需要执行写入文件或打开网络连接等操作,就必须暂时将处理器的控制权交给内核来执行。为了尽可能快速高效地从用户模式转换到内核模式并最终回到用户模式,内核需要放置于进程的虚拟内存地址空间中)。当需要内核时,程序进行系统调用,处理器切换到内核模式并进入内核。完成后,告知 CPU 切换回用户模式,并重新进入该过程。在用户模式下,内核的代码和数据不可见,但会在进程的页表中显示。
这些 KPTI 补丁将内核移到了一个完全独立的地址空间,所以它不仅对运行的进程不可见,甚至根本就不存在。实际上这应该是默认的规则,但英特尔芯片中存在的缺陷,导致内核访问保护以某种方式被绕过了。
但是这种分离也有不利之处,系统在两个单独的地址空间之间互相切换是相对昂贵且耗费时间的,而且这种切换还会带来延迟,强制处理器转储缓存数据并从内存中重新加载信息——这增加了内核的开销,并减慢了计算机的速度。
安全漏洞为何会被滥用?
安全漏洞的存在,会被恶意软件和黑客大肆利用,严重的还会被恶意程序和登录用户滥用来读取内核内存的内容。想象一下,在浏览器中运行的一段 Java,或者在共享的公共云服务器上运行的恶意软件,能够接触到敏感内核保护的数据,包括密码、登录密钥、从磁盘缓存的文件等等。
具体而言,对于 bug 操作系统使用的防御机制是将内核组件放置在随机位置的虚拟内存中,能够阻止在内核中滥用其他错误的尝试。如果将内核的代码随机放置在内存中,攻击者就无法找到他们所需的内部小工具来完全破坏系统。不过处理器漏洞需要用来定位内核中数据和代码的位置,会导致软件被修补得乱七八糟的。
但是,英特尔芯片漏洞的影响可能比这些还糟糕。AMD 发给 Linux 的电子邮件中表示:AMD 处理器不受内核页表隔离功能的攻击限制,但是 AMD 微架构不允许包括推测引用在内的内存引用方式,因为这在访问时会导致页面错误、以较低特权模式访问较高特权数据。
这里就有“投机”的存在。从 AMD 软件工程师 Tom Lendacky 在上面邮件中提到的内容可以看出,英特尔的 CPU 在没有执行安全检查的情况下会推测性地执行代码,通过被阻塞的指令开始执行软件,并且在特权级别检查发生之前完成该指令——这就意味着将允许 ring-3 级用户代码读取 ring-0 级内核数据,隐患更大。
受影响的大牌云计算厂商
据了解,这个 bug 将会影响包括亚马逊 EC2、微软 Azure 和谷歌 Compute Engine 在内的众多知名云计算环境。
微软的 Azure 云将在 1 月 10 日进行维护和重启。亚马逊网络服务公司将通过电子邮件警告客户,预计本周五将有重大安全更新登陆,但没有披露具体细节。