内存取证原理与实践
上QQ阅读APP看书,第一时间看更新

3.3 禁止DMA获取内存的技术

下面详细介绍VT-d技术和Intel SGX原理及其对内存获取所产生的影响。

3.3.1 VT-d技术

VT-d(Virtualization Technology for Directed I/O)技术是英特尔芯片组内支持虚拟化的一项技术。由于每台服务器上整合了更多的客户操作系统,数据进出系统的传输量(I/O流量)有所增加并且更趋复杂。如果没有硬件辅助,虚拟机监视器(VMM,Virtual Machine Monitor)必须直接参与每项I/O交易。这不仅会减缓数据传输速度,还会由于更频繁的VMM活动而增大服务器处理器的负载。

英特尔VT-d通过减少VMM参与管理I/O流量的需求,不但加速了数据传输,而且消除了大部分的性能开销。这是通过VMM将特定I/O设备安全分配给特定客户操作系统实现的。每个设备在系统内存中都有一个专用区域,只有该设备及其分配的客户操作系统才能对该区域进行访问。

完成初始分配之后,数据即可直接在客户操作系统与为其分配的设备之间进行传输。这样,I/O流量的流动将更加迅速,而减少的VMM活动则会进一步缩减服务器处理器的负载。此外,由于用于特定设备或客户操作系统的I/O数据不能被其他任何硬件或客户软件组件访问,系统的安全性与可用性也得到了进一步增强。

VT-d技术示意[17]如图3-6所示。

图3-6 VT-d技术原理

(1)VT-d技术防止DMA方式读取内存的原理

VT-d技术通过限制设备的DMA(Direct Memory Access)来保护预设区域或物理内存区域。该功能通过一个称为DMA重定向(DMA-Remapping)的硬件技术实现。芯片上的VT-d DMA重定向硬件逻辑位于DMA外围I/O设备与计算机物理内存之间。在虚拟化环境中,系统软件是VMM。在正常环境下,是没有虚拟化软件存在的,系统软件就是操作系统。VT-d DMA重定向硬件逻辑可被系统软件编程。DMA重定向将输入的DMA请求地址转变为正常的物理地址,并且基于系统软件提供的信息验证物理地址的访问权限。

VT-d技术使系统软件能够创建多个DMA保护区。每个保护区是一个包含主机物理内存子集的独立区域。基于软件使用模型,DMA保护区可能是虚拟机的内存分配,也可能运行在VM中或直接是VMM自身一部分的客户操作系统驱动的内存分配。VT-d架构使系统软件能够指定一个或多个I/O设备到一个保护区。通过使用地址转换表来限制那些没有被指定到保护区的I/O设备访问保护区物理内存的能力,从而实现DMA的独立性。

当一个给定的I/O设备尝试访问某个确定的内存位置时,DMA重定向硬件通过查找地址转换表查询该设备对此内存保护区的访问权限。如果该设备访问的是不在其权限之内的内存保护区范围,DMA重定向硬件就会阻止访问并向系统软件报告错误。

基于以上原理,通过硬件设备以DMA方式读取支持VT-d技术计算机的物理内存时,获取到的数据仅是该硬件设备被允许访问区域的内存数据,并且该数据位置与实际计算机物理内存位置也不是对应的。

2012年中期生产的苹果计算机,其CPU芯片大多数都普遍支持VT-d技术,这一技术引发的系统安全性使通过DMA方式读写Mac OS内存变得不可行。

(2)相关绕过方法

①命令行方式关闭VT-d

为了解决VT-d技术对通过硬件获取计算机完整物理内存的限制,我们在系统中使用命令sudo nvram boot-args=“dart=0”,然后重启计算机,以解除VT-d的限制。解除限制之后,可通过Thunderbolt接口实现对物理内存的访问。

②绕过IOMMU的方法

输入输出内存管理单元(IOMMU,Input-Output Memory Management Unit)类似于CPU的MMU,负责DMA重定向工作,如图3-6所示。2011年,Wojtczuk和Rutkowska[18]使用恶意MSI(Message-Signaled Interrupts)成功地攻击了支持IOMMU的Xen虚拟机,其使用Intel e1000网络控制器向MSI设置一个任意中断向量,远程地激活一个超级调用,以绕过IOMMU的保护。攻击者发现[19]在操作系统刚启动时并未激活保护机制,此时硬件设备是可以以DMA方式来访问物理内存的,为了在系统成功启动后,使某种硬件还可以以DMA方式访问物理内存,Morgan等[20]提出了一种在硬件可以写内存的时间窗口内,通过修改DMA重定向表绕过DMA重定向的方法,并使用此方法成功攻击了Linux系统。

