2. 嵌入式安全基础

在嵌入式安全领域,ARM TrustZone 是构建可信执行环境的核心硬件机制。它并非一个独立的芯片或模块,而是集成在 Cortex-A、Cortex-M 等处理器中的一套系统级安全架构。理解 TrustZone 的关键,在于把握“安全世界”与“普通世界”的划分,以及由此衍生出的隔离与可信根概念。本节将从原理、机制、场景和常见误区四个层面展开,为后续 TF-M 安全分区开发奠定基础。

一、核心原理:两个世界与一次切换

TrustZone 将处理器的运行环境划分为两个相互隔离的世界:安全世界(Secure World)和普通世界(Normal World)。普通世界运行富操作系统(如 Linux、RTOS)和普通应用;安全世界运行可信操作系统(如 TF-M、OP-TEE)和安全服务。两个世界拥有独立的寄存器组、内存空间和外设访问权限,硬件层面保证普通世界无法直接读取或篡改安全世界的资源。

两个世界之间的切换由一条特殊的指令触发。在 Cortex-A 上通常通过 SMC(Secure Monitor Call)指令进入安全监控模式;在 Cortex-M 上则通过 SG(Secure Gateway)指令跳转到安全状态。切换过程由硬件严格管控,普通世界只能通过预定义的入口点请求安全服务,无法任意跳转到安全代码的中间位置。这种“单向门”设计是 TrustZone 安全性的基石。

关键点:TrustZone 不是软件模拟的隔离,而是由处理器、总线、中断控制器和内存保护单元共同实现的硬件强制隔离。软件漏洞可能被利用,但无法绕过硬件边界直接访问另一世界的资源。

二、隔离机制:从内存到外设的立体防护

TrustZone 的隔离并非只停留在 CPU 层面,而是贯穿整个片上系统。以下表格列出了主要隔离维度及其作用:

隔离维度安全世界普通世界硬件支撑
CPU 状态Secure stateNon-secure state处理器安全状态位
内存空间安全 RAM/Flash普通 RAM/FlashSAU/MPU、TZASC
外设访问安全外设普通外设外设安全属性配置
中断控制安全中断普通中断NVIC 安全扩展
总线事务安全事务标记普通事务标记AXI NS 位

以 Cortex-M33 为例,SAU(Security Attribution Unit)负责定义哪些地址区域属于安全属性。开发者通过配置 SAU 区域,将安全固件、密钥存储和关键外设划入安全世界,其余资源留给普通世界。IDAU(Implementation Defined Attribution Unit)则提供芯片厂商自定义的默认属性。两者共同决定每个地址的安全归属。

/* SAU 区域配置示例:将 0x10000000 起始的 64KB 设为安全 */
SAU->RBAR = 0x10000000 | SAU_RBAR_ENABLE;
SAU->RLAR = 0x1000FFFF | SAU_RLAR_ENABLE;
/* 非安全区域调用安全服务需通过 SG 指令 */
__attribute__((cmse_nonsecure_entry)) void secure_service(void) {
    /* 安全服务实现 */
}

三、可信根:安全启动与信任链

隔离提供了“空间”,但空间里运行的代码是否可信,需要可信根(Root of Trust, RoT)来保证。可信根是系统中第一个被无条件信任的组件,通常固化在芯片 ROM 中,不可修改。它以自身为起点,逐级验证下一阶段固件的签名和完整性,形成一条信任链(Chain of Trust)。

典型的信任链流程如下:

  1. BL0(ROM Boot):芯片上电后执行固化 ROM 代码,验证 BL1 的签名。
  2. BL1(安全引导):验证通过后加载 BL2,并初始化 TrustZone 安全环境。
  3. BL2(TF-M 引导):加载安全分区镜像和普通世界固件,完成安全属性配置。
  4. 运行时:安全世界运行 TF-M 服务,普通世界运行应用,两者通过 PSA 客户端接口通信。

信任链的每一环都必须验证下一环,任何一环失败都会终止启动或进入恢复模式。这种“逐级度量、逐级传递”的机制,确保系统最终运行在可预期的可信状态。

四、典型场景与常见误区

在实际嵌入式项目中,TrustZone 常用于以下场景:安全支付终端中保护密钥和交易逻辑;工业控制器中隔离安全 PLC 逻辑与通信协议栈;智能门锁中将指纹比对和开锁决策放在安全世界,普通世界只负责显示和联网。这些场景的共同点是:核心安全资产必须与不可信的网络栈、文件系统、UI 代码严格隔离。

常见误区一:认为“用了 TrustZone 就安全了”。TrustZone 只提供隔离能力,安全世界内部的代码漏洞、错误的安全服务接口、不严格的参数校验,同样会导致密钥泄露或权限提升。

常见误区二:把普通世界的敏感数据直接放在安全世界内存中。正确做法是通过受控的安全服务接口传递数据,并做长度、类型和权限检查,避免安全世界被当作“万能保险箱”滥用。

常见误区三:忽略中断和 DMA 的安全属性。一个普通世界的外设通过 DMA 访问安全内存,可能绕过 CPU 检查。必须配置 TZASC 或外设安全控制器,确保总线级隔离生效。

五、从概念到 TF-M 的映射

TF-M 正是建立在 TrustZone 之上的安全固件框架。它运行在安全世界,提供安全启动、安全存储、加密、认证等 PSA 认证服务。普通世界的应用通过 PSA Client API 发起请求,经 IPC 或函数调用进入安全分区,由 TF-M 调度并返回结果。理解本节的两个世界、隔离机制和可信根,是后续配置 TF-M 分区、定义安全服务接口和调试安全启动流程的前提。

TrustZone 安全世界与普通世界隔离架构 安全世界 (Secure World) TF-M 安全固件 安全启动 / 安全存储 / 加密服务 安全分区 A 密钥管理 安全分区 B 安全认证 安全 RAM / 安全外设 SAU 保护区域 · 仅安全状态可访问 安全中断 (Secure IRQ) 由安全世界独立处理 普通世界 (Normal World) 富操作系统 / RTOS Linux / FreeRTOS / Zephyr 普通应用 A 网络通信 普通应用 B UI 显示 普通 RAM / 普通外设 非安全属性 · 安全世界不可直接访问 普通中断 (Non-secure IRQ) 由普通世界处理 硬件隔离边界 SG / SMC 返回结果 可信根 RoT (ROM Boot) 信任链起点 · 不可修改

总结来看,TrustZone 提供了硬件级的双世界隔离,SAU/MPU 和 TZASC 将隔离落实到内存与外设,可信根与信任链保证启动过程的完整性。三者结合,构成了嵌入式安全的基础底座。在 TF-M 开发中,每一次安全服务调用、每一个安全分区配置,都建立在这套机制之上。