2. ARM TrustZone基础
ARM TrustZone 是 ARM 处理器中用于构建可信执行环境(TEE)的硬件安全扩展。它并不是一个独立的安全芯片,而是把同一颗 CPU、同一套内存和总线资源,在逻辑上划分为两个相互隔离的世界:安全世界(Secure World)与非安全世界(Normal World)。理解 TrustZone,关键要抓住四条主线:架构上的双世界划分、异常等级与执行状态、内存与外设的隔离机制,以及系统总线上的安全属性传播。
一、TrustZone 架构概述
TrustZone 的核心思想是“硬件级隔离 + 世界切换”。CPU 在任意时刻只处于一个世界中,通过一条名为 NS(Non-Secure)的安全状态位来标识当前世界。当 NS=0 时处理器运行在安全世界,可访问安全资源;当 NS=1 时运行在非安全世界,访问安全资源会被硬件拦截。两个世界可以运行各自的操作系统:非安全世界通常运行 Linux、Android 等富操作系统,安全世界运行 OP-TEE、Trusty 等可信操作系统。
世界切换通过 SMC(Secure Monitor Call)指令触发,进入安全监控器(Secure Monitor)完成上下文保存与切换。安全监控器运行在最高异常等级 EL3,是唯一能同时看到两个世界的软件层,也是整个信任链的“守门人”。
二、安全世界与非安全世界
两个世界在软件栈上是对称的,但在权限和资源上是不对等的。非安全世界负责通用计算与业务逻辑,安全世界负责密钥管理、安全启动、加解密、生物特征比对等敏感操作。二者通过明确定义的接口通信,典型方式是 TEE Client API 或 SMC 调用。
- 非安全世界:运行 Rich OS,应用通过 CA(Client Application)发起安全请求。
- 安全世界:运行 Trusted OS,TA(Trusted Application)处理请求并返回结果。
- 安全监控器:位于 EL3,负责世界切换、中断分发和上下文保存。
需要特别注意的是,非安全世界不能直接读写安全世界的内存,也不能直接访问安全外设。所有跨世界的数据交换都必须经过共享内存(Shared Memory)和受控的调用通道,这从硬件层面切断了普通应用窥探密钥的可能。
三、异常等级与执行状态
ARMv8-A 引入了异常等级(Exception Level,EL)概念,TrustZone 的安全状态与异常等级共同构成处理器的执行上下文。EL0 到 EL3 权限逐级升高,EL3 始终属于安全世界。
| 异常等级 | 典型软件 | 安全属性 |
|---|---|---|
| EL0 | 普通应用 / 可信应用 | 非安全或安全 |
| EL1 | Linux 内核 / Trusted OS 内核 | 非安全或安全 |
| EL2 | Hypervisor(可选) | 通常非安全 |
| EL3 | Secure Monitor / ATF | 始终安全 |
从非安全世界进入安全世界,必须经过 EL3 的 Secure Monitor。这条路径是单向受控的:非安全侧只能通过 SMC 发起请求,不能直接跳转到安全侧的任意地址执行。EL3 固件通常由 ARM Trusted Firmware(ATF)实现,负责初始化、世界切换和 PSCI 电源管理。
四、内存隔离与系统总线
TrustZone 的内存隔离依赖两个关键机制:地址空间控制器(TZASC)和总线上的 NS 位传播。TZASC 可以把物理内存划分为安全区和非安全区,非安全访问落到安全区时会被直接拒绝。外设侧则由 TZPC(TrustZone Protection Controller)控制,决定某个外设是否只允许安全世界访问。
当 CPU 发起一次内存访问时,总线事务会携带当前世界的安全属性(NS 位)。这个属性沿着总线一路传播到内存控制器和外设控制器,任何一环发现属性与目标区域不匹配,就会阻断访问并产生错误。这意味着隔离不是靠软件“自觉”,而是由硬件在每次访问时强制执行。
五、典型场景与常见误区
以安全支付为例:支付应用运行在非安全世界的 EL0,它需要调用安全世界完成密钥签名。流程是:CA 通过 TEE Client API 发起请求,驱动触发 SMC 陷入 EL3,Secure Monitor 保存非安全上下文并切换到安全世界,Trusted OS 调度对应 TA 执行签名,结果写入共享内存后返回非安全世界。整个过程中,密钥从未离开安全内存。