4. TrustZone核心概念
TrustZone 是 ARM 引入的一种系统级硬件隔离技术,其核心目标并非简单地“加密固件”,而是从架构层面将处理器、内存、外设和中断划分为两个相互隔离的执行环境:安全世界(Secure World)与非安全世界(Non-secure World)。在 STM32U5 系列中,TrustZone 与 Cortex-M33 内核深度耦合,配合 SAU(安全属性单元)和 IDAU(实现定义属性单元)共同决定系统中每个地址的访问属性。理解这一机制,是后续进行安全启动、安全固件更新和密钥管理的基础。本章将深入剖析 TrustZone 的地址属性判定逻辑、隔离边界设计以及两个世界之间的安全通信方式。
上图展示了 STM32U5 中 TrustZone 的整体架构。左侧为安全世界,右侧为非安全世界,中间以红色虚线表示隔离边界。两个世界通过安关(SG)指令和 NSC(Non-secure Callable)区域进行受控通信。底部展示了地址属性判定的核心逻辑:IDAU 提供硬件层面的基础属性,SAU 在此基础上进行软件配置覆盖,两者共同决定每个内存地址的最终安全属性。
4.1 核心原理:安全世界与非安全世界的本质
TrustZone 并非简单的“特权模式”扩展,而是一种系统级隔离架构。在 Cortex-M33 中,处理器新增了 Secure 和 Non-secure 两种状态,分别对应安全世界和非安全世界。每个世界都有独立的堆栈指针、控制寄存器和异常向量表。安全世界可以访问所有资源,而非安全世界只能访问被标记为非安全的资源。
关键区别在于:安全状态是处理器的一种物理状态,而非软件模拟。当 CPU 处于安全状态时,它执行安全固件代码,可以访问安全内存和安全外设;当切换到非安全状态时,CPU 只能访问非安全资源。这种切换不是通过软件标志位实现的,而是通过硬件机制——SG 指令和 BXNS 指令——来完成的。
核心要点:安全世界与非安全世界的隔离是物理级的,而非逻辑级。即使非安全代码中存在恶意漏洞,也无法直接读取安全内存中的密钥或篡改安全固件。这是 TrustZone 与普通 MPU(内存保护单元)方案的本质区别。
4.2 SAU/IDAU 配置:地址属性的双重判定机制
STM32U5 的地址属性判定由两个单元协同完成:
| 单元 | 全称 | 属性来源 | 可配置性 | 作用 |
|---|---|---|---|---|
| IDAU | Implementation Defined Attribution Unit | 芯片硬件设计 | 不可修改 | 定义芯片出厂时的默认安全属性,如 Flash 的某些区域固定为非安全 |
| SAU | Security Attribution Unit | 软件配置 | 可编程 | 在 IDAU 基础上覆盖或细化属性,支持最多 8 个区域配置 |
SAU 的配置寄存器包括:
SAU_CTL:全局使能控制,ENABLE 位开启 SAU 功能。SAU_RBAR:区域基地址寄存器,设置区域的起始地址(需按 32 字节对齐)。SAU_RLAR:区域限制地址寄存器,设置区域的结束地址,并包含NSC位和ENABLE位。SAU_RLAR.NSC:将该区域标记为 NSC(Non-secure Callable),允许非安全代码通过 SG 指令跳转到安全代码。
配置流程通常如下:
- 在系统启动早期(安全固件初始化阶段),通过
__SAU_Setup()或直接操作寄存器配置 SAU 区域。 - 确定哪些内存区域需要标记为安全(如安全 Flash 存储密钥、安全 SRAM 存储敏感数据)。
- 确定哪些区域需要标记为 NSC(通常是一个 32 字节对齐的代码段,包含 SG 指令和跳转逻辑)。
- 使能 SAU,并验证配置是否正确。
// 示例:配置 SAU 区域 0 为安全区域(地址 0x0C000000 到 0x0C001FFF)
SAU->RBAR = 0x0C000000; // 基地址
SAU->RLAR = 0x0C001FFF | (1 << 1); // 结束地址 + ENABLE=1
// 配置区域 1 为 NSC 区域
SAU->RBAR = 0x0C002000;
SAU->RLAR = 0x0C00201F | (1 << 0) | (1 << 1); // NSC=1, ENABLE=1
SAU->CTL |= 1; // 使能 SAU
风险提示:SAU 配置错误可能导致系统启动失败或安全漏洞。例如,如果将安全内存错误地配置为非安全,攻击者可能通过非安全代码读取密钥;如果将 NSC 区域设置过大,则可能扩大攻击面。务必在配置后通过读取 SAU_RLAR 回读验证。
4.3 安全属性单元与隔离边界设计
隔离边界是 TrustZone 的核心价值所在。它不仅仅是内存地址的划分,还涉及总线层面的过滤。STM32U5 的 TZSC(TrustZone Security Controller) 和 TZIC(TrustZone Interrupt Controller) 负责外设和中断的安全属性管理。
隔离边界的设计原则包括:
- 最小化安全面:只将必要的资源(密钥存储、安全固件、加密引擎)放在安全世界,其余全部置于非安全世界。
- 明确 NSC 区域:NSC 区域是安全世界对外暴露的唯一入口,必须严格限制其大小和功能。
- 外设安全分组:每个外设都可以通过 TZSC 配置为安全或非安全。例如,AES 加密引擎应配置为安全外设,而 UART 调试口可配置为非安全。
- 中断隔离:安全中断(如安全定时器、安全通信中断)由 TZIC 管理,非安全中断不能触发安全中断服务程序。
隔离边界的实现涉及硬件层面的总线过滤。当非安全代码尝试访问安全地址时,总线会返回错误(Bus Fault),而不是直接允许访问。这种硬件强制机制确保了即使软件存在漏洞,也无法突破隔离边界。
4.4 通信机制:安全调用与 NSC 区域
两个世界之间需要通信,例如非安全应用程序需要请求安全固件执行签名验证或密钥派生。TrustZone 提供了两种通信方式:
- SG 指令 + NSC 区域:非安全代码通过
SG指令跳转到 NSC 区域,NSC 区域中的代码再切换到安全状态并调用安全函数。这是最常用的方式。 - 共享内存:通过配置一块非安全内存作为数据交换缓冲区,两个世界通过该缓冲区传递参数和结果。
一个典型的安全调用流程如下:
// 非安全世界调用安全函数
typedef int32_t (*func_ptr)(int32_t);
// 指向 NSC 区域的函数指针
func_ptr secure_func = (func_ptr)0x0C002001; // NSC 区域地址
int32_t result = secure_func(42); // 触发 SG 指令,切换到安全世界
在安全世界内部,需要实现对应的 NSC 入口函数:
// 安全世界中的 NSC 入口
__attribute__((cmse_nonsecure_entry))
int32_t secure_entry(int32_t input) {
// 执行安全操作,如 AES 加密
return aes_encrypt(input);
}
经验建议:NSC 区域应只包含跳转指令和必要的参数校验逻辑,不要将复杂的安全逻辑直接放在 NSC 区域中。安全逻辑应放在安全世界的内部函数中,NSC 入口仅作为“门卫”角色。
4.5 实战场景:配置 TrustZone 保护固件更新密钥
假设我们正在开发一款 STM32U5 智能门锁产品,需要保护固件更新过程中的签名验证密钥。具体需求如下:
- 固件更新包通过 UART 接收,使用 RSA 签名验证。
- RSA 公钥存储在安全 Flash 中,不能被非安全代码读取。
- 签名验证过程必须在安全世界中执行。
实施步骤:
- 内存规划:将 Flash 地址
0x0C000000 - 0x0C001FFF配置为安全区域,存储 RSA 公钥和安全固件代码;将0x0C002000 - 0x0C00201F配置为 NSC 区域,作为安全调用入口。 - 外设配置:将 AES 和 RSA 硬件加速器配置为安全外设,UART 配置为非安全外设。
- 中断配置:将安全定时器中断配置为安全中断,用于签名验证超时控制。
- 通信设计:非安全代码将固件更新包写入共享内存缓冲区,然后通过 NSC 入口调用安全函数
verify_signature()。 - 验证流程:安全函数从安全 Flash 读取公钥,对共享缓冲区中的固件哈希进行 RSA 验证,返回验证结果。
结果对比:配置 TrustZone 后,即使攻击者完全控制了非安全应用程序,也无法提取 RSA 公钥或篡改验证逻辑。相比未使用 TrustZone 的方案,安全性显著提升。
风险与代价:TrustZone 配置增加了系统复杂性和启动时间(约增加 10-20% 的启动代码量)。此外,NSC 区域的设计需要谨慎,避免引入缓冲区溢出等漏洞。
4.6 常见误区与总结复盘
在实际项目中,工程师常犯以下错误:
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 将整个 Flash 配置为安全区域 | 非安全代码无法运行,系统功能受限 | 仅将必要的代码和数据标记为安全 |
| NSC 区域过大 | 攻击面扩大,可能被利用 | NSC 区域仅包含 SG 指令和跳转逻辑 |
| 忽略 IDAU 的默认属性 | SAU 配置与硬件冲突,导致不可预期行为 | 查阅芯片参考手册,了解 IDAU 默认属性 |
| 安全调用时未校验参数 | 可能被注入恶意参数 | 在 NSC 入口进行严格的参数校验 |
总结:TrustZone 是 STM32U5 安全架构的基石。理解安全世界与非安全世界的隔离原理、掌握 SAU/IDAU 的配置方法、合理设计隔离边界和通信机制,是构建安全嵌入式系统的前提。在实际开发中,建议先使用 STM32CubeMX 的 TrustZone 配置向导生成初始代码,再根据具体需求调整 SAU 区域和 NSC 入口。同时,务必在开发早期进行安全测试,验证隔离边界是否真正有效。