浅析TrustZone架构
前言
关于这个系列,其实之前有所了解过!!!
随着移动互联网时代的发展,智能手机已经融入到人们的日常生活和工作中,人们可以使用智能手机与好友实时聊天,可以使用智能手机拍摄美景,可以使用智能手机进行指纹支付,还可以使用智能手机处理工作邮件,等等。在便捷我们生活和工作的同时,智能手机不可避免地存储着包括聊天记录、照片、视频、指纹等个人数据,而这些数据或多或少涉及用户的隐私,使得用户对智能手机的隐私保护能力有一定需求。
为了满足用户的隐私保护需求,千镜安全实验室推出千镜安全架构,从应用层、框架层、内核层、芯片层这四个层级对用户的隐私进行保护,而TrustZone[1]属于芯片层级的保护,提供密钥存储、硬件加解密等硬件安全能力,能够有效保证指纹、个人身份信息等关键隐私数据不被破解、窃取。
TrustZone架构
TrustZone是一种在ARM指令集芯片上实现可信计算的架构,例如智能手机中的高通芯片、联发科芯片以及麒麟芯片都属于ARM指令集芯片。TrustZone通过划分所有的硬件和软件资源来构建两个世界:安全世界和普通世界。其中安全世界对应可信执行环境(Trusted Execution Environment,TEE),而普通世界对应富执行环境(Rich Execution Environment,REE)。
如图1所示,深蓝色部分为安全世界,浅蓝色部分为普通世界。此外,为了细化安全世界和普通世界结构,ARMv8定义了异常等级来进行权限控制,将异常级别从低到高划分为EL0-3四个层级:EL0对应用户模式,可以运行一些应用程序;EL1对应内核模式,可以在该层级运行操作系统,为EL0层提供系统调用接口,实现硬件的控制;EL2对应管理程序模式,可以对OS进行管理,完成不同OS的资源分配;EL3对应安全监控模式,运行ARM可信固件(ARM Trusted Firmware,ATF),负责两个世界的切换。
如果在EL0、EL1、EL2时需要完成安全世界与普通世界之间的切换,需要先转换到EL3中。无论是普通世界还是安全世界,从低层到高层的转换需要调用指令[3],如图2所示,对于EL0而言,可以通过调用SVC(Supervisor Call)指令进入EL1层;
对于EL1而言,既可以通过调用HVC(Hypervisor Call)指令进入EL2,又可以通过调用SMC(Secure Monitor Call)指令进入EL3;对于EL2而言,可以通过调用SMC指令进入EL3。由于SMC指令和HVC指令未在EL0中进行定义,只能在EL1及更高的异常级别上调用,故EL0想要切换到EL3必须先切换EL1,再由EL1切换到EL3。
为了支持TrustZone,需要对系统各个子模块进行设计和扩展,本文主要介绍六处进行软件支持或者硬件扩展的模块,具体系统框架如图3所示。
1-物理核(即CPU)虚拟化:
物理核(即CPU)虚拟化:通过配置物理核中的安全配置寄存器(Security Configuration Register,SCR)最低位NS(Non-Secure)位完成物理核的虚拟化,将物理核虚拟成安全核和非安全核,其中安全核用于运行安全世界的代码,非安全核用于运行普通世界的代码,物理核以时间分片的方式执行来自安全世界和普通世界的代码。(分时复用)
与此同时时,也有两个状态与之对应,安全状态对应安全世界,非安全状态对应普通世界。这些状态由NS位决定[4],如图4所示,当NS位为“0”的时候表示安全状态,当NS位为“1”的时候表示非安全状态,NS位由EL3进行配置。
2-总线扩展:
为了识别CPU的安全状态,需要对系统总线进行扩展,在总线的每一个读写通道增加了一个额外的信号控制位与SCR中的NS位相关联,具体到AMBA3 AXI(Advanced eXtensible Interface)总线中的控制位为AWPROT[1]和ARPROT[1],其中AWPROT[1]负责写入事务,ARPROT[1]负责读取事务。当AWPROT[1]和ARPROT[1] 置为“0”时表示安全世界的事务,置为“1”时表示普通世界的事务。
主设备在总线上发起事务时需设置这些信号,而从设备的解析模块会对主设备设置的信号进行辨识,以确保主设备发起的操作没有违规。
3-外设扩展:
为了确保与总线相连的硬件能够识别总线新增的信号控制位,需要对外设进行安全扩展。新增一个TrustZone 保护控制器(TrustZone Protection Controller,TZPC)组件控制外设的安全特性,并且与AXI-to-APB桥一起配合,使得外设能够支持TrustZone特性。
如图5所示,AXI-to-APB桥位于AMBA3 AXI总线和APB(Advanced Peripheral Bus)外设总线之间,负责APB外设地址与AMBA3 AXI总线地址的转换,而TZPC组件包含三组通用寄存器DECPROT{2:0},每组通用寄存器可以记录8个DECPROT信号,每一个信号控制一个外设的安全配置,负责对应总线中的信号控制位,如果该信号为“0”,则表示该外设为安全外设,如果信号为“1”,则表示该外设为非安全外设。
4-内存扩展
同理,为了确保内存能够正确识别总线的信号控制位,新增一个TrustZone地址空间控制器(TrustZone Address Space Controller,TZASC)组件来实现对内存地址的安全扩展,将内存区域划分为安全内存区域和非安全内存区域,安全世界可以访问安全内存和非安全内存,而普通世界只能访问非安全内存,如图6所示。
内存区域的划分是在系统启动时通过配置TZASC组件(TZC-400/TZC-380)来实现的。以TZC-400为例[5],TZC-400由Control unit和Filter unit构成,**其中Control unit用于对每一个区域的安全设置进行编程,**具体包括使能情况、安全访问权限、Base地址、Top地址和Non-secure ID filtering(基于NSAID信号),在Control unit的配置下,始终存在1个全地址区域Region 0,并且可以扩展8个分离的区域Region 1 - Region 8,Region 1-Region 8的区域互不交叉,如图7所示。而Filter unit用于对访问进行安全检查,根据NSAID信号决定是否允许访问该地址。
同样的,新增一个TrustZone内存适配器(TrustZone Memory Adapter,TZMA)实现对片上静态内存安全区域与非安全区域的划分。
TZMA最大支持2MB空间的片上静态RAM划分,高地址部分为非安全区域,低地址部分为安全区域,两个分区都必须按照4KB进行对齐。TZPC组件中的TZPCROSIZE寄存器为TZMA记录分区大小信息。
5-中断扩展:
由于引入了TZPC,外设分为安全外设和非安全外设,而外设产生的中断也分为安全中断和非安全中断,为了确保安全中断在安全世界处理,非安全中断在普通世界处理,需要对中断进行扩展。
在通用中断控制器(Generic Interrupt Controller,GIC)中[6],将中断源分为三组:group0、secure group1、non-secure group1。
其中,
- group0是EL3处理的安全中断组,
- secure group1是S.EL1和S.EL2处理的安全中断组,
- non-secure group1是NS.EL1和NS.EL2处理的非安全中断组。
当一个中断挂起的时候,GIC根据中断组和处理器的安全状态使用不同的中断信号,如图8所示,
- 对于group0的中断,始终使用FIQ信号;
- 对于secure group1的中断,如果处理器当前为安全状态,则使用IRQ,如果当前为非安全状态,则使用FIQ;
- 对于non-secure group1的中断,如果处理器当前为安全状态,则使用FIQ,如果当前为非安全状态,则使用IRQ。
即IRQ中断是用于当前世界的中断,直接对中断进行处理即可,而FIQ中断是用于进入EL3,以便完成世界的切换后对中断处理。
因此,gic对中断路由的支持可以总结为以下两点:
(1)在中断配置时,根据中断希望被处理的异常等级不同,将其配置为三种不同的group(2)在中断被触发时,gic根据中断group配置和当前的系统执行状态,确定中断是以fiq还是irq的方式触发(3)(自己加的)我发现有个规律就是group 0始终是安全的FIQ,Group 1要看你是安全的分组,当处在不安全的环境就用FIQ,在安全的环境就用IRQ;不安全group1就是你中断要是不安全的,那就破罐子破摔吧,要是是安全的中断但是在不安全的环境,那还说啥,快使用FIQ,这样看起来还是FIQ对应的安全中断,虽然我看到有些人说在Gicv3中不代表FIQ就是安全的。
(其实基本上就是来了个中断判断一下来源是不是安全的,再看一下处理器的状态。匹配就IRQ,不匹配需要切换就FIQ)
FIQ和IRQ的区别
- 1、对FIQ你必须进快处理中断请求,并离开这个模式。
- 2、IRQ可以被FIQ所中断,但FIQ不能被IRQ所中断,在处理FIQ时必须要关闭中断。
- 3、FIQ的优先级比IRQ高。
- 4、FIQ模式下,比IRQ模式多了几个独立的寄存器。不要小看这几个寄存器,ARM在编译的时候,如果你FIQ中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间。
- 5、FIQ的中断向量地址在0x0000001C,而IRQ的在0x00000018。(也有的在FFFF001C以及FFFF0018)写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。
- 6、IRQ和FIQ的响应延迟有区别IRQ的响应并不及时,从Verilog仿真来看,IRQ会延迟几个指令周期才跳转到中断向量处,看起来像是在等预取的指令执行完。FIQ的响应不清楚,也许比IRQ快。
6-内存映射
由于引入了TZASC,内存被分割为安全内存和非安全内存,无法满足软件连续内存地址空间的要求,为此,引入虚拟地址的概念,并且使用内管管理单元(Memory Management Unit,MMU)技术完成虚拟地址向物理地址的转换[7]。
MMU由Table Walk Unit和页表缓存(Translation Lookaside Buffer,TLB)组成。
TLB的格式如图9所示,图中TAG表示虚拟地址,Translation Regime表示异常级别,NS位用于标识是否为普通世界,Descriptor表示映射的物理地址。当一个虚拟地址被传递给MMU时,MMU首先检查TLB是否有存在该地址的映射。如果没有,则从Table Walk Unit中查找对应的地址映射。
非安全状态下的虚拟地址只能转换为非安全内存地址,而安全状态下的虚拟地址不仅可以转换为安全内存地址,也能够转换为非安全内存地址。
(其实就是相当于MMU多了一个地址的安全属性标识位)
MMU适用于在CPU中处理虚拟地址的内存映射,而对于部分主设备(例如GPU),其可以通过直接内存访问(Direct Memory Access,DMA)技术直接读写内存。对于同一个虚拟地址,如果软件通过CPU读取的物理地址与通过DMA读取的物理地址不一致,那么将造成获取的数据不一致,导致最后计算结果的错误。为了避免这种情况,需要对使用DMA的主设备配置系统内存管理单元(System Memory Management Unit,SMMU),确保对于同一个虚拟地址,最后DMA读取的物理地址与MMU映射物理地址一致。本质上,MMU技术与SMMU技术是一样的,只不过是作用的对象不同。
小结
TrustZone围绕着CPU硬件是安全可信的概念,以CPU中SCR寄存器的NS位为起点,一步步向外扩展,包括总线的信号控制位、内存的TZASC和MMU、外设的TZPC、中断的GIC,最终为用户提供一个安全可信执行环境,在芯片层级保护用户的隐私数据。
TrustZone除了保护用户指纹、个人身份信息等关键隐私数据,还一直默默地保护用户智能手机中数据安全,包括在未解锁情况下的数据文件加密、密码保险箱中的账号密码管理、原子隐私系统中的数据存储等。
TrustZone只是智能手机保护用户数据的一种方式,还有SELinux、应用沙盒等等技术从其他层级保护用户的数据安全,最终为用户构建全方位安全保护。
参考文献:
[1] ARM Security Technology Building a Secure System using TrustZone Technology, 2009-9. [Online]. Available: https://developer.arm.com/documentation/PRD29-GENC-009492/c/
[2] TrustZone for Armv8-A, 2020-1. [Online]. Available: https://developer.arm.com/-/media/Arm Developer Community/PDF/Learn the Architecture/TrustZone for Armv8-A.pdf
[3] ARM Cortex-A Series Programmer's Guide for ARMv8-A, 2015-5. [Online]. Available: https://developer.arm.com/documentation/den0024/a/
[4] Arm A-profile Architecture Registers, 2022-12. [Online]. Available: https://developer.arm.com/documentation/ddi0601/latest
[5] ARM CoreLink TZC-400 TrustZone Address Space Controller Technical Reference Manual, 2015-9. [Online]. Available: https://developer.arm.com/documentation/100325/0001/
[7] Learn the architecture - AArch64 memory management, 2021-11. [Online]. Available: https://developer.arm.com/documentation/101811/0102/
缩略语: