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,是唯一能同时看到两个世界的软件层,也是整个信任链的“守门人”。

TrustZone 的本质不是“多了一个安全核”,而是“同一颗核在时间维度上分时复用,在空间维度上隔离资源”。安全世界与非安全世界共享 CPU 流水线,但拥有独立的寄存器上下文、页表和中断路由。

二、安全世界与非安全世界

两个世界在软件栈上是对称的,但在权限和资源上是不对等的。非安全世界负责通用计算与业务逻辑,安全世界负责密钥管理、安全启动、加解密、生物特征比对等敏感操作。二者通过明确定义的接口通信,典型方式是 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 位)。这个属性沿着总线一路传播到内存控制器和外设控制器,任何一环发现属性与目标区域不匹配,就会阻断访问并产生错误。这意味着隔离不是靠软件“自觉”,而是由硬件在每次访问时强制执行。

TrustZone 双世界与总线隔离示意 ARM CPU Core NS 位标识当前世界 安全世界 Secure World Trusted OS Trusted App 安全内存 / 安全外设 非安全世界 Normal World Rich OS Client App 普通内存 / 普通外设 Secure Monitor (EL3) SMC 世界切换 / 中断路由 系统总线:NS 安全属性随事务传播 → TZASC / TZPC 拦截非法访问

五、典型场景与常见误区

以安全支付为例:支付应用运行在非安全世界的 EL0,它需要调用安全世界完成密钥签名。流程是:CA 通过 TEE Client API 发起请求,驱动触发 SMC 陷入 EL3,Secure Monitor 保存非安全上下文并切换到安全世界,Trusted OS 调度对应 TA 执行签名,结果写入共享内存后返回非安全世界。整个过程中,密钥从未离开安全内存。

常见误区一:认为“用了 TrustZone 就安全了”。TrustZone 只提供隔离底座,安全世界内部的 TA 若存在漏洞,同样会被攻破。误区二:把 EL3 当成普通特权级。EL3 是安全世界的最高层,非安全侧无法直接进入,必须经 SMC 受控切换。误区三:忽略总线属性传播。若 TZASC/TZPC 配置错误,隔离形同虚设。
工程实践建议:优先使用 ATF 提供的标准 SMC 接口,避免自定义世界切换逻辑;对共享内存做严格的大小与边界校验;在启动阶段就完成 TZASC/TZPC 配置,防止非安全世界抢先访问敏感区域。