3.3.2 IntelSGX

Intel SGX(Intel Software Guard Extension)是Intel指令集架构(ISA)的扩展,主要提供了一些指令,用于创建一个可信执行环境(TEE,Trusted Execution Environment)Enclave。用户态应用程序可以在Enclave中安全执行,而不被恶意的OS、hypervisor(VMM)所攻击。

也就是说,该技术主要用于增强软件的安全性。这种方式并不是识别和隔离平台上的所有恶意软件,而是将合法软件的安全操作封装在一个Enclave中,保护其不受恶意软件的攻击,特权或者非特权的软件都无法访问Enclave,一旦软件和数据位于Enclave中,即便操作系统或者VMM(Hypervisor)也无法影响Enclave中的代码和数据。Enclave的安全边界只包含CPU和它自身。Enclave与ARM TrustZone(TZ)还是有一点区别的,TZ中通过CPU划分为两个隔离环境(安全世界和正常世界),两者之间通过SMC指令通信;而SGX中一个CPU可以运行多个安全Enclave,并发执行亦可。当然,在TZ的安全世界内部实现多个相互隔离的安全服务亦可达到同样的效果。

该技术是Intel于2013年在ISCA会议的Workshop HASP中提出的,但只是提出了这一概念和原理,2015年10月第一代支持SGX技术的CPU问世。

在介绍SGX内存保护原理之前,先看一个相关术语:EPC(Enclave Page Cache)。它是一个保留加密的内存区域。Enclave中的数据代码必须在其中执行。为了在EPC中执行一个二进制程序,SGX指令允许将普通的页复制到EPC页中。

SGX的保护是针对应用程序的地址空间的。SGX利用处理器提供的指令,在内存中划分出一部分区域(叫作EPC),并将应用程序地址空间中的Enclave映射到这部分内存区域。这部分内存区域是加密的,通过CPU中的内存控制单元进行加密和地址转化。

具体来讲,当处理器访问Enclave中的数据时,CPU自动切换到一个新的CPU模式(Enclave模式)。Enclave模式会强制对每一个内存访问进行额外的硬件检查。由于数据是放在EPC中的,为了防止已知的内存攻击(如内存嗅探),EPC中的内存内容会被内存加密引擎(MEE)加密。EPC中的内存内容只有在进入CPU package时,才会解密;返回EPC内存中会被加密。

从理论上来说,SGX的一个重要用途是对在多租户云上的软件来讲,可以防止来自底层操作系统的攻击,同时在软件的管理上也不用信任云供应商,这样比较符合云用户对云计算环境下的安全需求。相对于AMD最新出的SEV技术,SGX在应用程序层面而不是虚拟机层面提供了细粒度的保护。

当然,SGX的缺点也是比较明显的,最大的缺点是需要开发人员对代码进行重构,将程序分成可信部分和非可信部分,目前有Intel发布的SDK来协助做这方面工作,但仍然需要大量的工作,同时容易造成秘密泄露。第二是性能问题,其中,Enclave的I/O是瓶颈,这是由于转换检测缓冲区(TLB,Translation Lookaside Buffer)中缓存了Enclave中内存访问,因而访问Enclave需要刷新TLB。另外,执行Enclave代码时,非TLB的内存访问也会造成额外的一些检查,导致更大的负载。第三是如果Enclave代码本身有漏洞,Enclave无法保护程序的完整性,目前就有针对缓冲区溢出的ROP攻击能够控制Enclave。另外也有些侧信道攻击,能够导致秘密泄露。

针对SGX应用目前主要停留在研究阶段,一个大的方向是保护云相关的基础设施,如map-reduce(VC3)、Zookeeper、NFV(Network Function Virtualization)。另外有一些工作是针对解决SGX存在的上述问题的。例如,尝试用不同的方法把程序整体全部放在Enclave中,从而避免代码重构,重要的工作有Haven[21]、SCONE[22]和Graphene-SGX。