1. 课程导入
在嵌入式与物联网设备中,安全不再只是软件层面的加密算法问题。攻击者可以通过调试接口、DMA、外设寄存器、共享内存等路径绕过操作系统权限,直接读取密钥或篡改控制流。ARM TrustZone 技术通过在处理器、总线、内存与外设之间建立硬件级的安全隔离边界,把系统划分为安全世界(Secure World)与非安全世界(Normal World),为可信执行环境提供基础。本课程的目标,是让学习者不仅理解 TrustZone 的架构概念,更能完成安全世界搭建、外设隔离配置与工程化验证。
一、学习目标:从概念到可运行工程
本课程围绕“能看懂、能配置、能调试、能验证”四个层次展开。完成学习后,你应当能够:
- 解释 TrustZone 的地址空间划分、安全状态切换与异常级别关系;
- 使用 TF-A、OP-TEE 或厂商安全固件搭建最小安全世界;
- 通过 TZASC、TZPC、SAU/IDAU 等组件完成内存与外设隔离;
- 编写安全服务与非安全客户端之间的通信接口;
- 定位隔离失效、外设访问异常与启动链断裂等典型问题。
二、核心概念:安全边界如何形成
TrustZone 的安全边界由多个硬件组件共同构成。处理器侧的 SCR.NS 位决定当前处于安全还是非安全状态;SAU(Secure Attribution Unit)与 IDAU(Implementation Defined Attribution Unit)负责定义地址的安全属性;总线侧的 TZASC 控制内存区域访问权限,TZPC 控制外设端口安全属性。安全世界通常运行可信固件与安全服务,非安全世界运行 Linux、RTOS 或裸机应用。
安全世界与非安全世界之间的切换通过 SMC 指令触发,进入 EL3 监控器后由安全固件决定是否转发到可信 OS。共享内存是两世界通信的常用载体,但必须配合缓存一致性维护与访问权限检查,否则会形成数据泄露或篡改通道。
三、整体框架:启动链与隔离层次
典型 TrustZone 系统的启动链从 BootROM 开始,依次加载 BL1、BL2、BL31(EL3 运行时)、BL32(可信 OS)与 BL33(非安全引导)。BL31 负责建立安全世界运行环境并常驻 EL3,处理来自两个世界的 SMC 调用。BL32 通常是 OP-TEE,提供可信应用加载与安全服务。BL33 进入非安全世界,运行 U-Boot 与操作系统。
外设隔离工程的关键在于:在启动早期就完成 TZASC/TZPC 配置,避免非安全世界抢先访问敏感外设;同时为安全世界保留独立的中断、时钟、复位与 DMA 通道。若隔离配置晚于非安全驱动初始化,攻击者可能利用时间窗口完成数据窃取。
| 隔离对象 | 典型硬件组件 | 配置时机 | 常见风险 |
|---|---|---|---|
| 内存区域 | TZASC / MPU / SAU | BL2 或 BL31 早期 | 安全内存被非安全世界读写 |
| 外设端口 | TZPC / 外设防火墙 | BL2 阶段 | 调试串口、加密引擎被非法访问 |
| 中断与异常 | GIC 安全分组 | BL31 初始化 | 安全中断被非安全世界劫持 |
| DMA 通道 | DMA 控制器安全属性 | 驱动加载前 | DMA 绕过 CPU 权限读取密钥 |
四、实战路线图与常见误区
课程后续将按照“环境搭建 → 安全启动 → 内存隔离 → 外设隔离 → 安全服务 → 调试与验证”的路线推进。建议先使用 QEMU 或开发板运行 TF-A + OP-TEE 最小系统,再逐步加入 TZASC/TZPC 配置,最后编写自定义 TA 与 CA 完成端到端验证。
# 典型构建与启动观察点
make PLAT=qemu \
BL32=optee.bin \
BL33=u-boot.bin \
all
# 启动日志中应关注
NOTICE: BL31: TrustZone enabled
NOTICE: BL32: OP-TEE initialized
NOTICE: TZASC region 0: secure
NOTICE: TZPC peripheral 3: secure
TrustZone 安全世界与外设隔离工程的核心,是把“信任”从软件假设转化为硬件可验证的访问规则。掌握启动链、隔离组件与调试方法后,你就能在真实芯片上构建可度量、可验证的安全边界。