2. 安全基础

在嵌入式安全领域,ARM TrustZone 是构建可信执行环境最核心的硬件基础。它并不是一个独立的芯片或外设,而是集成在 Cortex-M 处理器内部的一套系统级安全机制。理解 TrustZone 的隔离原理,是掌握 Trusted Firmware-M(TF-M)运行机制的前提。本节从硬件隔离、世界切换、内存与外设分区,以及 PSA 安全框架的核心概念四个层面展开。

一、TrustZone 的核心原理:两个世界,一套硬件

TrustZone 的核心思想是在同一颗处理器上划分出两个相互隔离的执行环境:安全世界(Secure World)与非安全世界(Non-secure World)。两者共享 CPU 内核、总线和部分存储资源,但通过硬件强制隔离,非安全世界的代码无法直接访问安全世界的资源。

在 Cortex-M 上,TrustZone 引入了几个关键硬件特性:

  • 安全状态位(Security State):CPU 当前处于安全态还是非安全态,由硬件状态位决定,普通指令无法篡改。
  • SAU(Security Attribution Unit):CPU 内部的安全属性单元,用于定义哪些地址区域属于安全区。
  • IDAU(Implementation Defined Attribution Unit):由芯片厂商实现,用于定义外设和存储的安全属性。
  • SG 指令(Secure Gateway):非安全世界进入安全世界的唯一合法入口,用于调用安全服务。
  • BNS/BFX 信号:总线上的安全标识,确保非安全访问无法触达安全外设。

这些机制共同构成了“硬件级隔离墙”。与纯软件隔离相比,TrustZone 的隔离不依赖操作系统,即使非安全世界的系统被攻破,也无法绕过硬件规则读取安全密钥。

二、安全与非安全世界的隔离机制

隔离体现在三个维度:执行隔离、存储隔离、外设隔离。

执行隔离通过安全状态位实现。CPU 在任一时刻只能处于一个世界,切换必须经过受控入口。存储隔离由 SAU 和 IDAU 共同决定:每个地址区间被标记为安全(S)、非安全(NS)或非安全可调用(NSC)。NSC 区域是专门为 SG 指令设计的跳板,允许非安全代码发起安全调用,但不能读取安全数据。

外设隔离则通过总线上的安全信号实现。安全外设只响应安全访问,非安全世界即使知道寄存器地址,访问也会被总线拒绝并触发安全异常。

关键点:非安全世界不能直接跳转到安全函数,必须通过 NSC 区域中的 SG 指令进入。SG 指令会检查目标地址是否合法,非法跳转将触发 SecureFault。

下面是一个典型的 SAU 区域配置示例,用于划分安全与非安全存储:

/* SAU 区域配置示例 */
SAU->RBAR = 0x10000000 | SAU_RBAR_ENABLE;   /* 安全代码区起始 */
SAU->RLAR = 0x1001FFFF | SAU_RLAR_ENABLE;   /* 安全代码区结束 */

SAU->RBAR = 0x10020000 | SAU_RBAR_ENABLE;   /* NSC 跳板区 */
SAU->RLAR = 0x10020FFF | SAU_RLAR_ENABLE | SAU_RLAR_NSC;

SAU->RBAR = 0x08000000;                     /* 非安全 Flash */
SAU->RLAR = 0x0807FFFF;

三、PSA 安全框架核心概念

PSA(Platform Security Architecture)是 ARM 提出的物联网安全框架,TrustZone 是其硬件根基,而 TF-M 是 PSA 在 Cortex-M 上的参考实现。PSA 的核心概念包括:

  • 安全分区(Secure Partition):将安全服务拆分为独立分区,每个分区有独立的栈、堆和权限,互不干扰。
  • PSA RoT(Root of Trust):可信根,包括不可变可信根、可更新可信根和测量可信根。
  • PSA API:统一的安全服务接口,如加密、存储、 attestation,屏蔽底层实现差异。
  • 隔离级别:PSA 定义了 L1/L2/L3 隔离等级,L3 要求分区之间也相互隔离。
  • 安全生命周期:设备从制造、部署到退役的状态管理,如 SD、BL2、SP 等阶段。

PSA 框架将安全能力抽象为“服务”,非安全应用通过 PSA API 发起请求,请求经 IPC 转发到对应安全分区处理,整个过程对应用透明。

四、典型场景:一次安全调用的完整路径

假设非安全应用需要调用加密服务生成一个随机数,其路径如下:

  1. 非安全应用调用 psa_crypto_init() 和 psa_generate_random()。
  2. PSA API 层将请求封装为 IPC 消息,写入非安全共享内存。
  3. 通过 NSC 区域的 SG 指令触发安全世界入口。
  4. TF-M 的 SPM(安全分区管理器)解析请求,路由到 Crypto 安全分区。
  5. Crypto 分区调用硬件 TRNG 或软件算法生成随机数。
  6. 结果写回共享内存,通过 SG 指令返回非安全世界。

整个过程非安全应用无法看到密钥、无法访问 Crypto 分区的私有内存,也无法篡改分区代码。

五、常见误区与复盘

误区 正确理解
TrustZone 等于安全 TrustZone 只提供隔离机制,安全与否取决于安全世界内部实现是否正确。
非安全代码可以随意调用安全函数 只能通过 NSC 区域的 SG 指令进入,且入口地址受 SAU 限制。
安全分区之间天然隔离 需要 PSA L3 隔离和 MPU 配置才能实现分区间隔离。
配置了 SAU 就万事大吉 还需配置 MPU、栈保护、外设安全属性,并验证启动链可信。
注意:SAU 和 IDAU 的配置必须在安全启动早期完成,且安全区配置一旦被非安全代码修改,整个隔离体系将失效。因此 TF-M 启动阶段会锁定相关配置。

理解 TrustZone 的硬件隔离边界,以及 PSA 框架如何在其上构建服务化安全模型,是后续学习 TF-M 启动流程、安全分区管理和 IPC 机制的基础。只有先看清“墙”在哪里,才能理解“门”如何开。

TrustZone 安全与非安全世界隔离架构 非安全世界 (Non-secure World) 非安全应用 非安全 OS / RTOS PSA API 客户端接口 安全世界 (Secure World) Crypto 分区 Storage 分区 TF-M SPM 安全分区管理器 NSC 跳板 SG 指令入口 硬件隔离层 SAU 安全属性单元 IDAU 厂商定义属性 MPU 内存保护单元 总线安全信号 BNS / BFX 非安全路径 安全路径 受控入口