0%

arm trustzone

Software virtualization

​ 虚拟化是一种软件安全机制,其中一个高度可信的管理层,称为虚拟机管理程序,以通用处理器的特权模式运行。 管理程序将在其顶部的多个独立软件平台分开使用内存管理单元(MMU),将每个内存置于由管理程序软件控制的虚拟机内部。

弊端

​ 虚拟化技术提供的隔离仅限于实现管理程序的处理器。系统中的任何其他总线上主控,如DMA引擎和GPU,都可以绕过hypervisor提供的保护,因此也必须由hypervisor管理,以执行所需的安全策略。这很难在不损害系统性能的情况下实现; 在不降低图形性能的情况下验证可编程GPU的复杂输入超出了大多数虚拟化解决方案的范围。

​ 虚拟化忽略与硬件攻击相关的安全问题,例如使用调试或测试基础设施的威胁。为了保护虚拟系统免受这种攻击,需要完全禁用调试和测试可见性,这使得软件开发和缺陷诊断非常困难。

TrustZone技术对资源隔离的实现

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

中断源的隔离

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

片上RAM和片上ROM的隔离

​ 芯片内部存在小容量的RAM或者ROM,以供芯片上电时运行芯片ROM或者存放芯片自身相关的数据。TrustZone架构对该部分也进行了隔离操作。隔离操作通过使用TZMA和TZPC组件来实现。
​ TZMA用来将片上RAM或者ROM划分成安全区域和非安全区域,安全区域的大小则由接入的TZPCR0SIZE信号来决定。而TZPCR0SIZE的值可以通过编程TZPC组件中的TZPCR0SIZE寄存器来实现。
​ 当处理器核访问片上RAM或者ROM时,TZMA会判定访问请求的PROT信号是安全操作还是非安全操作,如果处理器发出的请求为非安全请求而该请求又尝试去访问安全区域时,TZMA就会认为该请求为非法请求。这样就能实现片上RAM和ROM的隔离,达到非安全态的处理器核无法访问片上安全区域的RAM和ROM。

片外DRAM的隔离

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

外围设备的隔离

​ 其他外围设备都会挂载到APB总线上,然后通过AXI-to-APB桥连接到AXI总线上,AXI-to-APB结合TZPC组件的TZPCDECROT的值及访问请求的PROT信号来判定该访问是否有效。当处理器需要访问外围设备时,会将地址和PROT信号发送到AXI总线上。
​ AXI-to-APB桥会对接收到的请求进行解析,获取需要访问的所需外围设备,然后通过查询TZPCDECROT的值来判断外设的安全类型,再根据PROT信号就能判定该请求的安全类型。如果该请求是非安全请求,但需要访问的外围设备属于安全设备,则AXI-to-APB会判定该访问无效。
通过对TZPC中的TZPCDECROT寄存器进行编程能够设置外设的安全类型,从而做到外设在硬件层面的隔离。

小结

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

ARM安全扩展组件

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

  • 对处理器核的虚拟化,也就是将AMR处理器的运行状态分为安全态和非安全态。
  • 对总线的扩展,增加安全位读写信号线。
  • 对内存管理单元(Memory Management Unit,MMU)的扩展,增加页表的安全位。
  • 对缓存(Cache)的扩展,增加安全位。
  • 对其他外围组件进行了相应的扩展,提供安全操作权限控制和安全操作信号。

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)

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桥会拒绝不匹配的安全事务设置,并且不会将该事务请求发送给外设。

TrustZone地址空间控制组件

​ TrustZone地址空间控制组件(TrustZone Address Space Controller,TZASC)是AXI总线上的一个主设备,TZASC能够将从设备全部的地址空间分割成一系列的不同地址范围。在安全状态下,通过编程TZASC能够将这一系列分割后的地址区域设定成安全空间或者是非安全空间。被配置成安全属性的区域将会拒绝非安全的访问请求。
​ 使用TZASC主要是将一个AXI从设备分割成几个安全设备,如dram。ARM的动态内存控制器(Dynamic Memory Controller,DMC)并不支持安全和非安全分区的功能。如果将DMC接到TZASC上,就能实现DRAM支持安全区域和非安全区域访问的功能。

需要注意的是,TZASC组件只支持存储映射设备对安全和非安全区域的划分与扩展,但不支持对块设备(如EMMC、NAND flash等)的安全和非安全区域的划分与扩展

image-20211118203616634

TrustZone内存适配器组件

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

image-20211118203714898

TrustZone保护控制器组件

​ TrustZone保护控制器组件(TrustZone Protection Controller,TZPC)是用来设定TZPCDECPORT信号和TZPCR0SIZE等相关控制信号的。

  • TZPCDECPORT信号用来告知APB-to-AXI对应的外设是安全设备还是非安全设备, TZPC包含三组通用寄存器TZPCDECPROT[2:0],每组通用寄存器可以产生8种TZPCDECPROT信号,也就是TZPC最多可以将24个外设设定成安全外设。
  • TZPCR0SIZE信号用来控制TZMA对片上RAM或片上ROM安全区域大小的划分。

