【网络安全研究进展系列】基于 cache 的中间人攻击:操纵隔离执行环境中的敏感数据

编者按:2022年5月,由网络安全研究国际学术论坛(InForSec)汇编的《网络安全国际学术研究进展》一书正式出版。全书立足网络空间安全理论与实践前沿,主要介绍网络和系统安全领域华人学者在国际学术领域优秀的研究成果,内容覆盖创新研究方法及伦理问题、软件与系统安全、基于模糊测试的漏洞挖掘、网络安全和物联网安全等方向。全书汇总并邀请了近40篇近两年在网络安全国际顶级学术议上发表的论文(一作为华人),联系近百位作者对研究的内容及成果进行综述性的介绍。从即日起,我们将陆续分享《网络安全国际学术研究进展》的精彩内容。

本文发表于ACM CCS 2020,更多内容可参考论文原文“Cache-in-the-Middle (CITM) Attacks : Manipulating Sensitive Data in Isolated Execution Environments”。

ARM TrustZone技术被广泛用于为移动终端及嵌入式平台提供基于硬件的安全防护。传统的保护方式采用图1(a)所示的可信执行环境(TEE)架构,将敏感应用直接部署在安全世界(secure world)中,以TrustZone的硬件隔离保证敏感应用的安全。但TEE架构下,安全世界的可信计算基(TCB)会随着敏感应用的增加而增加;而且安全世界的应用需要通过设备制造商来部署,这样不方便。为解决这些问题,研究人员提出了图1(b)所示的基于隔离执行环境(IEE)架构的保护方案,安全世界中仅运行一个IEE监控程序(IEE monitor),负责在普通世界构建IEE给敏感应用运行。IEE监控程序确保所构建的IEE能够免受来自普通世界恶意程序或操作系统的攻击。

图1

然而,现有的IEE方案并未充分考虑对cache的保护。通过对IEE方案中的数据保护机制及ARM Cache特性的系统化研究,本文提出了基于cache的中间人攻击(CITM),利用cache与memory在读写操作、安全和隔离属性等方面的不一致,攻破IEE中的数据保护机制。我们以典型的IEE方案SANCTUARY(发表于NDSS 2019)、Ginseng(发表于NDSS 2019)和TrustICE(发表于DSN 2015)为例,阐述3种类型CITM攻击的原理,证明CITM攻击的广泛性和实际可行性。最后,在深入分析CITM攻击的原因之后,提出相应的防护措施,并进行性能评估。本文发表于ACM CCS 2020,更多内容可参考论文原文“Cache-in-the-Middle (CITM) Attacks : Manipulating Sensitive Data in Isolated Execution Environments”。

一、CITM攻击

总体来说,IEE监控程序需要在如下两种场景保护IEE中数据的安全。

场景1:不受信任的程序与IEE在不同的CPU核上并行运行。在多核平台上,不受信任的程序可能与IEE并行运行在不同的CPU核上。出于安全性考虑,IEE监控程序需要确保IEE存储(即为IEE分配的存储)是核隔离的,即该存储只有运行IEE的核才能访问,其他核无权访问。例如,SANCTUARY以硬件方式确保IEE内存只有IEE所在的核才能访问。

场景2:不受信任的程序与IEE在同一个核上以时分复用的方式运行。IEE监控程序需要在上下文切换时做好保护:

■ 当IEE的执行被挂起或终止时(以下简称“切出”),备份和清理IEE数据以防止其被随后运行的不可信程序访问;

■ 当IEE恢复执行或启动时(以下简称“切入),恢复IEE数据至IEE存储来保证IEE的正确执行。

然而,上述两种场景下的保护机制都可能遭受CITM攻击并威胁IEE数据的机密性和完整性。总体来说,我们提出3类CITM攻击,下面分别以SANCTUARY、Ginseng和Trust-ICE这3个IEE系统为例来介绍CITM攻击的原理。

1. 类型一:跨核操纵核隔离的IEE存储

该类型攻击针对场景1,即当两个核并行运行时,跨核操纵核隔离的IEE存储。我们以SANCTUARY系统为例介绍具体的攻击原理。

