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 路由到安全世界。这样,安全世界拥有独立的地址空间、外设和中断通道,形成完整的隔离域。

ARM TrustZone 双世界架构与交互 普通世界 Normal World (NS=1) 富操作系统 Linux / Android 普通应用 TEE 客户端库 OP-TEE 驱动 / SMC 调用接口 共享内存 (Non-Secure DRAM) 安全世界 Secure World (NS=0) OP-TEE OS (安全内核) 可信应用 TA TEE 内部 API 安全外设 / 安全内存 / 密钥存储 安全 SRAM / 加密引擎 Monitor Mode SMC 指令 / 世界切换 共享内存 CPU 通过 NS 位与 Monitor Mode 在双世界间切换,共享内存用于跨世界数据传递

三、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 与内核。

四、安全世界与普通世界的交互机制

两个世界不能直接调用函数,必须通过受控通道。典型流程如下:

  1. CA 调用 TEEC_InitializeContext 打开 TEE 设备,建立上下文。
  2. 通过 TEEC_OpenSession 按 UUID 打开目标 TA,OP-TEE 驱动触发 SMC 进入安全世界。
  3. OP-TEE OS 加载并校验 TA,创建会话,返回会话 ID。
  4. CA 用 TEEC_InvokeCommand 发起命令,参数通过共享内存传递。
  5. TA 执行命令,结果写回共享内存,SMC 返回普通世界。
  6. 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.koSMC 异常向量
调用方式TEEC_InvokeCommandTA_InvokeCommandEntryPoint
数据通道共享内存 + 参数结构映射后的安全虚拟地址
身份标识UUID + 登录类型TA 签名与属性校验
返回TEEC_ResultTEE_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 四角色。后续安全存储与密钥服务,都建立在这套双世界交互模型之上。