3. ARM TrustZone技术基础
ARM TrustZone 是 ARM 处理器提供的一套硬件级安全隔离技术,它并非一个独立的协处理器或外设,而是贯穿 CPU 内核、总线、内存控制器和外设接口的系统级安全架构。理解 TrustZone 是掌握 OP-TEE 运行基础的前提,因为 OP-TEE 的安全世界(Secure World)正是构建在 TrustZone 提供的隔离机制之上。本节将从隔离机制、异常级别、地址空间、内存标签和总线访问控制五个维度,系统梳理 TrustZone 的技术基础。
一、安全世界与普通世界的隔离机制
TrustZone 的核心思想是将整个 SoC 的硬件资源在逻辑上划分为两个相互隔离的世界:安全世界(Secure World)和普通世界(Normal World)。两个世界各自拥有独立的执行环境、内存区域和外设访问权限。普通世界运行 Rich OS(如 Linux、Android),负责通用计算任务;安全世界运行可信操作系统(如 OP-TEE OS),负责处理敏感数据、密钥管理和安全服务。
隔离的实现依赖于一个关键信号——NS 位(Non-Secure bit)。该位伴随每一次总线事务在系统总线上传播,标记当前访问请求来自哪个世界。当 CPU 处于安全状态时,NS 位为 0;处于非安全状态时,NS 位为 1。总线上的安全组件(如 TZASC、TZPC)根据 NS 位判断是否允许该访问通过,从而在硬件层面实现强制隔离。这种隔离不依赖软件检查,即使普通世界的内核被攻破,也无法直接访问安全世界的资源。
核心要点:TrustZone 的隔离是硬件强制的,NS 位是贯穿整个 SoC 的安全标记,所有总线事务都携带该标记,安全组件据此执行访问控制。
二、异常级别与安全状态的组合
ARMv8-A 架构定义了四个异常级别 EL0 至 EL3,TrustZone 的安全状态与异常级别组合,形成了完整的安全执行环境。每个异常级别都可以运行在安全或非安全状态下,但 EL3 始终处于安全状态,是最高特权级别,负责安全世界与普通世界之间的切换。
| 异常级别 | 典型运行环境 | 安全状态 | 主要职责 |
|---|---|---|---|
| EL0 | 用户态应用 | 安全/非安全 | 普通应用或可信应用(TA) |
| EL1 | Rich OS 内核 / OP-TEE OS | 安全/非安全 | 操作系统内核、驱动 |
| EL2 | Hypervisor | 非安全为主 | 虚拟化支持 |
| EL3 | Secure Monitor | 仅安全 | 世界切换、安全配置 |
在 OP-TEE 的典型部署中,普通世界的 Linux 内核运行在非安全 EL1,用户应用运行在非安全 EL0;安全世界的 OP-TEE OS 运行在安全 EL1,可信应用运行在安全 EL0;Secure Monitor 运行在 EL3,负责处理 SMC(Secure Monitor Call)指令,完成两个世界之间的上下文切换。当普通世界需要请求安全服务时,通过 SMC 指令陷入 EL3,由 Secure Monitor 保存普通世界上下文、恢复安全世界上下文,然后进入安全 EL1 执行 OP-TEE OS 的处理逻辑。
三、地址空间划分
TrustZone 将物理地址空间划分为安全地址空间和非安全地址空间。这种划分不是简单的连续分段,而是通过地址空间控制器(如 TZASC)对内存区域进行精细的权限配置。每个内存区域可以配置为仅安全访问、仅非安全访问或两者均可访问。
在 OP-TEE 环境中,典型的内存布局包括:
- 安全 DRAM:存放 OP-TEE OS 镜像、可信应用、安全堆栈和敏感数据,仅安全世界可访问。
- 非安全 DRAM:普通世界 Linux 和应用程序使用,安全世界在特定条件下可有限访问。
- 共享内存:用于两个世界之间传递参数和数据,双方均可访问,但需遵循严格的协议。
- 安全外设区:如加密引擎、安全存储控制器,仅安全世界可访问。
地址空间的划分在系统启动早期由安全固件(如 ARM Trusted Firmware)完成配置,一旦设定,普通世界无法修改。OP-TEE OS 启动后会进一步配置 MMU,建立安全世界的虚拟地址映射,确保安全内存不被非安全世界映射或窥探。
四、内存标签与总线访问控制
内存标签(Memory Tagging)是 ARMv8.5-A 引入的硬件安全特性,与 TrustZone 配合使用可进一步增强内存安全。MTE 为每块内存分配一个 4 位的标签,指针中也携带对应的标签,访问时硬件自动比对标签是否匹配,不匹配则触发异常。在 TrustZone 环境中,MTE 可用于检测安全世界内部的内存越界和释放后使用等漏洞。
总线访问控制是 TrustZone 隔离机制的执行层。当 CPU 或 DMA 控制器发起总线事务时,事务中携带 NS 位、地址信息和访问权限。总线上的安全组件根据预配置的规则进行判断:
- TZASC:负责 DRAM 区域的安全属性划分,根据地址范围决定是否允许非安全访问。
- TZPC:负责外设的安全属性配置,控制哪些外设可被安全世界独占。
- TZMA:在部分 ARM 系统中用于内存适配器层面的安全控制。
总线访问控制是“最后一道防线”。即使 CPU 层面的隔离被绕过,只要总线上的安全组件配置正确,非安全访问仍然会被拦截并返回错误。
五、案例场景:一次安全服务调用的完整路径
假设普通世界的一个应用需要调用 OP-TEE 中的可信应用进行密钥签名操作,其完整路径如下:
- 应用通过 OP-TEE 客户端库发起调用,请求进入 Linux 内核驱动。
- Linux 内核驱动准备共享内存,将参数写入共享缓冲区。
- 驱动执行 SMC 指令,CPU 陷入 EL3。
- Secure Monitor 保存非安全上下文,恢复安全上下文,切换到安全 EL1。
- OP-TEE OS 接收请求,验证参数,调度对应的可信应用。
- 可信应用在安全 EL0 执行签名操作,访问安全内存中的密钥。
- 操作完成后,结果写入共享内存,OP-TEE OS 执行 SMC 返回 EL3。
- Secure Monitor 恢复非安全上下文,返回 Linux 内核,最终返回应用。
整个过程中,NS 位在每次总线访问时都正确标记,TZASC 确保安全内存不被非安全访问,TZPC 确保加密引擎不被普通世界直接操作。
六、常见误区与复盘
误区一:认为 TrustZone 隔离只靠软件实现。实际上,TrustZone 的隔离根基在硬件,软件配置只是设定规则,执行由总线安全组件完成。
误区二:认为安全世界绝对安全。TrustZone 提供的是隔离机制,不是漏洞免疫。安全世界内部的软件缺陷(如缓冲区溢出)仍可能导致安全问题,需要结合 MTE、栈保护等措施。
误区三:忽略共享内存的安全风险。共享内存是两个世界的数据通道,必须严格校验数据来源和格式,防止非安全世界通过共享内存注入恶意数据。
复盘来看,理解 TrustZone 需要把握三条主线:第一,NS 位是贯穿始终的安全标记;第二,异常级别与安全状态的组合决定了代码的执行权限;第三,总线访问控制是隔离的最终执行者。只有这三者协同工作,才能构建出 OP-TEE 所依赖的可信执行环境。