(1)SANCTUARY的数据保护机制。SANCTUARY使用图2所示的架构,通过内存及L2cache两级控制来保护IEE数据。首先,它以硬件模拟的方式实现核隔离的内存分配。具体来说,它为每个核分配一个唯一的非安全访问标识符(NSAID),并通过配置TrustZone地址空间控制器a(TZC-400)为每个NSAID分配隔离的内存区域。由于现有的ARM平台不支持为CPU的核单独分配NSAID(即一个CPU的所有核共享NSAID),因此SANCTUARY通过ARM Fast Models虚拟化工具模拟实现CPU核级别的内存隔离。其次,由于L2 cache是所有核共享的,因此为了防止攻击者通过L2 cache破坏IEE数据的安全性,SANCTUARY配置IEE内存的访问不经过L2 cache。因为每个核有自己的L1 cache,而且无法直接跨核访问,SANCTUARY未对L1 cache提供额外的保护。

图2

(2)共享属性。在系统化地研究了ARM平台上的cache特性后,我们发现了一种用于实现数据一致性保证的属性——共享属性。当处理器运行在对称多处理SMP模式时,共享属性保证不同的核在访问同一物理内存时从其L1 Data Cache获得数据是一致的。出于安全原因,Non-secure cachea上的数据不会被同步到Secure cache,反之亦然。在图2所示的架构中,IEE和不可信程序都运行在普通世界,因此执行过程中涉及的cache均为Non-secure,共享属性的一致性保证可能导致跨核的L1 cache操纵。

我们在i.MX6Quad sabre开发板上进行如下实验来确认共享属性对Non-secure L1 Data Cache的影响。简单来说,我们让所有4个核都运行在普通世界,访问相同的物理内存(以下简称测试内存),并且所有核的访问都不经过L2 cache。我们先把所有核上测试内存对应的L1 Data Cache都清零,然后向核0的L1 Data Cache写入0xffff并观察其他核上对应的L1 Data Cache 数据变化;之后,向核1的L1 Data Cache写入0xdddd并观察其他核上对应的L1 Data Cache数据变化。实验结果是,当所有核的内存都被配置为可共享时,一个核上的L1 DataCache数据会泄露到其他核,也会被其他核影响,如表1所示。反之,当一个核的内存被配置为不可共享时,其上的L1 Data Cache数据不会泄露到其他核,也不会被其他核影响,如表2所示。

表1

表2

(3)攻击流程。共享属性默认都是开启的(即处于使能状态),因此可按照图2红线所示进行攻击。其中,核0和核1运行在普通世界,核2运行在安全世界;IEE运行在核0,不受信任的操作系统(Rich OS)运行在核1。我们首先为核1构造一个页表条目,将内存页配置为可共享的,并使其物理地址指向核0的内存页(即IEE内存)。那么,当我们核1访问该内存时,核0的L1 Data Cache中的敏感数据将通过共享属性被窃取或修改。

在上面的攻击过程中,我们需要获得IEE内存的物理地址。由于SANCTUARY将IEE内存的相关页表维护在IEE中,攻击者无法直接获取其物理地址范围。然而,整个物理内存被分为3个部分,即IEE内存、TEE内存(分配给安全世界的内存)和未受保护的内存(分配给不受信任的操作系统的内存)。恶意的操作系统可以简单地获取未受保护的内存地址范围。剩下的两个内存区域可以通过判断对应的cache是Secure还是Non-secure进行区分。TEE内存对应的是Secure cache,当从普通世界读取TEE内存总是会返回0或产生异常。IEE内存对应的是Non-secure cache,当IEE运行时,攻击者读取IEE内存可能获得真实的数据。因此,通过内存访问的返回值可判断某一地址是IEE内存还是TEE内存。

2. 类型二:绕过IEE切出时的保护机制

该类型攻击针对场景2,即当一个核以时分复用的方式运行IEE和不可信程序时,攻击者可通过操纵cache绕过IEE切出(IEE被暂停或终止)时的保护措施(如加密备份IEE数据并清空IEE存储),使得不可信程序可以访问IEE数据。我们以Ginseng系统为例介绍具体的攻击原理。

