文/程越强
Intel SGX 技术是一种新的基于硬件的可信计算技术。该技术通过CPU的安全扩展,对用户空间运行环境(enclave)提供机密性和完整性保护。即使是攻击者获得 OS、hypervisor、BIOS 和 SMM 等权限,也无法直接攻击enclave。因此,攻击者不得不通过侧信道的攻击方法来间接获取数据(比如隐私数据,加密密钥等)。得益于enclave 的强安全假设和工作模型,攻击者有大量的侧信道攻击面可以选择,比如页表、Cache 、DRAM 等。这项工作是对侧信道攻击面进行一个全面的总结,并讨论一些可能的防御和检测方法。
当我们不能够完全相信某个计算平台(比如公有云和可能被攻破的操作系统)的时候,建立一个可信的运行环境(TEE)是非常重要的安全要求。近些年研究人员提出了很多TEE 系统用于保护应用程序,使其能够抵御来自操作系统的攻击。
Enclave 的运行环境有大量的资源和外面non-enclave 公用,比如Cache 、页表、DRAM 和分支预测器等,这就给攻击者提供了丰富的侧信道攻击面。而且,不可信的操作系统还仍然负责管理系统的资源,比如页表、内存、中断、进程调度等,这就进一步方便攻击者减小侧信道攻击过程中的噪音,从而提高侧信道攻击的成功率。
本文主要调研和总结目前已有的侧信道攻击。根据攻击面的不同,将从页表、TLB、Cache 、DRAM 和分支预测器等几个面进行侧信道攻击的介绍。SGX 的侧信道攻击十分难以防御。目前还没有一种防御策略可以防御以上所有攻击。本文最后对可能的侧信道防御攻击方法进行简要的总结,希望读者能够在某些方面受到启发。
Intel SGX 是一种基于硬件的TEE系统。该功能已经集成在Intel Sky-Lake 系列。区别以往的TEE 系统有着较大的可信计算基(TCB),SGX 的可信计算基非常小,仅仅包含CPU 和enclave 本身。任何的特权软件,比如OS、hypervisor、BIOS、SMM等都不包含在可信计算基内。Enclave有SGX 硬件专门预留的EPC(Enclave Page Cache )内存。EPC是PRM(processor reserved memory)的子集,并被系统软件按照4KB粒度进行分页管理。每一个EPC 页面只能分配给一个enclave。CPU 阻止任何nonenclave 去访问PRM,任何non-enclave 的访问都会导致一个失败的事务(aborted transaction)。在目前SkyLake 的处理器上面,失败的写操作被忽略,失败的读操作直接返回一个全1的值。
每个enclave 的程序指定一段ELRANGE(Enclave Linear AddressRange)的虚拟空间供自身运行。页表负责把虚拟地址映射为EPC所在的物理地址。页表的工作原理和以往的页表一样,比如会进行权限的检测、会设置access bit和dirty bit等等。Enclave 和 non-enclave 可以通过EENTER 和EEXIT 来主动切换工作模式。Enclave 运行时可能会被中断或者异常打断,这个时候enclave 会通过AEX(Asynchronous EnclaveExit)机制退出,切换到non-enclave工作模式。在模式切换过程中,运行状态会保存到SSA(State Save Area )结构体里面,同时清除TLB以保证enclave 的安全。
图1是 Intel SGX 内存分布和隔离机制。Enclave 跑在EPC 上面。Enclave的数据仅可以被enclave 自己访问,任何外界代码的访问都会被拒绝。
图1 Intel SGX 内存分布和隔离机制
威胁模型
侧信道攻击主要目标是攻击enclave数据的机密性(confidentiality)。攻击者来自non-enclave 部分,包括应用程序和系统软件。系统软件包括OS、hypervisor、SMM、BIOS 等特权级软件。
侧信道攻击一般假设攻击者知道enclave 初始化时的代码和数据,并且知道内存布局。内存布局包括虚拟地址,物理地址以及他们之间的映射关系。侧信道攻击还假设攻击者知道运行enclave 平台的硬件配置、特性和性能,比如CPU、TLB、Cache 、DRAM、页表、中断以及异常等各种系统底层机制。
图2 Intel SGX 侧信道的攻击面
侧信道的攻击面
enclave和non-enclave共享大量的系统资源,这就给侧信道攻击留下了非常大的攻击面。经过对现有资料的总结和系统结构的分析,我们把SGX的攻击总结在图2中。如图2所示,enclave 的运行过程中会用到:
1. CPU 内部结构。比如pipeline,branch prediction Buffer(BPB)等,这些结构不能够直接访问,但是如果可以间接利用,仍然可能泄露enclave的控制流或数据流。
2.TLB。TLB 有包括iTLB、dTLB和L2 TLB。如果HyperThreading打开,两个逻辑核共享一个物理核,这个时候会大大增加侧信道的可能。
3.Cache 。Cache包 括 L1 instruction Cache 、L1 data Cache 、L2Cache和 L3 Cache (又叫 LLC Cache )。
4. DRAM。DRAM 包含 channels、DIMMs、ranks、banks。每个 banks又包含rows、columns 和 row buffer。
5.Pagetable(页表)。页表可以通过权限控制来触发缺页异常,也可以通过页表的状态位来表明CPU 的某些操作。对于不同的攻击面,攻击者需要了解具体的细节和工作原理。其中比较重要的参考的文档就是Intel 的手册。目前SGX 已经部署在SkyLake 的机器上面。因此我们需要对SkyLake 的一些硬件和性能细节重点掌握。
侧信道攻击
侧信道攻击主要手段是通过攻击面获取数据,推导获得控制流和数据流信息,最终获取被enclave的代码和数据的信息,比如加密密钥、隐私数据等等。在此一一列举具体的工作,而是试图从攻击面的角度,全面的介绍侧信道攻击。本章节下面的内容,就从典型的攻击面,包括页表、TLB、Cache、DRAM以及CPU内部结构,描述目前已知的侧信道攻击。
1. 基于页表的攻击
最早的SGX侧信道攻击就是基于页表的攻击。这类利用页表对enclave页面的访问控制权,设置enclave页面为不可访问。这个时候任何访问都会触发缺页异常,从而能够区分enclave访问了哪些页面。按照时间顺序把这些信息组合,就能够反推出enclave的某些状态和保护的数据。该类典型的攻击包括controlledchannel attack和pigeonholeattack。这类攻击的缺点就是精度只能达到页粒度,无法区分更细粒度的信息。但是在某些场景下,这类攻击已经能够获得大量有用信息。
后来,基于页表的攻击有了新的变种。这些侧信道攻击主要利用页表的状态位。一个页表项有很多位,有些是用来做访问控制,比如P, RW, US, XD,有些则标识状态,比如D(dirty bit)和A(accessbit)。如果A bit 被设置,则表明该页表项指向的页面已经被访问;如果Dbit被设置,则表明该页表项指向的页面发生了写操作。通过监控观察这些状态位,攻击者就可以获取和controlled-channel/pigeonhole 攻击类似的信息。
2.基于 TLB 的攻击
目前还没有完全基于TLB 的攻击,但是已经出现TLB 作为辅助手段的侧信道攻击。关于TLB的两点重要信息,我们需要了解,希望对提出新的基于TLB 的侧信道攻击和防御有所帮助。
TLB 的层次结构:目前SkyLake 的机器,分为L1 和L2 两层。不同层次出现的TLB miss 的时间代价不同。
TLB 对代码和数据的区分:L1 区分代码(iTLB)和数据(dTLB)。两者直接有Cache coherence 的保证。L2 不区分代码和数据。
3.基于 Cache 的攻击
传统侧信道有很多基于Cache 的攻击在SGX的环境里面,这些侧信道技术仍然适用,而且可以做的更好。原因在于,在SGX 环境里面攻击者可以控制整个系统的资源。因此,攻击者可以有针对性地调度资源,减小侧信道的噪音,增加侧信道的成功率。降低噪音的策略大体可以有以下几种。
Core Isolation(核隔离)。这个方法的主要目标就是让enclave 独自占有一个核(不允许其他程序运行在该核上面)。
Cache Isolation(缓存隔离)。尽量使用L1 或者L2 级别的Cache进行侧信道攻击。L3 的Cache被所有的核共用,会引入不必要的噪音。
Uninterupted Execution(不间断运行)。也就是不触发或尽量少触发AEX,因为AEX 和后续的ISR(Interrupt Sevice Rountine) 都会使用Cache ,从而引入不必要噪音。少触发AEX 就是要使用中断绑定(Interrupt Affinity)和将时钟频率。不触发AEX 基本上就是让系统软件(比如OS)屏蔽所有中断。
除了降低噪音,攻击者还可以提高攻击的精度,大体策略有:一是高精度时钟。可以采用APIC 提供的高精度时钟和硬件TSC;二是放大时间差异。比如攻击者可以配置侧信道攻击代码所在的CPU 以最高频率运行,而对enclave 所在的CPU 进行降频处理。
基于Cache的侧信道攻击可以进行细粒度的监控。最小粒度可以做到一个Cache line,即64 个字节。由于粒度更小,基于Cache的侧信道可以比基于页表的侧信道(以及后面介绍的基于DRAM的侧信道)获得更多的信息。
4.基于DRAM 的攻击
RAM 一 般 由 channel、DIMM、rank、bank等部分构成。每个bank又有columns 和rows 组成。每个bank里面还有一个row buffer 用来缓存最近访问过的一个row。在访问DRAM 的时候,如果访问地址已经被缓存在row buffer当中(情况A),就直接从buffer 里面读取,否则需要把访问地址对应的整个row都加载到row buffer 当中(情况B)。当然,如果row buffer 之前缓存了其他row的内容,还需要先换出row buffer 的内容再加载新的row(情况C)。A、B、C 对应的三种情况,访问速度依次递减(情况A 最快,情况C 最慢)。这样,通过时间上的差异,攻击者就可以了解当前访问的内存地址是否在row buffer 里面,以及是否被换出。
基于DRAM的侧信道攻击有一些不足:第一,enclave 使用的内存通常都在缓存里面,只有少部分需要从DRAM里面去取;第二,DRAM的精度不够。例如,一个页面(4KB) 通常分布在4 个DRAM row 上面。这样,基于DRAM的侧信道攻击的精度就是1KB。仅仅比基于页表的侧信道攻击好一些,远远不及基于Cache 的侧信道攻击的精度;第三,DRAM里面存在很难避免的噪音干扰,因为一个DRAM row 被很多页面使用,同时同一个bank 不同row的数据读取也会对时间测量造成干扰,使得误报时常发生。
5.基于CPU 内部结构的攻击
CPU 内部有大量的结构是在enclave和non-enclave 之间共用的,这就给侧信道攻击提供了大量的攻击面素材。
目前对以CPU内部结构为攻击面的工作才刚刚开始,仅仅有一个工作发表。相信通过进一步研究,还会有其他的攻击面被陆续发掘。
从设计上来讲,SGX可以避免这类侧信道攻击。具体来讲,在enclave到nonenclave的切换过程中,CPU清除这些共用的内部结构体。这样,non-enclave就不会得到任何残留的记录。但在具体实现的时候,还要注意一些细节,比如清除的时间也必须是稳定不变的。如果enclave运行的差异会导致清除操作的时间差异,攻击者很可能据此推导出enclave的某些运行状态。
6.混合侧信道攻击
混合侧信道攻击是同时采集多个侧信道攻击面的信息,或通过多个攻击面共同作用放大差异增加准确度。比较典型的做法包括:一是TLB 和页表混合攻击。比如TLB miss 的时会加载页表,这个时候CPU 会设置页表的Access bi;二是Cache和DRAM 混合攻击。基于DRAM的攻击只能精确到row(一个row 通常8KB)的粒度。
除了结合两个攻击面的侧信道攻击,还可以采用多个攻击面相结合的侧信道攻击。这类混合攻击我还没有在SGX的环境下面看到相关工作。
7.未来可能的侧信道攻击
未来新的侧信道攻击可能来自两个方面。第一就是发掘新的混合侧信道攻击。前面列出的经典的混合侧信道攻击,他们往往使用两种攻击面信息。因此,我们可以考虑多个攻击面结合的侧信道攻击。以往的混合侧信道攻击往往专注于内存管理和地址转换等方面,新的侧信道攻击可以结合其他方面的信息,进行一些新的尝试。
enclave所有和non-enclave共享的资源都可能成为潜在的侧信道攻击面。因此,发掘新的侧信道攻击的第二个途径就是发现新的共享资源,比如未被发掘的CPU内部共享结构。这些新的的共享资源可能来自一些新的硬件特性,比如Intel PT、Intel TSX、Intel MPX、Intel CAT等。
目前已经有很多文章给出了防御SGX侧信道的方案,有些只是大体的思路,有些则已经有成型的设计和实现。我们在这里主要介绍防御的思路和方法,不涉及设计和实现的细节。首先,我们把这些方法涉及的层次,分为源码级别,系统级别和硬件级别。
1.源码层次的解决方案
这类方法的主要思想就是通过修改源码,编写出能够防御侧信道的代码实现,其核心思想就是隐藏控制流和数据流。这类方法的探索已经在一些密码算法中有所涉及。
2.系统层次的解决方案
系统层次的解决方案主要是利用一些系统特性来防御或检测SGX侧信道。这里有几个思路可以参考: 随机化技术(Randomization)、 检测可疑异常和中断、检测时间异常、Cache 隔离。
3.硬件层次的解决方案
硬件层次的解决方案还处于探索阶段。加上侧信道防御,将会显著增加硬件复杂度,影响功耗和性能。这也可能是Intel 在最初推出SGX的时候没有加入侧信道防御的一个原因。硬件解决方案可能有硬件分割和硬件隔离两种。
本文总结了SGX所面临的侧信道攻击,并展望了潜在的攻击和防御方法。SGX 的侧信道攻击十分难以防御。究其原因是SGX的安全假设和应用模型允许enclave和不可信的non-enclave共享大量的资源。这些就给攻击者以很大的攻击面去区分时间上的差异和资源使用的不同,从而泄露enclave的控制流和数据流。而且攻击者拥有管理系统资源的能力,从而能够最大程度上减小噪音干扰,增加侧信道攻击的成功率。总之,SGX侧信道攻击是一个实用的攻击,我们在实际部署应用SGX的时候,必须考虑潜在的侧信道攻击。