2. TEE与OP-TEE基础

在移动支付、数字版权保护、生物特征识别等场景中,普通操作系统(Rich OS)面临内核漏洞、Root 提权、内存窃取等威胁。可信执行环境(Trusted Execution Environment,TEE)通过硬件隔离,在同一颗 SoC 上划出一块普通世界无法访问的安全区域,用于运行敏感代码与保存密钥。OP-TEE 是 ARM TrustZone 平台上最主流的开源 TEE 实现之一,理解它的组成与双世界交互机制,是后续驱动与安全外设集成的基础。

一、TEE 的核心概念

TEE 是与普通操作系统并存的独立执行环境,具备四个关键属性:隔离性(安全世界资源对普通世界不可见)、完整性(安全代码与数据受硬件保护)、可认证性(可向外部证明自身可信状态)、轻量性(只运行必要的安全服务,不承担通用计算)。TEE 内部通常运行可信应用(Trusted Application,TA),每个 TA 提供一组受保护的命令接口;普通世界的客户端应用(Client Application,CA)通过标准会话机制调用 TA,而无法直接读写 TA 的内存。

TEE 不是“更安全的 Linux”,而是与 Linux 对等的独立世界。它不替代普通 OS,而是把最敏感的那一小部分逻辑(密钥运算、加解密、身份校验)从普通 OS 中搬离出来。

二、ARM TrustZone 架构

ARM TrustZone 是 TEE 的硬件基础。它把 CPU、总线、内存和外设都划分为安全(Secure)与非安全(Non-secure)两种状态,由 NS 位标记当前访问的安全属性。CPU 通过 SCR.NS 位切换世界;总线侧由 TZASC(TrustZone Address Space Controller)划分 DRAM 安全区域,由 TZPC(TrustZone Protection Controller)控制外设的安全属性。中断控制器使用 FIQ 作为安全中断、IRQ 作为普通中断,从而让安全世界拥有独立的中断入口。

两个世界之间的切换由 Secure Monitor 完成,它运行在 ARM 的最高异常等级 EL3,通过 SMC(Secure Monitor Call)指令触发。世界切换时,Monitor 负责保存和恢复上下文,并决定哪些寄存器、哪些内存区域可以跨世界传递。这一层是安全边界的关键,也是攻击者最关注的目标。

ARM TrustZone 双世界架构与 OP-TEE 组成 普通世界 Normal World 客户端应用 CA 调用 TEE Client API / libteec Linux 内核 + OP-TEE 驱动 optee.ko / SMC 调用 / 共享内存 普通外设与文件系统 网络、存储、显示等 共享内存 Shared Memory CA 与 TA 交换参数的受控缓冲区 安全世界 Secure World 可信应用 TA 密钥运算 / 安全存储 / 加解密 OP-TEE OS(TEE Core) 调度 / 内存管理 / TA 加载 / 系统调用 安全外设与安全存储 eFuse / RPMB / 加密引擎 安全内存 Secure RAM TZASC 保护,普通世界不可访问 Secure Monitor (EL3) — SMC 世界切换 SMC 调用 返回结果 共享内存

三、OP-TEE 的组成

OP-TEE 由三大部分构成,分别运行在三个层次:

  • OP-TEE OS(TEE Core):运行在安全世界 EL1,是安全侧的操作系统内核,负责 TA 的加载与调度、安全内存管理、系统调用分发、与 Monitor 的接口。
  • OP-TEE 驱动(optee.ko):运行在普通世界 Linux 内核态,负责把 CA 的请求通过 SMC 转发给安全世界,并管理共享内存映射。
  • TEE Client / TEE Supplicant:用户态组件。libteec 提供 CA 调用接口;tee-supplicant 作为普通世界的守护进程,为安全世界代理文件系统、RPMB 等无法直接访问的资源。
组件 运行位置 主要职责
OP-TEE OS 安全世界 EL1 TA 调度、内存管理、系统调用
optee.ko 普通世界内核态 SMC 转发、共享内存管理
libteec 普通世界用户态 CA 调用 TEE 的 API 库
tee-supplicant 普通世界用户态 代理文件系统、RPMB 等资源
Secure Monitor EL3 世界切换与上下文保存

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

CA 调用 TA 的完整流程如下:

  1. CA 通过 TEEC_InitializeContext 打开 /dev/tee0,建立与 TEE 的上下文。
  2. CA 调用 TEEC_OpenSession,libteec 将请求交给 optee.ko,驱动通过 SMC 陷入 EL3,Monitor 切换到安全世界。
  3. OP-TEE OS 根据 UUID 找到并加载对应 TA,建立会话,返回会话 ID。
  4. CA 通过 TEEC_InvokeCommand 发起命令,参数通过共享内存传递,TA 在安全世界执行敏感操作。
  5. TA 返回结果,OP-TEE OS 通过 Monitor 切回普通世界,驱动把结果回传给 CA。
  6. CA 调用 TEEC_CloseSession 与 TEEC_FinalizeContext 释放资源。
/* CA 侧典型调用序列 */
TEEC_InitializeContext(NULL, &ctx);
TEEC_OpenSession(&ctx, &session, &ta_uuid,
                 TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
TEEC_InvokeCommand(&session, CMD_ENCRYPT, &op, &err_origin);
TEEC_CloseSession(&session);
TEEC_FinalizeContext(&ctx);
共享内存是双世界交互的“安全通道”。CA 把参数放入共享缓冲区,TA 只能读取该缓冲区,不能越界访问普通世界其他内存。设计 TA 时必须校验所有来自共享内存的长度与指针,防止恶意 CA 构造越界参数。

五、常见误区与复盘

误区一:认为“用了 TEE 就绝对安全”。TEE 的安全依赖 Monitor、TZASC、TA 自身代码质量,任一环节被攻破都会导致边界失效。误区二:把大量业务逻辑塞进 TA,导致 TCB(可信计算基)膨胀,攻击面反而增大。误区三:忽略共享内存的参数校验,让 TA 被恶意 CA 利用。

复盘要点:TEE 的价值在于“最小化可信代码”,只把密钥、身份、加解密等最敏感逻辑放入安全世界;普通世界的驱动与 supplicant 只是搬运工,不应持有明文密钥。理解 TrustZone 的 NS 位、SMC 切换、共享内存三条主线,就掌握了 OP-TEE 驱动与安全外设集成的底层脉络。