(1) Ginseng的数据保护机制。Ginseng将IEE构建在寄存器中,由于寄存器是每个核独享的,可以阻止来自其他核上不可信程序的攻击。然而,由于寄存器的容量很小,Ginseng系统只能用来保护普通APP中的一些敏感函数,而且Ginseng构建的IEE运行在用户态。当IEE中运行的敏感函数调用不可信函数时需要进行切出保护,即将寄存器中的IEE数据加密并清空寄存器。为了确保安全性,该切出保护需要在安全世界或IEE中完成。由于寄存器容量太小,Ginseng系统的IEE切出保护措施在安全世界中完成,需要将控制权直接从IEE转移到安全世界。通常情况下,触发跨域(即普通世界和安全世界之间)跳转的常用方式是从内核态调用特权SMC指令。然而,这种方法不适用于Ginseng,因为其所构建的IEE运行在用户态,无法调用特权SMC指令。

Ginseng采用图3所示方案来完成跨域跳转。当IEE中的敏感函数要调用不可信函数时,先读一个安全内存(步骤①②),从普通世界访问安全内存,将触发一个安全中断异常,该异常被安全世界的GService(Ginseng系统的IEE监控程序)捕获(步骤③)。GService将寄存器中的IEE数据加密备份到内存,并清空相应的寄存器(步骤④)。随后,将控制流跳转回敏感函数(步骤⑤)并由其调用不可信函数(步骤⑥)。

图3

(2) 攻击流程。由于步骤①的内存读取操作是从普通世界发起的,所访问的cache是Non-secure,因此可以被普通世界的恶意程序读写。具体来说,攻击者在步骤①之前将安全内存对应的cache填上数据(即步骤)。此后,步骤①的内存读取操作将碰到一个Cache Hi(t  而非Cache Miss)导致步骤②*而非步骤②被执行。由于步骤②被绕过,步骤③④⑤也均被绕过。由此,在敏感寄存器未被清空的情况下,不可信函数将被执行并可访问其中的IEE数据。类似攻击类型一,在填充安全内存对应的cache之前攻击者也需要获得安全内存的物理地址。实际上,由于Ginseng系统构建的IEE运行在用户空间,其所有的页表都维护在不可信的普通世界操作系统内核中,因此攻击者可以很容易获得该地址。

3. 类型三:利用上下文切换过程中不完备的cache保护

该类型攻击针对场景2,当上下文切换期间的保护措施可以有效实施的情况下,攻击者仍然可能利用上下文切换过程中对cache保护的不完备实施攻击。我们以TrustICE系统为例介绍具体攻击原理。

(1)TrustICE的数据保护机制。TrustICE是针对单核平台设计的IEE系统,通过动态配置IEE内存的安全属性来实现IEE数据保护。具体如图4所示,当IEE程序运行时,IEE内存被设置成Non-secure,以允许IEE从普通世界进行访问;当不可信的富操作系统运行时,IEE内存将被设置成Secure。

图4

(2)攻击原理。在上下文切换过程中,虽然IEE内存受到了保护,但是对应的cache始终是Non-secure,而且未被正确处理。如图4(a)所示,当IEE暂停时,IEE内存被配置为Secure,但TrustICE未清除对应cache中的数据,因此可通过访问cache窃取IEE数据。同理,攻击者可以将恶意数据预先写入IEE内存对应的cache中,当IEE恢复执行时,它将首先读取驻留在cache中的恶意数据,而不是内存页中的合法数据,如图4(b)所示。该攻击过程也需要获得IEE内存的物理地址。与SANCTUARY类似,TrustICE将IEE内存的相关页表维护在IEE中,攻击者可以采取本文描述的方法来获得IEE内存的物理地址范围。

作者简介

雷灵光,中国科学院信息工程研究所,副研究员,主要从事系统及终端安全方面的研究, 包括移动终端安全、可信计算技术、容器安全等。在ACM CCS、TDSC、ESORICS、ACSAC等期刊/会议上发表论文20余篇。她的相关研究成果获得省部级密码科技进步一等奖。她参与编制信息安全相关国家标准多项,还主持国家自然科学基金课题、网络空间安全重点研发计划子任务、密码基金课题等。

(本文选取了文章部分章节,更多精彩内容请阅读《网络安全国际学术研究进展》一书。)

版权声明:本书由网络安全研究国际学术论坛(InForSec)汇编,人民邮电出版社出版,版权属于双方共有,并受法律保护。转载、摘编或利用其它方式使用本研究报告文字或者观点的,应注明来源。

Bookmark the permalink.

Comments are closed.