手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解
上QQ阅读APP看书,第一时间看更新

第2章 ARM的TrustZone技术

2.1 TrustZone技术

为提高系统的安全性,ARM早在ARMv6架构中就引入了TrustZone技术,且在ARMv7和ARMv8中得到增强,TrustZone技术能提供芯片级别对硬件资源的保护和隔离,当前在手机芯片领域已被广泛应用。

2.1.1 片上系统硬件框架

一个完整的片上系统(System on Chip, SoC)由ARM核、系统总线、片上RAM、片上ROM以及其他外围设备组件构成。只有支持TrustZone技术的ARM核配合安全扩展组件,才能为整个系统提供芯片硬件级别的保护和隔离。如图2-1所示是TrustZone硬件需求文档:lcu14-500armtrustedfi rmware-140919105449-phpapp02 .pdf; TrustZone白皮书:PRD29-GENC-009492C_TrustZone_security_whitepaper.pdf。个支持TrustZone的SoC的硬件框图。

图2-1 SoC硬件框

支持TrustZone技术的ARM核在运行时将工作状态划分为两种:安全状态和非安全状态。当处理器核处于安全状态时只能运行TEE侧的代码,且具有REE侧地址空间的访问权限。当处理器核处于非安全状态时只能运行REE侧的代码,且只能通过事先定义好的客户端接口来获取TEE侧中特定的数据和调用特定的功能。

系统通过调用安全监控模式调用(secure monitor call, smc)指令实现ARM核的安全状态与非安全状态之间的切换。而ARM核对系统资源的访问请求是否合法,则由SoC上的安全组件通过判定ARM核发送到SoC系统总线上的访问请求中的安全状态读写信号位(Non-secure bit, NS bit)来决定。只有当ARM核处于安全状态(NS bit = 0)时发送到系统总线上的读写操作才会被识别为安全读写操作,对应TEE侧的数据资源才能被访问。反之,当ARM核处于非安全状态(NS bit = 1)时,ARM核发送到系统总线上的读写操作请求会被作为非安全读写操作,安全组件会根据对资源的访问权限配置来决定是否响应该访问请求。这也是TrustZone技术能实现对系统资源硬件级别的保护和隔离的根本原因。

2.1.2 ARMv7架构的TrustZone技术

ARMv7架构中使用了TrustZone技术的系统软件层面的框图如图2-2所示。

图2-2 ARMv7系统软件框架

在ARMv7架构中CPU在运行时具有不同的特权等级,分别是PL0(USR)、PL1(FIQ/IRQ、SYS、ABT、SVC、UND和MON)以及PL2(Hyp),即ARMv7架构在原有七种模式之上扩展出了Monitor模式和Hyp模式。Hyp模式是ARM核用于实现虚拟化技术的一种模式。系统只有在Monitor模式下才能实现安全状态和非安全状态的切换。

当系统在REE侧或者TEE侧运行时,系统执行smc(安全监控模式调用)指令进入Monitor模式,通过判定系统SCR寄存器中对应的值来确定请求来源(REE/TEE)以及发送目标(REE/TEE),相关寄存器中的值只有当系统处于安全态时才可以更改,关于安全状态与非安全状态之间的切换过程,在本书第10章中将进行详细介绍。

2.1.3 ARMv8架构的TrustZone技术

在ARMv8架构中改用执行等级(Execution Level, EL)EL0~EL3来定义ARM核的运行等级,其中EL0~EL2等级分为安全态和非安全态。ARMv8架构与ARMv7架构中ARM核运行权限的对应关系如图2-3所示。

图2-3 ARMv7/v8运行权限对比

ARMv7和ARMv8架构下特权等级和工作模式的对应关系分别如表2-1所示。

表2-1 ARMv7和ARMv8架构下各模式对应关系

ARMv7架构中的PL0(USR)对应ARMv8架构中的EL0, PL1(SVC/ABT/IRQ/FIQ/UND/SYS)对应ARMv8架构中的EL1, ARMv7架构中的Hyp模式对应ARMv8架构中的EL2,而ARMv7架构中的Mon(Monitor)则对应于ARMv8架构中的EL3。

ARMv8架构同样也是使用安全监控模式调用指令使处理器进入EL3,在EL3中运行的代码负责处理器安全状态和非安全状态的切换,其中关于TEE和REE切换的处理方式与ARMv7架构中Monitor模式下的处理方式类似,本书第10章将结合实际代码进行详细分析。

