Red Hat blog

Blog menu


最近,媒体都在谈论一种最新发现的安全漏洞,攻击者可利用现代微处理器(即芯片)的某些常见功能中的设计漏洞实施攻击,而计算机、平板电脑、智能手机及其他智能设备的运行都离不开这些微处理器。这些攻击被称为“Meltdown”(熔毁)和“Spectre”(幽灵),引起了人们极大的关注。人们为此深感担忧(完全正确),而在这种情况下,安装精心编写且已发布的各种必要的软件更新,就显得尤为重要。与此同时,包括红帽公司在内的众多技术领导者,正在联手应对这些安全漏洞,以尽量减小潜在受攻击的风险。

红帽一直致力于按照业界标准的安全封锁惯例来缓解潜在攻击,并基于“需要知晓”的原则组建了专门的小型团队,以期预先做好公开披露之前的准备工作。我非常幸运地参与领导了旨在缓解 Meltdown 和 Spectre 攻击的工作,更准确地说,针对的是变体 1、2 和 3。这三种变体都属于 Google Project Zero 在 1 月 3 日通过博客贴文所披露的一系列相似的攻击形式。在此期间,我们在自己的实验室中重现了 Meltdown(变体 3)并研究了其他变体,同时与诸多可靠的硬件合作伙伴并肩协作,共同开展缓解工作。

尽管我们充分掌握了这些漏洞的原理、当前对其造成因素的分析结果,以及可以缓解其潜在影响的补丁,但我们仍将继续与我们的合作伙伴、客户和研究人员一起合作,应对这一局势。此外,我们很愿意帮助其他人了解这些复杂的问题。我们希望使用浅显的语言和术语,让芯片设计行业之外的读者能够看懂。如果读者想要了解深入的技术细节,可参阅 http://meltdownattack.com/http://spectreattack.com/ 上面的原始研究论文及相关出版物。但请注意,参与识别安全漏洞的许多人员在计算机体系结构研究方面都具备深厚的学术背景。他们当中至少有一人在去年获得了相关领域的博士学位。因此,如果您克服了重重困难,才终于触及到技术细节的话,请不要感到沮丧,这的确是一项非常复杂而细致的工作。

在正式展开话题之前,我们先谈一谈“预测执行”的概念,可以用日常生活的例子打个比方。

假设一位顾客经常光顾同一家咖啡店,每天上午都会点一杯同样的咖啡饮料。时间一长,顾客就认识了咖啡师,咖啡师也熟悉了顾客要点的东西。为了提供更好的服务(同时节省顾客的排队等候时间),咖啡师最终决定,只要看到这位顾客进了前门并向他们招手示意,就开始制作他通常会点的咖啡。但是有一天,顾客要点的咖啡变了,咖啡师只好扔掉提前做好的咖啡,再改做新的咖啡并让顾客等候。

把这个比方再深入一下,假设咖啡师知道顾客的姓名,而且喜欢把顾客的姓名写在相应的杯子上。当咖啡师根据预测来制作顾客经常点的饮料时,他们会自然地将顾客姓名写在杯子上。如果顾客进店之后点了不同的饮料,则根据预测准备好的杯子和其中的饮料都得扔掉。但这样做的话,几乎每个看见杯子的人都可能看到上面的顾客信息。

咖啡店的点单场景就涉及到了预测。店员并不确定顾客进店之后要点拿铁还是美式咖啡,但根据以往的情况,他们知道顾客通常会点什么,因此他们会做一个经验性的预测,以节省顾客的等候时间。类似的预测在我们日常生活中随处可见,因为这样的预测往往是正确的,所以我们可以在同样的时间内完成更多事情。对计算机来说,也同样如此。计算机采用了一种被称为“预测执行”的技术,可以在确定需要执行某些操作之前预先执行这些操作,而这种做法的前提在于这些预测往往能够节省时间。