image-20211118203823912

​ 通过修改TZPC的寄存器配置的值可实现用户对资源的特定配置。

image-20211118203843493

TrustZone中断控制器组件

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

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

Cache和MMU的扩展

​ 在支持TrustZone的SoC上,会对MMU进行虚拟化,使得寄存器TTBR0、TTBR1、TTBCR在安全状态和非安全状态下是相互隔离的,因此两种状态下的虚拟地址转换表是独立的。
​ 存放在MMU中的每一条页表描述符都会包含一个安全状态位,用以表示被映射的内存是属于安全内存还是非安全内存。虚拟化的MMU共享转换监测缓冲区(Translation Lookaside Buffer,TLB),同样TLB中的每一项也会打上安全状态位标记,只不过该标记是用来表示该条转换是正常世界状态转化的还是安全世界状态转化的。
​ Cache也同样进行了扩展,Cache中的每一项都会按照安全状态和非安全状态打上对应的标签,在不同的状态下,处理器只能使用对应状态下的Cache。

DMA 扩展

​ PrimeCell DMA Controller是一个多通道的AXI引擎,通过微编码的工作描述来实现复杂结构的传输。DMA支持并发的安全通道和非安全通道,每个通道都有独立的中断事件,并由专用的APB接口控制。一个非安全事务试图编写一个到安全内存的DMA传输或者从安全内存传入数据的请求,都将导致DMA传输失败。

案例 - 指纹解锁

​ 指纹的一切操作,包括指纹录入,存储,对比验证,都在TEE那个黑盒子中完成. 指纹的驱动也是在TEE中, CPU与指纹芯片的数据通信也在TEE中完成.

​ Android(REE) 只能下发command 给TEE, 如采集指纹/存储指纹/验证指纹的命令. TEE会告诉Android(REE) 命令执行的结果.

​ TEE下的指纹模板是采用一种叫SFS(Secure File System)的方式经过加密后存储在Android的/data/目录,TA可以访问,Android下的app也可以访问,只不过数据文件加密了而已。指纹模板采用AES256对称加密存储的,就算指纹模板遗失或者窃取,没有密钥也无法破解。密钥是大致是结合每台机器的CPU_ID + 每个TA的uuid + CPU efuse里的HUK经过一系列密钥分散算法生成。HUK就是hardware unique key,这个key在手机生产时烧入CPU的efuse中熔断,无法再更改,且只能在TEE下读取,非安全世界读取不到这个值。这样一来保证了一机一密,而且密钥无法被猜出。

image-20211119173944821

image-20211122113308570

1.png

image-20211123161017793

image-20211119174215691

安全引导

​ 安全引导可用于保证系统的完整性,防止系统中重要镜像文件被破坏或替换。一般情况下,安全引导需要保护系统的BootLoader镜像文件、TEE镜像文件、Linux内核镜像文件、Recovery镜像文件以及在ARMv8中使用的ATF镜像文件。将TEE镜像文件的加载操作加入安全引导功能中可阻止黑客通过替换TEE镜像文件的方式来窃取被TEE保护的重要资料。

​ 当前使用ARM芯片的系统中大部分使能了安全引导功能,该功能对于用户的最直接感受就是,当用户非法刷入其他厂商的ROM后手机无法正常启动,这是因为非法刷机将导致系统中的重要镜像文件被替换,系统在启动过程中对镜像文件的电子验签失败,如果BootLoader验证失败,则系统在进入BootLoader阶段之前就会挂死。

​ 安全引导功能的原理就是采用链式验签的方式启动系统,也就是在系统启动过程中,在加载下一个阶段的镜像之前都会对需要被加载的镜像文件进行电子验签,只有验签操作通过后,该镜像才能被加载到内存中,然后系统才会跳转到下一个阶段继续执行,整个验签链中的任何一环验签失败都会导致系统挂死,系统启动过程中的第一级验签操作是由ChipRom来完成的。只要芯片一出厂,用户就无法修改固化在芯片中的这部分代码,因此无法通过修改第一级验签结果来关闭安全引导功能。而且验签操作使用的RSA公钥或者哈希值将会被保存在OTP/efuse中,该区域中的数据一般只有ChipRom和TEE能够读取且无法被修改。root RSA公钥或其哈希值将会在产品出厂之前被写入到OTP/efuse中,而且不同厂商使用的密钥会不一样。
​ 大多数芯片厂商是将签名信息与需要被验签的镜像文件打包在一起,而RSA公钥则会被打包到执行验证操作的镜像文件中。
​ 不同厂商可能会对镜像文件进行加密操作,使保存在设备中的镜像文件都是以密文的形式存在。在启动过程中,首先会验证密文镜像文件的合法性然后再进行解密镜像文件的操作,这些都完成后才会将明文的镜像文件加载到内存中然后再执行跳转操作。

image-20211122113549821