2.2 ARM安全扩展组件

TrustZone技术之所以能提高系统的安全性,是因为对外部资源和内存资源的硬件隔离。这些硬件隔离包括中断隔离、片上RAM和ROM的隔离、片外RAM和ROM的隔离、外围设备的硬件隔离、外部RAM和ROM的隔离等。实现硬件层面的各种隔离,需要对整个系统的硬件和处理器核做出相应的扩展。这些扩展包括:

□ 对处理器核的虚拟化,也就是将AMR处理器的运行状态分为安全态和非安全态。

□ 对总线的扩展,增加安全位读写信号线。

□ 对内存管理单元(Memory Management Unit, MMU)的扩展,增加页表的安全位。

□ 对缓存(Cache)的扩展,增加安全位。

□ 对其他外围组件进行了相应的扩展,提供安全操作权限控制和安全操作信号。

2.2.1 AXI总线上安全状态位的扩展

为了支持TrustZone技术,控制处理器在不同状态下对硬件资源访问的权限,ARM对先进可扩展接口(Advanced eXtensible Interface, AXI)系统总线进行了扩展。在原有AXI总线基础上对每一个读写信道增加了一个额外的控制信号位,用来表示当前的读写操作是安全操作还是非安全操作,该信号位称为安全状态位(NS bit)或者非安全状态位(Non-Secure bit)。

□ AWPROT[1]:总线写事务——低位表示安全写事务操作,高位表示非安全写事务操作。

□ ARPROT[1]:总线读事务——低位表示安全读事务操作,高位表示非安全读事务操作。

当主设备通过总线发起读写操作时,从设备或者外围资源同时也需要将对应的PROT控制信号发送到总线上。总线或者从设备的解码逻辑必须能够解析该PROT控制信号,以便保证安全设备在非安全态下不被非法访问。所有的非安全主设备必须将安全状态位置成高位,这样就能够保证非安全主设备无法访问到安全从设备。如果一个非安全主设备试图访问一个安全从设备,将会在总线或者从设备上触发一个错误操作,至于该错误如何处理就依赖于从设备的处理逻辑和总线的配置。通常这种非法操作最终将产生一个SLVERR(slave error)或者DECERR(decode error)。

2.2.2 AXI-to-APB桥的作用

TrustZone同样能够保护外围设备的安全,例如中断控制、时钟、I/O设备,因此Trust-Zone架构还能用来解决更加广泛的安全问题。比如一个安全中断控制器和安全时钟允许一个非中断的安全任务来监控系统,能够为DRM提供可靠的时钟,能够为用户提供一个安全的输入设备从而保证用户密码数据不会被恶意软件窃取。

AMBA3规范包含了一个低门数、低带宽的外设总线,被称作外设总线(Advanced Peripheral Bus, APB), APB通过AXI-to-APB桥连接到系统总线上。而APB总线并不具有安全状态位,为实现APB外设与TrustZone技术相兼容,APB-to-AXI桥将负责管理APB总线上设备的安全。APB-to-AXI桥会拒绝不匹配的安全事务设置,并且不会将该事务请求发送给外设。

2.2.3 TrustZone地址空间控制组件

