ARM TrustZone技术简介(一)

ARM 227浏览

转自:http://blog.csdn.net/Alex___Zhao/article/details/76647377


有幸做过将近1年时间的TrustZone OS,这里对通用的TrustZone硬件技术做一点记录,来记录自己曾经工作过的领域。


TrustZone是ARM处理器特有的一个安全特性,其简介可以在ARM的官方网站上找到

https://www.arm.com/products/security-on-arm/trustzone

从最简单抽象的层面来一句话介绍TrustZone就是,将一个物理处理器分时复用为两个逻辑处理器,一半是Rich Execution Environment 另一半是Trusted Execution Environment。 所以其本质上的原理很简单,在安全界还有很多类似的想法,示例在一个虚拟化的环境中,一个虚拟机运行Rich System,另外一个虚拟机运行Trust System。这两种是同一个道理。


目前使用TrustZone技术的主要集中在机顶盒,车载设备还有最常见的只能手机,由于其硬件隔离的特性,从Rich Execution Environment很难直接操作Trust那边的代码和资源,所以能够极大的提高各种基于ARM的应用环境的安全性。  这里面有一个奇葩的例外 iOS虽然使用ARM处理器但不使用TrustZone技术,其硬件设计中有一个而外的处理器叫Secure Enclave来处理器安全相关的任务,详情请见

https://www.blackhat.com/docs/us-16/materials/us-16-Mandt-Demystifying-The-Secure-Enclave-Processor.pdf


而对于Android系统的设备,TrustZone是广泛使用的,示例高通家的qcomsee,三星家的trustonic,还有google目前的trusty 以及ARM Linaro自己家的op-tee都是TrustZone上运行的系统,其中trusty和op-tee是完全开源的,想深入学习trustzone的可以拿来学习和参考。


从这里来看实际上一个ARMv8的处理器上可以运行两个独立的操作系统,一个是运行在Rich Execution Environment上的Linux,另外一个就是运行在Trusted Execution Environment之上的小内核, 为什么是个小内核呢 :-), 小意味结构简单,结构简单意味着代码少,代码少意味着整体的bug少,攻击面小,从而安全性才有提高, TrustZone只是一个硬件隔离技术,如果愿意完全可以在上面另外再跑一个Linux内核,但是这样的话其打开了一个巨大无匹的攻击面,所以对安全所做的努力就付诸东流了。而TrustZone上的系统也是越小,越紧凑,目的越单纯越安全。

如下图所示


ARMv8处理器包括一共4个运行级别, 其中EL3运行级将一个物理处理器分割为两个逻辑处理器,在Rich侧,有EL0/EL1/EL2三个运行级别分别对应一个操作系统的用户态,内核态,虚拟化态。 而在Trusted侧,只有EL0/EL1两个运行级别,对应的操作系统的用户态和内核态,所以在ARM处理器的Trust侧并不支持硬件虚拟化。

而在Rich和Trust之间切换需要ARM处理器的硬件指令SMC触发硬件异常,其会使系统从 EL1切换到EL3运行级由运行在EL3中的optee开源Secure Monitor的代码保存当前侧的硬件上下文,然后切换另一侧的缓存上下文到硬件寄存器中从而完成Rich和Trust之间的切换,其逻辑就像一个单纯的内核线程上下文切换。

所以要使用一个完整的带TrustZone支持的Linux,你需要在Linux侧有驱动程序发出SMC指令从而切换到Trust侧的OS,而在Trust侧的OS处理完成之后同样需要通过SMC(驱动或者系统调用)指令切换回Rich侧的Linux。

而对Trust侧系统的实现,国际组织GP对其有一部分规范和要求,可以参考

https://github.com/OP-TEE/optee_os/blob/master/documentation/globalplatform_api.md

这里是op-tee对其的GP支持的一部分总结。