3、TrustZone技术原理:安全世界与普通世界的划分、SAU/IDAU配置、安全属性单元工作机制
ARM Cortex-M33 引入的 TrustZone 技术,本质上是一种硬件级隔离机制,它将处理器运行的整个系统环境划分为两个相互隔离的世界——安全世界(Secure World)与普通世界(Non-secure World,也称非安全世界)。这种划分并非简单的软件逻辑分区,而是从处理器内核、总线互联、存储控制器到外设中断控制器全链路的安全属性强制管理。理解 TrustZone 的工作原理,关键在于掌握三个层次:世界划分的地址空间模型、安全属性单元(SAU/IDAU)的配置机制,以及安全属性如何在系统总线层面被解析和执行。本章将围绕这三个层次展开,并结合实际工程场景说明配置方法与常见误区。
上图展示了 TrustZone 的核心架构关系。左侧为安全世界,右侧为普通世界,中间的安全属性单元(SAU/IDAU)是决定内存和外设访问权限的关键枢纽。安全世界与普通世界共享同一个物理 CPU 核心,但通过状态切换和地址空间的安全属性标记实现逻辑隔离。下面我们深入剖析其工作原理。
3.1 核心原理:世界划分与地址空间安全属性
TrustZone 的隔离机制并非通过物理上独立的处理器实现,而是在单个 Cortex-M33 内核上通过状态位(State Bit)和地址安全属性(Security Attribute)共同作用。Cortex-M33 支持两种安全状态:安全状态(Secure State)和非安全状态(Non-secure State)。处理器当前处于哪种状态,由内核中的安全状态寄存器(CONTROL.SPSEL 和 SCR.NS 等)以及当前执行的代码所在的内存区域安全属性共同决定。
关键点在于,每个内存地址和外设地址都被赋予了一个安全属性标签。这个标签可以是 Secure(安全)或 Non-secure(非安全)。当 CPU 发起一次访问请求时,总线互联(Bus Matrix)会检查该地址的安全属性与当前 CPU 状态是否匹配。如果安全世界代码访问普通世界地址,允许访问;如果普通世界代码尝试访问安全世界地址,则会被硬件拒绝并触发异常(通常是 SecureFault 或 HardFault)。这种机制确保了安全固件(如密钥存储、安全启动代码)不会被普通世界应用程序读取或篡改。
世界切换通过专用指令 SG(Secure Gateway)和 BXNS/BLXNS 实现。安全世界可以调用普通世界函数,但普通世界不能直接调用安全世界函数,必须通过安关(Secure Gateway)中定义的入口点(Entry Point)进行受控调用。这种调用机制不仅传递控制权,还会自动保存和恢复安全状态,防止普通世界通过异常返回机制劫持安全执行流。
3.2 SAU与IDAU的配置机制
安全属性的判定由两个硬件单元协同完成:IDAU(Implementation Defined Attribution Unit,实现定义属性单元)和SAU(Security Attribution Unit,安全属性单元)。IDAU 是芯片厂商在硬件设计时固化的属性映射,它根据地址区域直接分配安全属性,不可编程修改。例如,芯片厂商可以将内部 Flash 的高地址区域固定为安全,将外部 RAM 固定为非安全。IDAU 的规则是芯片的“物理事实”,任何软件都无法绕过。
SAU 则是一个可编程的安全属性配置单元,它允许软件(通常是安全世界中的固件)动态修改某些地址区域的安全属性。SAU 包含一组区域寄存器(SAU_RBAR、SAU_RLAR、SAU_RNR),每个区域可以配置起始地址、结束地址和安全属性。SAU 的配置权限仅限安全世界,普通世界无法访问 SAU 寄存器。最终的安全属性由 IDAU 和 SAU 共同决定:如果 IDAU 标记某区域为安全,则该区域始终为安全;如果 IDAU 标记为非安全,SAU 可以将其覆盖为安全,但不能将 IDAU 标记为安全的区域改为非安全。这种“取更安全者”的合并规则保证了硬件底线的安全性。
| 配置项 | IDAU(硬件固定) | SAU(软件可编程) |
|---|---|---|
| 配置时机 | 芯片流片时固定 | 系统启动早期由安全固件配置 |
| 可修改性 | 不可修改 | 仅安全世界可修改 |
| 典型区域 | Boot ROM、内部 Flash 高地址、安全外设 | 外部 RAM 分区、部分外设地址重映射 |
| 合并规则 | 最终属性 = 更安全者(Secure 优先) | |
配置 SAU 的典型流程如下:
- 系统上电后,CPU 默认从安全世界启动(Boot ROM 通常被 IDAU 标记为安全)。
- 安全固件首先初始化 SAU 寄存器,清空所有区域或设置默认非安全属性。
- 根据系统内存映射,将需要隔离的 RAM/Flash 区域配置为安全,其余区域保持非安全。
- 配置完成后,使能 SAU(设置 SAU_CTRL.ENABLE 位),并执行隔离屏障指令(如
DSB和ISB)确保配置生效。 - 最后通过
BXNS指令切换到普通世界运行应用程序。
3.3 安全属性单元工作机制与总线过滤
SAU/IDAU 的判定结果不仅作用于 CPU 核心,还通过总线互联传递给所有总线主设备(如 DMA 控制器)。这意味着即使普通世界的 DMA 试图访问安全内存,也会被总线层面的安全过滤器拦截。Cortex-M33 的总线接口(包括 I-Code 总线、D-Code 总线、System 总线)都携带安全属性信号(HNONSEC 或 ProtS),总线互联根据这些信号执行访问控制。
一个典型的访问流程如下:普通世界 CPU 执行 LDR R0, [R1],其中 R1 指向安全内存地址。CPU 将该请求连同 Non-secure 属性标记发送到总线互联。总线互联查询该地址的最终安全属性(由 IDAU/SAU 合并得出),发现是 Secure,于是拒绝访问并触发 SecureFault 异常。整个过程在硬件层面完成,无需软件干预,延迟极低。
工程要点:在配置 SAU 时,务必注意区域对齐要求。SAU 区域的最小粒度通常为 32 字节,且起始地址和结束地址必须按粒度对齐。如果配置不当,可能导致部分地址区域的安全属性与预期不符,造成难以排查的故障。建议在配置后通过读取 SAU 区域寄存器进行回读验证。
3.4 案例拆解:安全启动与密钥存储的隔离设计
以一个实际的 IoT 设备为例,该设备需要安全存储设备密钥,并支持安全固件升级。系统内存布局如下:内部 Flash 共 1MB,其中 0x00000000-0x0001FFFF(128KB)为 Boot ROM(IDAU 固定安全),0x00020000-0x0009FFFF(512KB)为应用程序区(IDAU 固定非安全),0x000A0000-0x000FFFFF(384KB)为安全固件区(IDAU 固定安全)。外部 RAM 共 4MB,地址 0x20000000-0x203FFFFF,IDAU 默认全部非安全。
初始现象:安全固件需要将部分外部 RAM 用作安全数据缓冲区(存储会话密钥),但默认 IDAU 将其标记为非安全,导致安全固件无法在该区域存储敏感数据。
分析判断:由于 IDAU 将外部 RAM 全部标记为非安全,安全固件无法直接使用。此时需要通过 SAU 将外部 RAM 的高地址区域(例如 0x20300000-0x203FFFFF,共 1MB)覆盖为安全属性。根据合并规则,SAU 可以将 IDAU 非安全区域提升为安全,因此该方案可行。
实际操作步骤:
// 配置 SAU 区域 0:外部 RAM 高 1MB 设为安全
SAU->RNR = 0; // 选择区域 0
SAU->RBAR = (0x20300000 & SAU_RBAR_BADDR_Msk) | SAU_RBAR_ENABLE_Msk;
SAU->RLAR = (0x203FFFFF & SAU_RLAR_LADDR_Msk) | SAU_RLAR_ENABLE_Msk | SAU_RLAR_NSC_Msk;
// 使能 SAU
SAU->CTRL = SAU_CTRL_ENABLE_Msk;
__DSB();
__ISB();
结果对比:配置后,安全固件可以正常访问 0x20300000-0x203FFFFF 区域,而普通世界应用程序访问该区域会触发 SecureFault。通过 SAU 的灵活配置,实现了在不改变硬件设计的前提下,动态调整安全内存池的大小。
风险与代价:SAU 配置错误可能导致安全属性混乱。例如,如果将安全区域错误地配置为非安全,敏感数据可能泄露;反之,将非安全区域配置为安全,可能导致普通世界程序崩溃。此外,SAU 区域数量有限(Cortex-M33 通常支持 8 个区域),需要合理规划。
常见误区:不要认为 TrustZone 可以替代所有安全措施。TrustZone 提供的是隔离基础,但安全固件本身仍需进行安全编码(如防止缓冲区溢出、侧信道攻击)。此外,SAU 配置必须在安全世界完成,且配置代码本身必须安全可信,否则攻击者可能通过篡改配置流程绕过隔离。
3.5 总结复盘与设计建议
TrustZone 的世界划分和 SAU/IDAU 配置是 Cortex-M33 安全架构的基石。在实际项目中,建议遵循以下原则:
- 最小安全区原则:仅将必要的内存和外设配置为安全,减少攻击面。
- 安全启动链验证:确保 SAU 配置在安全启动流程中尽早完成,并验证配置完整性。
- 中断隔离:安全中断(如安全定时器、安全通信接口)应配置为最高优先级,防止普通世界中断干扰安全执行流。
- 调试接口保护:在普通世界禁用调试访问安全世界资源,防止通过调试接口泄露安全数据。