2018年1月,“熔断”(Meltdown)与“幽灵”(Spectre)安全事件以爆炸性的速度与方式占据了各大新闻媒体的头条和IT工作者的朋友圈,在整个安全界闹得沸沸扬扬。正所谓几家欢喜几家愁:一方面,新鲜出炉且又影响力深远的安全漏洞让无数安全从业人员和研究者兴奋不已;另一方面,漏洞带来的安全隐患让Intel、AMD、ARM、NVIDIA、Microsoft和Apple等各类厂商陷入了极度的紧张之中,危机公关、应急响应和下发补丁等措施相继呈现在公众的视线当中。作为一种安全防御技术,TEE是否能够抵御Meltdown & Spectre的攻击呢?答案是否定的,本文博主就详细分析一下这个令人痛心的问题,文章后面部分也将附带聊一聊包括虚拟化、SGX和TPM在内的相关隔离技术与沙箱(Sandbox)技术对于本次安全事件的防御能力。
Meltdown和Spectre攻击的核心思想均是利用了现代CPU 中普遍存在的预测执行这一特性。预测执行通过同时执行多个指令来提高速度,执行的顺序可能与指令进入CPU 时的顺序不同。为了提高性能,CPU 会预测分支的哪个路径最有可能被采用,甚至会在分支完成之前继续预测性地执行该路径。如果预测错误,这种预测执行将会回滚,而这个过程软件代码是无法感知到的。两种攻击凭借特定方式滥用CPU预测执行,能够从权限较低的用户进程(例如设备上运行的恶意应用)访问高权限进程的内存(包括内核内存),这有可能导致攻击者获取到用户设备上的一些敏感数据,例如密码、登录密钥、用户的私人照片、邮件、即时通讯信息甚至是商业秘密文件等。
Meltdown利用的漏洞被分配的正式CVE编号为CVE-2017-5754,其实质为“rogue data cache load”(恶意数据缓存读取),能够使普通用户进程读取系统内核内存。Spectre利用了两个漏洞来实现攻击,这两个漏洞编号为CVE-2017-5753和CVE-2017-5715,其中前者的实质为“bounds check bypass”(绕过边界检查),后者为“branch target injection”(分支目标注入),组合应用这两个漏洞能使攻击者利用CPU 检查内存访问调用有效性的时间延迟,让普通权限的用户进程访问高权限内核的内存页表项。
值得说明的是,虽然这两种攻击是最近被呈现在人们眼前的,但他们均需要建立在已有的缓存攻击(cache attack)的基础之上,实施基于缓存的侧信道攻击(cache-based side channel attack),以获取所要探测的高权限内存内容。对于ARM架构cache attack感兴趣的读者,可参见ARMageddon: Cache Attacks on Mobile Devices。
本节中提到的TEE特指移动嵌入式平台中的可信执行环境,主要以GlobalPlatform给出的定义为主,可参见可信执行环境(TEE)技术介绍。当前主流的TEE实现依赖于ARM TrustZone硬件架构技术,平台中一块整体的SoC包括了一颗基于硬件隔离的ARM CPU,可以在安全与非安全状态间进行切换。
TEE核心思想源于隔离理念,将非安全的OS及应用与安全敏感的OS及应用相互隔离,以保护高安全的OS及应用免受恶意攻击。TEE的隔离建立在硬件隔离技术之上,较纯软的隔离技术如进程隔离和虚拟化技术等,在理论上安全性更高一些。当前ARM TrustZone技术的实现基于硬件隔离,对CPU、内存和一些相关外设实施了隔离管理机制,对cache内存储的数据也有区别对待。
然而,TEE仍然无法有效抵御Meltdown和Spectre,其核心原因是安全世界与非安全世界的数据项在CPU cache中共存,即CPU cache并没有实现完全的物理隔离,而是采用共享的模式。这样一来,攻击者利用上面讲到的CPU漏洞再借助基于缓存的侧信道攻击,可以在非安全世界的进程中获取安全世界进程的敏感信息。虽然从实际攻击角度上来看,攻击的实施需要克服很多困难,如cache数据项的定位与识别、在隔离环境下成功触发CPU漏洞以及减少内存隔离带来的影响等,但从理论上讲,这些困难都是可以寻找方法逐一解决的,因而TEE确实无法抵御Meltdown和Spectre的攻击。
虚拟化技术是较早的源于隔离思想的技术实现之一,代表的成果和产品有VMware、Intel TXT、Xen、KVM和QEMU,虽然这些成果的初衷可能不都是为了满足特定的安全需求,但它们确实在某种层面上解决了一部分安全问题。此外,很多沙箱技术成果也是基于虚拟化技术实现的,例如VirtualBox、WindowBox和Sandboxie等等。虚拟化技术大多以软件实现为主,虽然有的成果需要底层硬件技术的支持,如Intel VT技术,但底层技术的设计与实现并没有专门地、成体系地考虑安全问题。在具有Intel VT等隔离技术的通用X86平台上,其CPU、cache和内存等硬件资源基本上在主机与虚拟机、虚拟机与虚拟机之间共享,即使采用各种安全机制实现软隔离,它们依然无法抵抗Meltdown和Spectre的攻击。从相关新闻报道中可知,Meltdown和Spectre对于虚拟化隔离的安全机制是无法感知的,即可以成功突破隔离界限,实现所谓的虚拟机逃逸(virtual machine escape)。
基于规则的沙箱技术如AppArmor和TRON等,大多使用纯软的访问控制或白名单机制,它们的防御能力较弱,在Meltdown和Spectre面前不堪一击。
Intel SGX技术是Intel专为增强软件安全性而设计和实现的架构,这种架构方式并不是识别和隔离平台上的所有恶意软件,而是将合法软件的安全操作封装在一个enclave中,保护其不受恶意软件的攻击,特权或者非特权的软件都无法访问enclave,也就是说,一旦软件和数据位于enclave中,即便操作系统或者和VMM(Hypervisor)也无法影响enclave里面的代码和数据。SGX创建的enclave也可以理解为一个TEE,其与传统虚拟化技术有很多类似之处。同样的,SGX仍使用一套CPU、cache和内存硬件资源,无法对Meltdown和Spectre进行免疫,事实上,在Spectre公开仅数日之后,一个成功攻击SGX上安全enclave的Spectre攻击案例被披露,相关报道可参考Side Channels, Spectre, Meltdown and Trusted Execution。
可信计算技术的研究成果TPM,是目前可以较好抵御Meltdown和Spectre的技术,这里说的抵御指的是成功保护TPM中的安全敏感资源,如密钥等。传统的TPM在PC上以独立芯片的形式存在,高敏感信息从不暴露在芯片之外,该芯片有自己的处理器和存储器,能够自行处理敏感运算,只对外提供处理结果。这样一来,PC上主CPU的漏洞及基于缓存的侧信道攻击无法影响到TPM内部,也就无法获取TPM内部的安全敏感资源。事实上,TPM充当了一个安全单元(SE)的作用,理论上独立SE的解决方案均能够有效保护内部资源,抵御Meltdown和Spectre的侵扰。
消除Meltdown和Spectre攻击的根本措施是很难在短时间内简单实现的,需要CPU厂商做出具体的设计或实现调整,而且很有可能以牺牲性能为前提。当前的修补措施多是从OS角度出发,阻止预测执行的滥用,这同样会造成性能的衰减。
除了上述措施,针对Meltdown和Spectre攻击,可能的防御机制还有:
1. 物理隔离的cache:对于安全敏感数据和非安全数据的隔离,实现完全的物理隔离cache,以此抵御基于缓存的侧信道攻击,可以同时有效阻止一系列基于缓存的强力攻击;
2. 各类平台广泛采用SE:SE能够有效保护内部敏感数据,抵御来自外部的非授权攻击行为;
3. 多方计算(Multiparty Computation,MPC):MPC可以将安全敏感的信息拆分成多部分由不同实体方保存或处理,虽然它无法根本解决Meltdown和Spectre的攻击问题,但可以大大提升利用攻击获取有效敏感数据的难度。
此次Meltdown和Spectre安全事件轰动了整个安全圈,由于绝大部分架构平台的CPU都存在类似的漏洞,而CPU又是所有软硬件的根基,这让很多长久以来所设计和研发出的安全机制与方案都瞬间崩塌,毫无招架之力。
这次事件也再次告诉我们,一套硬件或软件系统的效用性与安全性往往很难做到完美的两全,它们常常存在此消彼长的矛盾。在设计系统的时候,不能仅为了大幅提高便捷性和效率性而抛弃安全性,一旦东窗事发,其后果将不堪设想。因此,还是应该多次重复地论证与测试系统方案,尽可能减少和控制方案设计的风险性问题。