TrustZone地址空间控制组件(TrustZone Address Space Controller, TZASC一TZASC文档:DDI0431C_tzasc_tzc380_r0p1_trm.pdf。是AXI总线上的一个主设备,TZASC能够将从设备全部的地址空间分割成一系列的不同地址范围。

在安全状态下,通过编程TZASC能够将这一系列分割后的地址区域设定成安全空间或者是非安全空间。被配置成安全属性的区域将会拒绝非安全的访问请求。

使用TZASC主要是将一个AXI从设备分割成几个安全设备,例如off-Soc、DRAM等。ARM的动态内存控制器(Dynamic Memory Controller, DMC)并不支持安全和非安全分区的功能。如果将DMC接到TZASC上,就能实现DRAM支持安全区域和非安全区域访问的功能。需要注意的是,TZASC组件只支持存储映射设备对安全和非安全区域的划分与扩展,但不支持对块设备(如EMMC、NAND flash等)的安全和非安全区域的划分与扩展。图2-4所示为使用TZASC组件的例子。

图2-4 TZASC组件示意

2.2.4 TrustZone内存适配器组件

TrustZone内存适配器组件(TrustZone Memory Adapter, TZMA)一TZMA文档:cycle_models_BP141_TZMA_User_Guide_v9_1_0_DUI1083A_en.pdf。许对片上静态内存(on-SoC Static Memory)或者片上ROM进行安全区域和非安全区域的划分。TZMA支持最大2MB空间的片上静态RAM的划分,可以将2MB空间划分成两个部分,高地址部分为非安全区域,低地址部分为安全区域,两个区域必须按照4KB进行对齐。分区的具体大小通过TZMA的输入信号R0SIZE来控制,该信号来自TZPC的输出信号TZPCR0SIZE。即通过编程TZPC可以动态地配置片上静态RAM或者ROM的大小。使用TZMA组件的链接框图如图2-5所示。

图2-5 使用TZMA组件的链接示意

2.2.5 TrustZone保护控制器组件

TrustZone保护控制器组件(TrustZone Protection Controller, TZPC一TZPC文档(BP147):DTO0015_primecell_infrastructure_amba3_tzpc_bp147_to.pdf。是用来设定TZPCDECPORT信号和TZPCR0SIZE等相关控制信号的。这些信号用来告知APB-to-AXI对应的外设是安全设备还是非安全设备,而TZPCR0SIZE信号用来控制TZMA对片上RAM或片上ROM安全区域大小的划分。TZPC包含三组通用寄存器TZPCDECPROT[2:0],每组通用寄存器可以产生8种TZPCDECPROT信号,也就是TZPC最多可以将24个外设设定成安全外设。TZPC组件还包含一个TZPCROSIZE寄存器,该寄存器用来为TZMA提供分区大小信息。TZPC组件的接口示意如图2-6所示。

图2-6 TZPC组件接口示意

当上电初始化时,TZPC的TZPCDECROT寄存器中的位会被清零,同时TZPCR0SIZE寄存器会被设置成0x200,表示接入到TZMA上的片上RAM或者ROM的安全区域大小为2MB。通过修改TZPC的寄存器配置的值可实现用户对资源的特定配置。TZPC的使用例子如图2-7所示。

图2-7 TZPC使用示例

2.2.6 TrustZone中断控制器组件

在支持TrustZone的SoC上,ARM添加了TrustZone中断控制器(TrustZone Interrupt Controller, TZIC一TZIC文档:DTO0013B_tzic_sp890_r0p0_to.pdf。。TZIC的作用是让处理器处于非安全态时无法捕获到安全中断。TZIC是第一级中断控制器,所有的中断源都需要接到TZIC上。TZIC根据配置来判定产生的中断类型,然后决定是将该中断信号先发送到非安全的向量中断控制器(Vector Interrupt Controller, VIC)后以nIRQ信号发送到处理器,还是以nTZICFIQ信号直接发送到处理器。图2-8所示为TZIC在SoC中的使用示意。

图2-8 TZIC在SoC中的使用示意

通过对TZIC的相关寄存器进行编程,可对TZIC进行配置并设定每个接入到TZIC的中断源的中断类型。TZIC具有众多寄存器,细节说明可以参考相关ARM的文档。在TZIC中用来设置中断源类型的寄存器为TZICIntSelect,如果TZICIntSelect中的某一位被设置成1,则该相应的中断源请求会被设置成快速中断请求(Fast Interrupt Request, FIQ)。如果某一位被设置成0,则该中断源的中断请求会被交给VIC进行处理。如果VIC的IntSelect将获取到的中断源设置成FIQ,那么该中断源会被再次反馈给TZIC进行处理。

2.2.7 Cache和MMU的扩展

在支持TrustZone的SoC上,会对MMU进行虚拟化,使得寄存器TTBR0、TTBR1、TTBCR在安全状态和非安全状态下是相互隔离的,因此两种状态下的虚拟地址转换表是独立的。

存放在MMU中的每一条页表描述符都会包含一个安全状态位,用以表示被映射的内存是属于安全内存还是非安全内存。虚拟化的MMU共享转换监测缓冲区(Translation Lookaside Buffer, TLB),同样TLB中的每一项也会打上安全状态位标记,只不过该标记是用来表示该条转换是正常世界状态转化的还是安全世界状态转化的。

Cache也同样进行了扩展,Cache中的每一项都会按照安全状态和非安全状态打上对应的标签,在不同的状态下,处理器只能使用对应状态下的Cache。

2.3 TrustZone技术对资源隔离的实现

ARM处理器核的虚拟化和资源隔离是TrustZone实现安全需求的根本。支持TrustZone的处理器核具有虚拟化,也即将一个物理核分成安全状态和非安全状态。当处理器处于非安全状态时,只能访问属于非安全的外设和内存,而不能访问安全的资源;当处理器处于安全态时,处理器既可以访问安全资源,也可以访问非安全的资源,只有当处理器核为安全世界状态时才可能发出PROT的安全访问信号。

2.3.1 中断源的隔离

在原来的ARM芯片中,使用VIC来对外部中断源进行控制和管理,支持TrustZone后,ARM提出了TZIC组件,在芯片设计时,该组件作为一级中断源控制器,控制所有的外部中断源,通过编程TZIC组件的相关寄存器来设定哪个中断源为安全中断源FIQ,而未被设定的中断源将会被传递给VIC进行处理。一般情况下VIC会将接收到的中断源设定成普通中断请求(Interrupt Request, IRQ),如果在VIC中将接收到的中断源设定成FIQ,则该中断源会被反馈给TZIC组件,TZIC组件会将安全中断源送到安全世界状态中进行处理。

2.3.2 片上RAM和片上ROM的隔离

芯片内部存在小容量的RAM或者ROM,以供芯片上电时运行芯片ROM或者存放芯片自身相关的数据。TrustZone架构对该部分也进行了隔离操作。隔离操作通过使用TZMA和TZPC组件来实现。

TZMA用来将片上RAM或者ROM划分成安全区域和非安全区域,安全区域的大小则由接入的TZPCR0SIZE信号来决定。而TZPCR0SIZE的值可以通过编程TZPC组件中的TZPCR0SIZE寄存器来实现。

当处理器核访问片上RAM或者ROM时,TZMA会判定访问请求的PROT信号是安全操作还是非安全操作,如果处理器发出的请求为非安全请求而该请求又尝试去访问安全区域时,TZMA就会认为该请求为非法请求。这样就能实现片上RAM和ROM的隔离,达到非安全态的处理器核无法访问片上安全区域的RAM和ROM。

2.3.3 片外DRA M的隔离

一个完整的系统必然会有片外RAM,对片外RAM的隔离是通过TZASC组件实现的,ARM本身的DMC可以将DRAM分割成不同的区域,这些区域是没有安全和非安全分类。将DMC与TZASC相连后再挂到总线上,通过对TZASC组件进行编程可以将DRAM划分成安全区域和非安全区域。当主设备访问DRAM时,除需要提供物理地址之外,还会发送PROT信号。TZASC组件首先会判定主设备需要访问的DARM地址是属于安全区域还是非安全区域,然后再结合接收到的PROT信号来判定该次访问是否有效。如果PROT信号为非安全访问操作,且访问的DRAM地址属于安全区域,则TZASC就不会响应这次访问操作,这样就能实现DRAM中安全区域和非安全区域的隔离。

2.3.4 外围设备的隔离

其他外围设备都会挂载到APB总线上,然后通过AXI-to-APB桥连接到AXI总线上,AXI-to-APB结合TZPC组件的TZPCDECROT的值及访问请求的PROT信号来判定该访问是否有效。当处理器需要访问外围设备时,会将地址和PROT信号发送到AXI总线上。

AXI-to-APB桥会对接收到的请求进行解析,获取需要访问的所需外围设备,然后通过查询TZPCDECROT的值来判断外设的安全类型,再根据PROT信号就能判定该请求的安全类型。如果该请求是非安全请求,但需要访问的外围设备属于安全设备,则AXI-to-APB会判定该访问无效。

通过对TZPC中的TZPCDECROT寄存器进行编程能够设置外设的安全类型,从而做到外设在硬件层面的隔离。

2.4 小结

本章介绍了TrustZone的原理以及在ARMv7和ARMv8架构下TrustZone技术实现的差异。TrustZone对系统实现了硬件隔离,将系统资源划分成安全和非安全两种类型,同时在系统总线上增加安全读写信号位,通过读取安全读写信号位电平来确定当前处理器的工作状态,从而判断是否具有该资源的访问权限。因此,TrustZone从硬件级别实现了对系统资源的保护。