就计算机而言,当面临类似于“如果是 A,就这样做;否则,就那样做”这样的测试时,会使用预测执行这一技术。我们将这些测试称为条件,而随后相应地执行的代码则是我们称为条件分支的那一部分。也就是说,分支只是我们所选择运行的程序的一部分,这种选择完全基于条件测试的各种不同结果。现代计算机芯片有着非常先进的“分支预测器”,其借助非常精密的算法,可以在执行测试计算的过程中,提前确定可能的条件测试结果。在结果尚未确定的过渡期间内,预测器会预测哪个分支最有可能运行,从而执行其中的代码。如果预测证明是正确的,则与被动地等待测试完成相比,芯片可以运行得更快。如果预测是错误的,芯片会丢弃所有的预测性结果并运行另一个分支。分支预测器的预测准确性通常在 99% 以上。

您可以想象得到,如果芯片预测执行了正确的代码分支,就可以有效发挥出潜在的性能优势。事实上,预测执行是众多性能优化技术之一,在过去数十年中,这些技术显著提高了计算机的运行速度。只要实施得当,它们就可以产生巨大的性能优势。最新披露的漏洞问题的根源在于,芯片设计试图实现进一步优化,设计人员假设预测过程是一个黑盒,对外部观察者(或坏人)完全不可见。

业界传统的观点认为,在预测过程(称为“预测执行窗口”)中究竟发生了什么只能在事后确定,而且预测的结果要么由相应的程序使用,要么未被使用而完全丢弃。但事实证明,攻击者有办法看到预测窗口中发生的事情,进而可以对系统进行操纵。攻击者还可以控制分支预测器的行为,使得某些代码序列能够以预测方式执行,而在正常情况下,根本不应执行这些代码。我们预计,这些漏洞及其他可能利用预测执行的类似缺陷,会引发未来芯片设计方式的根本性变革,从而让我们在使用预测执行时不再面临安全风险。

让我们更深入地探究一下这些攻击,先从 Meltdown(变体 3)开始,这种攻击的影响非常广泛,因而受到了极大关注。在这种攻击中,芯片受到欺骗,在预测窗口期间载入了安全的数据,而未经授权的攻击者稍后可以查看以这种方式加载的数据。这种攻击利用了一种业界广泛使用的做法,即将内存中数据加载与权限检查过程分开执行。同样地,业界传统的观点假定整个预测执行过程是不可见的,因此,把这两部分操作分开执行并不存在什么风险。

在 Meltdown 中,一段巧妙设计的代码分支会首先以预测方式执行某些攻击代码。这类代码会加载程序通常无权访问的某些安全数据。因为加载数据是以预测方式进行的,而且针对数据访问的权限检查会并行执行(在预测窗口期结束之前不会失败),所以芯片内部特殊内存(即缓存)中就会载入具有特权的数据。然后,使用一个精心构造的代码序列根据特权数据的值来执行其他内存操作。尽管这些在正常情况下可看到的操作结果在预测过程之后不可见(最终被丢弃),但可以使用一种称为“缓存侧信道分析(cache side-channel analysis)”的技术来推断出安全数据的值。

要缓解 Meltdown 的威胁,就需要改变应用软件和操作系统之间对于内存的管理方式。我们推出了一种新技术,称为 KPTI(内核页表隔离),可对内存加以隔离,从而在运行用户代码的过程中,不会将安全数据加载到芯片内部缓存中。但由于应用软件每次要通过额外的步骤来请求操作系统代表它们执行某些操作(我们称之为“系统调用”),所以会导致性能出现下降。性能下降的程度大致上与应用程序需要使用此类操作系统服务的频率成正比。

Spectre 攻击分为两部分。第一部分(变体 1)涉及到“边界检查”违规。还是同样的方式,当以预测方式执行代码时,芯片可能会加载某些数据,这些数据会随后用来定位第二部分数据。作为性能优化技术的一部分,芯片在验证第一部分数据是否处于所定义的值域内时,就会尝试通过预测来加载第二部分数据。如果发生了这种情况,就可以布置代码按预测方式加以执行,并读取不应载入系统缓存内的数据,之后就能使用类似于上文所述的侧信道攻击将数据从缓存中提取出来。

