2. TrustZone基础

ARM TrustZone 并不是一颗独立的安全芯片,而是集成在 Cortex-A 系列处理器内部的一套硬件安全扩展。它把处理器的运行环境在逻辑上切分为两个世界:安全世界(Secure World)与非安全世界(Non-secure World)。两个世界共享同一颗 CPU 核心、同一套寄存器文件与同一份内存总线,但通过硬件信号在每次访问时打上安全属性标签,从而在物理资源复用的前提下实现强隔离。理解 TrustZone 的关键,是同时看清三条主线:安全状态位(NS 位)、异常等级(EL0~EL3)以及两者组合形成的执行环境切换路径。

一、核心原理:安全状态与异常等级的正交组合

TrustZone 的安全状态由处理器内部的 SCR_EL3.NS 位(Secure Configuration Register)决定。当 NS=0 时,核心处于安全状态;NS=1 时处于非安全状态。这个位不是软件随意切换的普通变量,它只能由运行在 EL3 的代码修改,普通应用和操作系统无权触碰,这正是隔离的根基。

异常等级则是 ARMv8-A 定义的权限层级:EL0 为用户态,EL1 为内核态,EL2 为虚拟化层,EL3 为安全监控层。安全状态与异常等级是正交的两个维度,组合后形成六个执行环境:安全 EL0/EL1/EL2 与非安全 EL0/EL1/EL2,而 EL3 永远只存在于安全侧,是唯一的“世界切换枢纽”。

安全世界典型软件栈:安全 EL0 放置可信应用(TA),安全 EL1 运行可信操作系统(TEE OS,如 OP-TEE),EL3 运行安全监控固件(Secure Monitor)。
非安全世界典型软件栈:非安全 EL0 运行普通 App,非安全 EL1 运行 Linux 等富操作系统,非安全 EL2 运行 Hypervisor。

内存侧同样被标记:系统总线上的每个事务都携带 NS 属性,TrustZone 地址空间控制器(TZASC)和 TrustZone 保护控制器(TZPC)据此决定该访问是否被允许。安全内存区域对非安全世界完全不可见,非安全世界即使拿到物理地址也无法读写。

二、执行环境切换机制:SMC 与 ERET

两个世界之间不能随意跳转,必须经过 EL3 的受控通道。非安全世界要请求安全服务时,执行 SMC(Secure Monitor Call)指令,触发同步异常陷入 EL3。EL3 中的安全监控代码保存非安全上下文、切换 NS 位、跳入安全世界;服务完成后,再通过 ERET 返回非安全世界。整个过程类似一次“受控的世界穿越”。

非安全 EL1 (Linux)
   │  SMC #0x84000001   ← 请求安全服务
   ▼
EL3 Secure Monitor
   │  保存非安全上下文
   │  设置 SCR_EL3.NS = 0
   │  跳转安全 EL1
   ▼
安全 EL1 (OP-TEE) → 安全 EL0 (TA)
   │  服务完成
   ▼
EL3 Secure Monitor
   │  恢复非安全上下文
   │  设置 SCR_EL3.NS = 1
   ▼
非安全 EL1 (Linux) 继续执行

除 SMC 外,还有几类触发世界切换的事件:安全世界的中断(IRQ/FIQ)可抢占非安全世界;非安全世界的中断在安全世界运行时被屏蔽或延迟;系统复位后核心默认从 EL3 安全状态启动,由固件决定后续引导路径。这些机制共同保证:非安全世界无法绕过 EL3 直接进入安全世界。

三、典型场景:一次指纹校验的完整路径

以手机指纹解锁为例。指纹采集驱动运行在非安全 Linux 中,但指纹模板比对必须放在安全世界,防止被恶意应用窃取。流程是:非安全 App 通过 TEE 客户端库发起请求,内核驱动执行 SMC 陷入 EL3;EL3 切换到安全世界,安全 EL1 的 TEE OS 调度指纹 TA;TA 在安全 EL0 中读取安全内存里的模板完成比对,仅把“匹配成功/失败”这一布尔结果返回;EL3 再切回非安全世界。整个过程中,指纹原始数据与模板始终未离开安全侧。

四、常见误区与复盘

  • 误区一:把 TrustZone 当成独立安全芯片。它是 CPU 内的逻辑隔离,安全代码仍运行在同一核心上,因此安全世界自身漏洞同样致命。
  • 误区二:认为非安全世界无法访问安全内存。实际是总线层面拦截,但若 TZASC 区域配置错误,隔离会形同虚设,必须逐项核对内存映射。
  • 误区三:忽略 EL3 的攻击面。EL3 是切换枢纽,SMC 处理函数若校验不足,可能成为提权入口,需严格限制 SMC 功能号与参数。
  • 误区四:混淆异常等级与安全状态。EL1 既可能是安全内核也可能是非安全内核,判断身份必须同时看 NS 位与 EL 值。
维度安全世界非安全世界
NS 位01
可用异常等级EL0 / EL1 / EL2 / EL3EL0 / EL1 / EL2
典型 OSOP-TEE、TrustyLinux、Android
内存可见性安全 + 非安全仅非安全
进入方式复位、SMC、安全中断ERET 返回、复位引导
记忆口诀:NS 定位世界,EL 定位权限,EL3 是唯一的世界闸门,SMC 是唯一的请求入口。把这三句话对应到代码中的 SCR_EL3.NS、CurrentEL 和 SMC 处理函数,TrustZone 的骨架就清晰了。
TrustZone 安全状态 × 异常等级 执行环境切换图 非安全世界 (NS = 1) 非安全 EL0 普通 App / 用户态 非安全 EL1 Linux / Android 内核 非安全 EL2 Hypervisor(可选) 非安全内存:仅 NS 访问可见 安全世界 (NS = 0) 安全 EL0 可信应用 TA 安全 EL1 TEE OS(OP-TEE / Trusty) 安全 EL2 安全虚拟化(可选) 安全内存:NS 不可见 EL3 安全监控层 Secure Monitor(仅安全侧,世界切换枢纽) SCR_EL3.NS 控制世界切换 · SMC 陷入 · ERET 返回 SMC ERET