TrustZone初探(一)

TrustZone初探(一)

最近在搞trustzone,把arm的例子程序成功在某Cortex-A9的处理器上跑起来,趁着手热记一些东西。

1.Truztzone和已有trust computing比如TPM技术的区别。

trustzone并没有打算取代TPM,它们关注的点不一样,TPM最关注的Key的安全,它的endorsement key从不会让外界知道,所以这个秘钥加密过的东西十分安全,你只有把密文扔给之前加密的那块TPM芯片才能解密。但是TPM没办法保护运行时的攻击,比如某个黑客直接在运行时进行破解,直接去内存访问你解密过的东西,那TPM秘钥就形同虚设了。Trustzone正好能保护这一点,即使黑客root了你的设备,他也没法访问trustzone里面保护的东西,只有生产者自己写的“trust”的代码模块才能访问。而且一整套secure boot的技术保证了别人没法篡改你的代码image。然而trustzone也没有定义关于key保存的技术标准,所以它并不与TPM技术冲突,假如说SoC制造商即支持了trustzone,又实现了一套只有secure world才能访问的key存储技术,那么按理说这时候trustzone就能取代TPM了。那样trustzone看起来就像是一个超级功能的TPM,所有的安全操作都可以在里面完成(甚至键盘驱动,显示驱动等一条龙走到底都在安全世界里完成),攻击者就没任何办法拿到敏感信息。

2.Trustzone技术的关键:隔离

每个物理的处理器核提供两个虚拟核,一个是非安全核(Non-secure, NS),另一个是安全核(Secure, S),arm体系保证了很多硬件资源都是双份的,每个虚拟核独享自己的那份资源,大大简化了软件设计。在这二者之间切换的机制叫做monitor模式。NS核只能访问NS的系统资源,而安全核能访问所有资源。普通世界的软件可以使用SMC指令或者通过硬件异常机制的一个子集来进入到monitor模式,从而获取安全世界的服务。普通世界只能获取安全世界的服务,要想拿到点其他东西,就连门都没有了。

CP15的SCR寄存器中有一个NS位代表了当前cpu所处的世界,NS=0表示安全世界,只有安全世界能修改SCR寄存器,另外,monitor模式下总是安全世界。

(图片来自于ARM文档)

3. trustzone和MMU

安全世界和普通世界都有自己的虚拟MMU,实际上只是两个世界都有一份TTBR0、TTBR1、TTBCR,也就是会有两个MMU表。但TLB是共享的,在TLB里面会对安全世界的TLB项打上tag,所以实际上一个TLB也是逻辑上被划分了两个,不同世界各管各的。另外TLB对不同世界的项打上Tag也不是必须的,不同SoC可以不一定实现这个功能,毕竟转换世界的时候刷出整个TLB就可以了。MMU表里的描述符里也会有一个NS位,对于普通世界,处理器做地址转换的时候无视这个位,对于安全世界,处理器做地址转换的时候按照描述符里的NS位来确定地址转换的物理地址空间,NS=0的时候是按照安全世界的物理空间来做地址转换的,反之就是按安全世界的物理空间来做地址转换的。

这里会有疑问,什么是安全世界的物理地址空间和普通世界的物理地址空间?看起来安全世界可以访问所有资源,怎么还是普通世界访问MMU表时无视里面的NS位?

这两个问题是相关的,首先要明白对资源的保护可不是通过MMU表里的NS位,而且TZASC和TZPC来做保护。划分为安全世界的物理地址空间和普通世界的物理地址空间,并不是说两个地址空间的内存map不一样,而是说同一个物理地址实际上被打上了安全和普通的两个“烙印”,这个“烙印”是对cache和TLB而言的(特别是cache),也就是说安全世界和普通世界访问同一个物理内存地址的内容,最后在cache里是有两份的。假设两个世界共享某一块内存用来做交互,如果普通世界更新了一些内容,这些内容暂时还在cache里,这时候安全世界如果以安全世界的身份来访问这块内容的话,访问的是cache里安全世界自己的东西,这就有可能导致cache不一致。所以安全世界也以普通世界的身份来访问的话,那样就能保证cache的一致。另外,对普通世界而言,描述符的NS位确实没有意义,因为它只能访问普通世界的资源。

4. trustzone和Cache

Cache也是共享,但是必须保证Cache行对不同世界的内容打上不同Tag,这样不同世界刷cache只要刷自己的。


后面再写吧:

5. trustzone和中断

6. trustzone和debug

7. trustzone的物理内存和外设保护
8. trustzone和多核

9. trustzone和ACP

编辑于 2019-01-20 09:10