Trustzone 技术介绍

万物互联,安全尤为重要,而设备终端是万物互联的源头,也是安全保护的源头。安全可信计算环境(TEE)从处理器MPU向微控制器MCU进行延伸,已经是大势所趋。

为了更好地提高MCU的安全性能,Arm在ARMv8-M架构中引入了TrustZone技术。ARMv8-M中的TrustZone技术是一种可选择的安全扩展,旨在为各种嵌入式系统应用提供基本的安全保障。

TrustZone技术将系统分为安全区和非安全区两部分,并通过特殊的指令实现两种区域内函数的相互访问。

在这里插入图片描述
TrustZone技术已经相当成熟,被广泛应用在Arm Cortex-A系列处理器上。现在TrustZone技术被扩展到了ARMv8-M 处理器中,它与Cortex-A处理器中的TrustZone并不是完全相同的,本篇参考网上一些资料和自己的开发心得介绍下基于Cortex-M处理器的TrustZone技术。

TrustZone的特性

  1. 允许用户将内存划分为安全和非安全区域;
  2. 允许在未经过身份验证时阻止调试安全代码/数据;
  3. NVIC、MPU、SYSTICK、内核控制寄存器等也被备份到两个区域中 ,安全代码和非安全代码可以独立访问自己的资源;
  4. 安全区和非安全区都有MSP和PSP堆栈指针;
  5. 提出了Secure Gateway的概念,非安全代码可以通过Secure Gateway访问特定的安全代码,这也是非安全代码访问安全代码的唯一方式;
  6. 提供了一个Stack Limit Checking(堆栈限制检查)功能,可以用于检测堆栈溢出的情况。在Cortex-M33对应的ARMv8-M架构中,每个堆栈指针都有相应的堆栈限制寄存器。

Register banking

上节提到一些有内核相关的寄存器也被备份到了安全/非安全区域中,下图展示了具体哪些通用/特殊寄存器被备份到两种内存中。
在这里插入图片描述

TrustZone 技术可以满足的安全需求

  1. Data protection:敏感数据可以存储在安全内存中,只可以被安全软件访问。只有在安全检查和授权之后,非安全软件才可以访问安全APIs。
  2. Firmware protection:固件可以预装载在安全区域中,防止逆向操作和恶意攻击。
  3. Operation protection:关键操作可以像安全固件一样,被预加载到安全内存中,并且配置适当的外设仅在安全状态下访问。通过这种方式, 可以保护操作免受来自非安全端的入侵。
  4. Secure boot:安全启动机制可以使用户对自己的平台充满信心,因为它始终从安全内存启动。

Secure/Non-Secure 安全划分

在Cortex-M33中,如果选配了TrustZone技术,则4G的内存空间将被划分为安全和非安全内存区域。安全内存空间又可以进一步划分为两种类型: Secure和Non-secure Callable(NSC)。
在这里插入图片描述

三种内存区域的特性:

  • Secure:安全数据只可以被安全代码访问,安全代码只有在CPU处于安全模式时才可以被执行。
  • Non-secure:非安全数据可以被安全和非安全状态访问,但非安全代码只能在CPU处于非安全状态时被执行。
  • Non-secure
    Callable(NSC):NSC区域作为非安全函数访问安全函数的跳板。非安全代码需要先跳转到NSC区域中,执行SG指令,然后再跳转到相应的的安全函数处执行,这也是NS代码访问S函数的唯一方式。
    在这里插入图片描述

引入NSC存储区的原因,是为了防止其他二进制数据(例如,具有与SG指令的操作码相同的值的查找表)被用作安全状态的入口函数。

内存区域的的安全属性定义

内存区域的安全属性是由Secure Attribution Unit(SAU)和Implementation Defined Attribution Unit(IDAU) 共同决定的。

SAU的作用和IDAU是相似的,都是用于分离安全区和非安全区。两者最大的区别是SAU位于CPU内部,IDAU在CPU外部。

无论是IDAU和SAU都可以定义一块内存的安全属性,此时CPU会选择两者中较高的安全属性作为此块内存最终的安全属性,最高的安全属性是Secure,其次是Non-Secure Callable,最后是Non-secure。
在这里插入图片描述

IDAU

IDAU除了可以向处理器指示特定存储器地址是Secure、NSC还是Non-secure,提供存储器地址所在的区域编号之外,它还可以标记免受安全检查的内存区域,例如ROM表。

IDAU由芯片厂商设计,一般不会对IDAU进行修改。

不同的芯片厂商设计也不是相同的。

STM32 L552xx:

NXP LPC55S6x:NXP LPC55S6x

SAU

SAU为每个内存区域定义了一个Region Number(RN)。RN可以被TT指令用来决定目标内存的访问权限和安全属性。RN的数量可以被SAU配置为0、4或者8。

STM32 L552xx 和 NXP LPC55S6x 的RN数量是8,也就是说最多可以划8个区域。

SAU是由开发者配置的,开发者可以在IDAU配置的内存属性的基础上,用SAU去重定义内存中的一些区域的安全属性,CPU会根据IDAU和SAU的配置,决定内存的最终安全属性。

复位后,默认的SAU配置是: 所有存储空间都是安全的。

更多推荐