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 state | Non-secure state | 处理器安全状态位 |
| 内存空间 | 安全 RAM/Flash | 普通 RAM/Flash | SAU/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)。
典型的信任链流程如下:
- BL0(ROM Boot):芯片上电后执行固化 ROM 代码,验证 BL1 的签名。
- BL1(安全引导):验证通过后加载 BL2,并初始化 TrustZone 安全环境。
- BL2(TF-M 引导):加载安全分区镜像和普通世界固件,完成安全属性配置。
- 运行时:安全世界运行 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 提供了硬件级的双世界隔离,SAU/MPU 和 TZASC 将隔离落实到内存与外设,可信根与信任链保证启动过程的完整性。三者结合,构成了嵌入式安全的基础底座。在 TF-M 开发中,每一次安全服务调用、每一个安全分区配置,都建立在这套机制之上。