缓解 Spectre 第一部分的威胁需要在整个内核中增加“加载屏障”机制。它们可以防止预测硬件基于第一次数据加载来执行第二次加载。为此,需要对整个内核源代码执行细微的、不太影响性能的更改。我们的 toolchain 团队已经开发了一些工具并与其他有关方面展开了合作,从而确定应该将这些加载屏障布置于何处。

Spectre 的第二部分(变体 2)在某些方面很有意思。它涉及到对分支预测器硬件进行“训练”,使其优先以预测方式执行某些代码,而不是执行本该执行的那些代码。根据分支代码本身在内存中的位置来确定给定分支选择的行为,是一种常用的硬件优化方法。不过,该内存位置的存储方式在应用软件和操作系统内核之间不具有唯一性。这样就有机会对预测器加以训练,使其以预测方式执行攻击者所期望的任意代码。通过精心选择某个“工具”(内核中有权访问特权数据的现有代码),攻击者可将敏感数据加载到芯片缓存中,然后再次利用同样的侧信道攻击将这些数据提取出来。

Spectre 第二部分造成的最大问题在于,攻击者有可能会操纵操作系统内核和虚拟机监控程序之间的边界,或者是同一底层硬件上运行的不同虚拟机之间的边界。在经过某个虚拟机的”训练”之后,分支预测器会使得虚拟机监控程序(或另一个虚拟机实例)中的特权代码能够访问可信的虚拟机监控程序数据,而这些数据可通过侧信道技术提取出来。对于私有云和公共云环境而言,如果其中有未安装补丁的服务器在运行,这种漏洞攻击将会带来极大的风险。

要缓解 Spectre 第二部分的威胁,就要做到:每当有程序请求操作系统(系统调用)或虚拟机监控程序提供服务时,操作系统需要(有选择地)禁用分支预测硬件,从而防止恶意代码将任何试图训练预测器的不良行为传递到操作系统内核或虚拟机监控程序中,或者在运行在同一服务器上的不可信虚拟机之间传递。这种方法非常有效,但会带来明显的性能损失。红帽的补丁程序将默认实施此安全更改并接受由此带来的性能影响,不过,我们也赋予了系统管理员开启或关闭这种更改(以及所有已实施的设置)的能力。我们还与大型 Linux 社区展开了合作,探索通过其他方式来禁用分支预测,力争在今后不断地减小这种性能影响。“Retpoline”就是一种可能的替代方案,采用专门设计的方法来运行操作系统的内核代码,从而防止不正确的分支预测。

希望本文能帮助读者较为深入地了解这些高度复杂的攻击行为。利用这些安全漏洞展开的攻击绝非小事,而缓解其危害也完全可以做到。目前网上已经公布了 Meltdown(变体 3)的一些示例代码,与此同时,红帽等主流软件厂商也在发布的软件更新中提供了补丁程序。随着时间的推移,可能还会有其他相关漏洞被发现,网上也会相应地公布利用这些漏洞的示例代码,因此,一旦有新的安全修复程序推出,请务必及时加以更新。

请一定要注意,现在仍处于发现一类全新系统安全漏洞之后的初期阶段,因此,各种缓解措施和建议的相关最佳做法都可能随时间而不断改变。我们将继续与行业领导者及开源社区密切合作,保护我们的客户免受这些及其他已知漏洞的危害,并使 Linux 能够更稳健地防御类似 Meltdown 和 Spectre 这样的攻击。在未来数月内,我们将不断发布有关这方面工作的更多文章,并及时为客户提供与我们产品有关的最新指导。若要了解更多,请访问 https://access.redhat.com/security/vulnerabilities/speculativeexecution

关注

内容推荐