2. TEE与OP-TEE基础
在移动设备、支付终端、车机和智能摄像头等场景中,系统既要运行功能丰富的通用操作系统,又要保护指纹、支付令牌、DRM 密钥等敏感资产。仅靠普通操作系统内的权限隔离并不足够,因为内核被攻破后,应用层沙箱往往随之失效。可信执行环境(TEE,Trusted Execution Environment)正是在这一背景下提出的硬件级隔离方案:它与普通世界(Normal World)共享同一颗处理器,却拥有独立的执行状态、内存视图和中断入口,从而在硬件层面把安全关键代码与富操作系统隔离开来。
一、TEE 的核心概念
TEE 可以理解为处理器内部的一块“受保护隔间”。它提供三项关键能力:隔离性,安全世界的代码与数据不能被普通世界直接读写;完整性,安全世界镜像在启动时经过签名校验;可证明性,安全应用可以向外部证明自身身份与运行环境可信。与之相对,普通世界运行 Linux、Android 等富操作系统,负责 UI、网络和业务逻辑,但无法直接访问安全资源。
需要区分 TEE 与 SE(Secure Element)、TPM 等独立安全芯片:TEE 复用主处理器,成本低、性能好、与主系统交互紧密;SE 是独立芯片,抗物理攻击更强但带宽和算力有限。实际产品常将两者组合使用,例如 TEE 负责会话密钥运算,SE 负责根密钥存储。
二、ARM TrustZone 架构
ARM TrustZone 是实现 TEE 的主流硬件基础。它在 CPU 中引入一个安全状态位(NS 位),把系统划分为安全世界(Secure World)与普通世界(Normal World)。同一颗 CPU 通过监视器模式(Monitor Mode)在两者之间切换,切换由 SMC(Secure Monitor Call)指令触发。
TrustZone 的隔离不止于 CPU:总线(如 AMBA AXI)带有 NS 信号,内存控制器和 TZASC 可把物理内存划分为安全区与普通区;外设通过 TZPC 控制访问权限;中断控制器 GIC 支持 FIQ 路由到安全世界。这样,安全世界拥有独立的地址空间、外设和中断通道,形成完整的隔离域。
三、OP-TEE 的组成
OP-TEE 是 Linaro 主导的开源 TEE 实现,遵循 GlobalPlatform 规范,广泛用于 ARM 平台。其组成可分为四部分:
- OP-TEE OS:运行在安全世界的小型内核,提供线程调度、内存管理、TA 加载与系统调用。
- OP-TEE Client:普通世界的用户态库(libteec)与内核驱动(tee.ko),负责发起 SMC 并管理共享内存。
- 可信应用 TA:运行在安全世界的业务逻辑,如安全存储、密钥派生、加解密。
- Normal World 应用:调用 libteec 的 CA(Client Application),通过会话与 TA 通信。
启动链上,BL1/BL2 等引导阶段先校验 OP-TEE 镜像签名,再由 ATF(ARM Trusted Firmware)在 EL3 完成安全世界初始化,最后跳转到普通世界的 U-Boot 与内核。
四、安全世界与普通世界的交互机制
两个世界不能直接调用函数,必须通过受控通道。典型流程如下:
- CA 调用
TEEC_InitializeContext打开 TEE 设备,建立上下文。 - 通过
TEEC_OpenSession按 UUID 打开目标 TA,OP-TEE 驱动触发 SMC 进入安全世界。 - OP-TEE OS 加载并校验 TA,创建会话,返回会话 ID。
- CA 用
TEEC_InvokeCommand发起命令,参数通过共享内存传递。 - TA 执行命令,结果写回共享内存,SMC 返回普通世界。
- CA 调用
TEEC_CloseSession与TEEC_FinalizeContext释放资源。
TEEC_Context ctx;
TEEC_Session sess;
TEEC_InitializeContext(NULL, &ctx);
TEEC_OpenSession(&ctx, &sess, &ta_uuid,
TEEC_LOGIN_PUBLIC, NULL, NULL, NULL);
TEEC_Operation op = {0};
op.params[0].tmpref.buffer = in;
op.params[0].tmpref.size = in_len;
TEEC_InvokeCommand(&sess, CMD_ENCRYPT, &op, NULL);
TEEC_CloseSession(&sess);
TEEC_FinalizeContext(&ctx);
共享内存是交互的关键:普通世界分配的内存需注册为共享缓冲区,OP-TEE 在安全世界映射同一物理页,双方通过参数结构体交换数据。为避免竞争,OP-TEE 使用互斥与引用计数管理共享内存生命周期。
| 交互要素 | 普通世界侧 | 安全世界侧 |
|---|---|---|
| 入口 | libteec / tee.ko | SMC 异常向量 |
| 调用方式 | TEEC_InvokeCommand | TA_InvokeCommandEntryPoint |
| 数据通道 | 共享内存 + 参数结构 | 映射后的安全虚拟地址 |
| 身份标识 | UUID + 登录类型 | TA 签名与属性校验 |
| 返回 | TEEC_Result | TEE_SUCCESS / 错误码 |
五、典型场景与常见误区
以移动支付为例:支付 App 作为 CA,通过 libteec 打开支付 TA;TA 在安全世界内完成密钥协商与交易签名,私钥永不离开安全世界;普通世界只拿到签名结果。即使 Android 被 root,攻击者也无法直接读取 TA 内存。
常见误区:把 TEE 当成“绝对安全”。TEE 的信任根在硬件与引导链,若 BL1 被替换或调试口未关闭,安全世界同样可被攻破。此外,共享内存是双向可见的,敏感数据在传入 TA 前应加密或最小化暴露;TA 自身若存在缓冲区溢出,也会成为攻击入口。
复盘要点:理解 TEE 先抓住“隔离域 + 受控通道”两条主线;理解 TrustZone 先抓住 NS 位、Monitor Mode、TZASC/GIC 三件套;理解 OP-TEE 先抓住 OS、Client、TA、CA 四角色。后续安全存储与密钥服务,都建立在这套双世界交互模型之上。