硬件漏洞骑士、熔断、幽灵、预兆漏洞基本情况
(一)“骑士”VoltJockey漏洞(二)“熔断”Meltdown漏洞(三)“幽灵”Spectre漏洞(四)“预兆”Foreshadow漏洞(一)“骑士”VoltJockey漏洞
“骑士”漏洞是我国研究团队发现的首个处理器硬件漏洞,该漏洞是因为现代主流处理器微体系架构设计时采用的动态电源管理模块DVFS存在安全隐患造成的。
DVFS模块的设计初衷是降低处理器的功耗,允许多核处理器根据负载信息采用相应的频率和电压运行。一般说来,高运行频率配备高电压,反之采用低电压。但是,当某一个核出现电压和频率不太匹配的情形,如电压偏低无法满足较高频率运行需求时,系统就会出现短暂“故障”,就像是电压不稳灯泡闪烁一样,有时虽然不会影响系统整体运行,但如果该故障发生在安全等级较高的操作过程中,如加解密程序,会因为故障对系统行为结果的干扰会泄露出重要的系统行为信息,影响系统安全。“骑士”攻击正是利用这一漏洞,采用电压故障精准注入的方式,迫使处理器可信执行区(TEE,如ARM TrustZone、Intel SGX等)内的高安全等级程序运行出现故障,从而逐渐暴露其隐含的秘钥信息或者绕过正常的签名验证功能。
针对“骑士”漏洞的攻击完全是在DVFS允许的电压范围内进行,且攻击过程可以完全使用软件在线、远程实现,不需要额外的硬件单元或者线下辅助。“骑士”漏洞广泛存在于目前主流处理器芯片中,可能严重波及当前大量使用的手机支付、人脸/指纹识别、安全云计算等高价值密度应用的安全,影响面广。
攻击者的进程运行在一个低频率的处理器核心,受害者的进程运行在一个高频率的处理器核心上,攻击者进程提供一个短时间的故障电压,控制好电压的大小,使得这个电压对攻击者进程所在处理器核心没有影响,但是能使受害者进程所在处理器核心产生硬件错误,从而影响受害者进程。
具体的利用细节是,准备一个适当的能够发生电压故障的环境,做三件事,一是将受害者程序运行的处理器核心配置成高频率,其它处理器核心配置成低频率;二是攻击者程序用一个固定、安全的电压初始化处理器;三是清楚目标设备的剩余状态,包括Cache布局、分支预测表、中断向量表和状态寄存器等。
通常情况下,能够被VoltJockey注入错误的函数在受害者程序中只占很小的一部分,我们并不能确定其具体的执行时间,因此,攻击者程序需要在受害者程序产生错误之前对其中间执行过程进行监控,等待能够用来注入错误的函数被执行。
硬件注入攻击的目标是改目标函数的一小部分指令和数据,而且,这部分被影响的代码应该尽可能小。因此,错误注入点应该能被精确控制。到能够产生错误注入之前需要的时间,称为“预延迟”。
故障电压的大小和持续时间,是使产生的硬件错误能够被控制的两个因素。找到恰当的电压和持续时间,使得数据按照预期被改变,从而影响原有的程序流程,是非常重要的。
攻击的最终目的是获取受害者程序的敏感数据,或者篡改受害者进程的函数,而不是使受害者程序所在内核崩溃,因此,需要错误注入完成后,尽快恢复处理器核心电压为修改之前的正常值,确保受害者程序继续执行。
(二)“熔断”Meltdown漏洞
熔断,也译作崩溃,编号CVE--5754,正式名称为“Rogue Data Cache Load”,常译作“恶意数据缓存加载”,是一个存在于英特尔大部分x86/x86-64微处理器(CPU)、部分IBM POWER架构处理器以及部分ARM架构处理器中的关于推测执行机制的硬件设计漏洞及安全漏洞。该漏洞使得低权限的进程无论是否取得特权,均可以获取受高权限保护的内存空间中的数据,漏洞利用是基于时间的旁路攻击。
由于英特尔处理器及IBM POWER处理器均在市场上占据极大的份额(出现漏洞的ARM处理器在漏洞被发现时尚未正式面市),这种涉及硬体漏洞影响范围甚广,包括几乎整个x86、POWER伺服器领域、几乎整个小型主机及大型主机市场、个人电脑市场等都无一幸免,另外该漏洞的危险程度之高(无需特权即可存取敏感数据所在的记忆体空间),曾一度令安全人员及机构怀疑漏洞的真实性,而提前公布这些漏洞还极有可能引发全球性的安全灾难,因而选择先与处理器厂商及核心客户联络协商备妥修补方案再另行公布。目前该硬件漏洞可通过软体实作规避,包括Linux系统、Android、OS X/macOS、Windows等等都有相应的修复程式(像是Linux的内核页表隔离技术),但是软体规避将导致处理器效能的显著下降。而从根本上修复该漏洞的方法是重新设计处理器的微架构,为此英特尔、IBM及ARM都将新处理器微架构的推出时程大幅押后。
熔断漏洞是基于设计不良的数位电路设计中出现的竞争条件,再结合许多现代微处理器的非依序执行及推测执行特性而产生。
在具备非依序执行及推测执行特性的处理器上,处理器会检测指令的相依性,对无相依性的指令会进行预先执行,或者当处理器执行某一指令出现异常而面临停顿时,处理器会先执行与异常指令无相依性的指令以跳过停顿,这两类指令执行方式的执行结果都会保存到CPU快取上一段时间以备使用(超过时间即抛弃结果),这些预测执行的动作包括分支预测,预读取,推测性内存访问,缓存缺失的重叠/乱序处理(MSHR)等等。
某行程的某条指令需要其指定某个记忆体位址数据进行运算,基于CPU快取的机制,该数据会先载入至CPU快取上,而这个过程对于指令而言是透明的,因此其它行程是无法直接从CPU快取上得知该数据的内容,而又因数据未载入至CPU暂存器上,需要该数据的指令仍无法得知数据内容,在这里,基于分级保护域机制,CPU将数据从CPU快取载入至CPU的暂存器前是需要经过数据权限检查和记忆体位址合法性检查,只有这些数据的存取权限被确认等于或低于该行程的权限、记忆体位址空间的存取权限符合该行程的权限时,方能被相应行程的指令存取,否则将数据丢弃并对该指令进行异常处理。但是,而从记忆体载入数据到CPU快取时,CPU是既没有对这些数据进行权限检查也没有进行记忆体位址的合法性检查的,而没有被命中的CPU快取的数据也不会马上被清空。如果CPU快取的数据内容无法被得知,那么这种机制的处理逻辑并不会有问题,然而如果有方法可以从其它途径“偷看”CPU快取的数据内容的话,那么这种处理逻辑便存在漏洞。
要利用熔断漏洞,在指令处理期间,用异常的指令使得CPU进入对异常指令的异常处理当中,同时令CPU的推测执行去先执行一些非法指令,内存访问和权限检查或记忆体位址合法性检查两种操作在这里发生竞争冒险,因为受影响的处理器中的指令流水线意味着在推测执行期间,来自未经授权地址的数据几乎总是被临时加载到CPU的缓存中,即使原始读取指令由于特权检查而最终失败并且从不产生可读结果,这个时候再利用旁道攻击,利用存取CPU快取及存取记忆体的时间差,重建目标数据。这样未经授权的进程就可从映射到当前进程的内存空间的任何地址读取数据。
由于许多操作系统将物理内存、内核进程和其他正在运行的用户空间进程映射到每个进程的地址空间,并依靠特权检查来防止未经授权的访问,因此,熔断漏洞有效地允许运行在用户空间的恶意进程在不需要权限提升的情况下,读取任何物理内核或其他进程的映射的内存,不管它是否应该能够这样做。若要防范这个漏洞所造成的危害,需要避免使用内存映射方式或使用内存分页隔离(均是基于软件的解决方案,后者是将用户空间的内存地址与内核空间的内存地址相隔离,但这将增加内核态与用户态之间的上下文交换开销),或避免潜在的竞争条件(修改CPU的微代码和/或执行路径)。
恶意程式利用熔断漏洞进行攻击活动时也无法被侦测感知,是该硬件漏洞的一大危险之处。
(三)“幽灵”Spectre漏洞
幽灵漏洞是一个存在于分支预测实现中的硬体缺陷及安全漏洞,含有预测执行功能的现代微处理器均受其影响,漏洞利用是基于时间的旁路攻击,允许恶意进程获得其他程序在映射内存中的资料内容。幽灵是一系列的漏洞,基于攻击行为类型,赋予了两个通用漏洞披露ID,分别是CVE - -5753(bounds check bypass,边界检查绕过)和CVE--5715(branch target injection,分支目标注入),于1月随同另一个也基于推测执行机制的、属于重量级资讯安全漏洞的硬体漏洞(熔断)一同公布。由于该漏洞是推测执行机制导致的,加上不同处理器架构对推测执行又有不同的实作方式,因此这个缺陷无法获得根源上的修复而只能采取见招拆招式的方法防范,而且因机制所致,各种解决方案还有不可预料的效能下降。
幽灵漏洞依赖于运行中的即时编译(JIT)系统,用于Javascript的JIT引擎已被发现存在此漏洞。网站可以读取浏览器中存储的另一个网站的数据,或者浏览器本身的记忆体。对此Firefox 57.0.4(部分)及Chrome 64通过为每个网站分配专用的浏览器程序来阻挡此类攻击,作业系统则是通过改写的编译器重新编译以阻挡利用该漏洞进行攻击的行为。
针对幽灵漏洞,除了软体层面上进行修改以外,处理器也需要通过微指令更新来阻挡这类攻击。随着幽灵缺陷衍生的安全漏洞(攻击手段变体,包括CVE - -3693、CVE - -3640、CVE - -3639等)被逐一发现,英特尔等CPU开发商不得不在修复既有缺陷的同时资助第三方安全团队继续发掘潜在的缺陷以破财消灾。
幽灵漏洞是一个可以迫使用户操作系统上的其他程序访问其程序电脑记忆体空间中任意位置的漏洞。
幽灵不是单个易于修复的漏洞,而是一类潜在漏洞的总和。它们都利用了一种现代微处理器为降低内存潜伏(Memory latency)、加快执行速度的常用方法“预测执行”的副作用。具体而言,幽灵着重于分支预测,这是预测执行的一部分。与同时披露的相关漏洞“熔断”不同,幽灵漏洞不依赖单个处理器上记忆体管理及系统保护的特定功能,而是一个更为通用的漏洞。
幽灵论文展示了完成攻击的四个基本步骤:
首先,论文阐述了在现代处理器中的,恶意程序可以通过程序内部的运行操纵分支预测逻辑,使得分支预测命中或者失败的情况可以提前判断。
随后展示了可以可靠地对缓存命中和未命中间的差异进行计时,因此,本来应该是简单的非功能差异,实际却可作为秘密信道,从无关信息中提取进程的内部工作信息。
然后,论文以一个简单的示例程序和一个在浏览器沙盒中运行的JavaScript片段为基础,将结果与返回导向编程攻击等原理进行综合;在这两种情况下,只需简单使用由普通编译器或现有浏览器中JavaScript引擎生成的代码,利用其中条件分支的预测执行,受害者进程的整个地址空间(即运行中程序的内容)都将可读。其基本思想是,在现有的代码中寻找预测执行可能涉及到不可访问数据的地方,操纵处理器,使得预测执行必须触及该数据的实际内容,然后对处理器的副作用计时,这时预取机制已经加载完成了一条缓存线,结果就是访问这条缓存线的数据速度会更快。
最后,论文将这种攻击一般化到受害进程的任何非功能状态上。紧接着讨论了甚至像总线仲裁延迟这样非常不明显的非功能性效应。
“幽灵”和“熔断”之间的根本区别在于,后者依赖于现代英特尔处理器的特定功能:CPU可能会被诱使预测执行到受保护的系统数据中,被迫进入并处理相关的安全异常。“幽灵”中的统计学特征更为明显:尽最大努力以某种方式调教处理器的分支预测机制,并使用现有库中可用(或不可用)的代码来实现基本相同的事。
(四)“预兆”Foreshadow漏洞
预兆漏洞被评为“一把通向数据网络的钥匙”
预兆漏洞被英特尔称为L1 终端故障 ,是一个影响现代微处理器的漏洞,由两个独立的研究团队于 年 1 月首次发现,该漏洞是对英特尔处理器的推测性执行攻击,可能导致个人计算机和第三方云中存储的敏感信息泄露。该漏洞有两个版本:第一个版本(CVE - -3615)针对来自SGX的数据泄露;第二个版本针对虚拟机、管理程序、操作系统内核内存和系统管理模式内存。
预兆漏洞类似于之前发现的影响Intel和AMD芯片的幽灵漏洞,以及同样影响 Intel 的熔断漏洞。AMD表示其产品不受安全漏洞的影响。根据一位专家的说法,“预兆”让恶意软件侵入了“幽灵”和“熔断”漏洞都无法破解的安全区域。结合各种研究表明,“预兆”突破了采用 SGX 技术的英特尔芯片,并影响了过去七年构建的所有英特尔核心处理器。
但是“预兆”可能很难利用。截至 年 8 月 15 日,似乎没有证据表明任何涉及预兆漏洞的严重黑客攻击。而且,应用软件补丁可能有助于减轻一些担忧,但是安全性和性能之间的平衡可能是一个值得考虑的问题。某执行云计算的公司发现其整体计算能力显着下降,但据研究人员称,人们不会看到任何性能影响,但是单纯的“数据泄露”。据英特尔称,真正的解决办法是更换当今的处理器。
年 8 月 16 日,研究人员在USENIX 安全会议上的题为“预兆漏洞:通过瞬态乱序执行提取英特尔SGX王国的密钥” 的研讨会和出版物中介绍了预兆安全漏洞的技术细节。
预兆漏洞获取的敏感数据是SGX enclave 中的加密数据。通常,攻击者会尝试从 enclave 外部读取 enclave 内存,允许推测执行根据读取的数据修改缓存,然后允许处理器在检测到受保护的 enclave 内存时阻止推测涉及,不允许阅读。推测执行可以在处理器注意到缺少权限之前使用一级缓存中的敏感数据。预测漏洞攻击是隐蔽的,之后在计算机日志中几乎没有留下攻击事件的痕迹。
英特尔的软件保护扩展(SGX)功能让程序可以在英特尔处理器上建立所谓的安全区域(secure enclave)。芯片的这部分区域被围了起来,运行计算机操作系统无法访问或更改的代码。即使恶意软件或另外的威胁危及主计算机,安全区域也为敏感数据提供了避风港。但是来自世界各地五个学术机构的一群研究人员发现,虽然SGX基本上可以击退幽灵漏洞和熔断攻击,但却无法防范预兆漏洞。