1. OP-TEE 概述:TEE 概念、OP-TEE 架构、安全世界与普通世界隔离机制

1.1 TEE 概念与价值

可信执行环境(TEE,Trusted Execution Environment)是与设备主操作系统(REE,Rich Execution Environment)并行运行的隔离安全区域。TEE 通过硬件强制隔离,确保敏感数据在受保护的环境中存储、处理和传输,即使主操作系统被攻破,攻击者也无法访问 TEE 内部的安全资源。

特性 REE(普通世界) TEE(安全世界)
操作系统 Linux、Android、Windows OP-TEE、Trusty、QSEE
安全等级 软件隔离,易受攻击 硬件强制隔离,抗物理攻击
内存访问 只能访问非安全内存 可访问安全内存 + 非安全内存(受控)
外设访问 普通外设 安全外设(如安全键盘、指纹传感器)
典型应用 用户界面、网络通信 密钥管理、DRM、移动支付
核心价值:TEE 将安全敏感操作从庞大的 REE 软件栈中剥离,缩小攻击面,并提供硬件级信任根(Root of Trust),是移动支付、数字版权管理(DRM)、生物识别认证等场景的基础安全底座。

1.2 OP-TEE 架构全景

OP-TEE(Open Portable Trusted Execution Environment)是开源 TEE 实现,遵循 GlobalPlatform TEE 标准。其架构分为用户空间与内核空间,跨越安全世界与普通世界两个域。

架构要点:OP-TEE 采用客户端-服务器模型,REE 侧通过 TEE Client API 发起请求,安全世界侧由 OP-TEE OS 内核调度 TA(Trusted Application)执行安全操作。
OP-TEE 整体架构图 REE 普通世界 REE 用户空间 CA (Client Application) TEE Client API (libteec) 通过 GP TEE Client API 发起安全请求 REE 内核空间 OP-TEE 驱动 (optee.ko / optee_smc.ko) 处理 SMC 调用,管理共享内存 Monitor TEE 安全世界 TEE 用户空间 TA (Trusted Application) TEE Internal API 安全服务:加解密、密钥管理、安全存储 TEE 内核空间 OP-TEE OS 内核 (Core) SMC 处理、中断路由、内存管理、密码学服务 关键通信路径 1. CA 通过 TEE Client API 发起 open session / invoke command 2. OP-TEE 驱动封装参数,通过 SMC 指令陷入 Monitor 层 3. Monitor 切换安全世界,OP-TEE OS 内核解析请求并调度对应 TA

1.3 安全世界与普通世界隔离机制

隔离是 TEE 的基石。OP-TEE 利用 ARM TrustZone 技术实现硬件级隔离,将 SoC 资源划分为安全世界(Secure World)和普通世界(Normal World)。

1.3.1 处理器模式隔离

ARMv7-A/v8-A 架构引入 Monitor 模式作为安全世界与普通世界的切换点。CPU 通过执行 SMC(Secure Monitor Call)指令或硬件异常(如 FIQ)触发世界切换。

CPU 模式 所属世界 权限等级 主要用途
User (PL0) 普通世界 最低 运行 CA 用户态程序
Kernel (PL1) 普通世界 中 运行 Linux 内核
Secure User (PL0) 安全世界 最低 运行 TA
Secure Kernel (PL1) 安全世界 高 运行 OP-TEE OS 内核
Monitor (PL2) 固件 最高 世界切换仲裁

1.3.2 内存隔离

TrustZone 通过 NS(Non-Secure)位标记内存访问属性。安全世界可访问所有内存,普通世界只能访问 NS 位为 1 的内存区域。OP-TEE 使用 TZASC(TrustZone Address Space Controller)配置物理内存区域的安全属性。

TrustZone 内存隔离模型 安全内存 (Secure) NS=0 OP-TEE OS TA 代码/数据 仅安全世界可访问 非安全内存 (Non-Secure) NS=1 Linux 内核 CA 用户空间 普通世界可访问 共享内存 (NS=1, 安全可读) 安全世界可访问

1.3.3 中断隔离

中断是驱动调试中的关键难点。TrustZone 将中断分为两类:

  • IRQ(普通中断):路由到普通世界,由 Linux 内核处理。安全世界运行时若收到 IRQ,OP-TEE 会将其暂存或转发。
  • FIQ(快速中断):路由到安全世界,由 OP-TEE OS 处理。安全外设(如安全定时器、安全 DMA)使用 FIQ 保证实时性。
调试陷阱:在安全世界执行关键操作(如密钥生成)时,若 IRQ 配置不当,可能导致普通世界中断丢失或安全上下文被破坏。OP-TEE 通过 thread_irq_handler 和 thread_fiq_handler 实现中断路由与安全状态保存/恢复。

1.4 世界切换流程

从 CA 调用 TA 的完整世界切换路径如下:

  1. CA 发起请求:调用 TEEC_InvokeCommand,libteec 将参数打包到共享内存。
  2. 驱动介入:OP-TEE 驱动通过 ioctl 接收请求,构造 SMC 调用参数。
  3. SMC 陷入:执行 smc #0 指令,CPU 进入 Monitor 模式。
  4. Monitor 切换:保存普通世界上下文,恢复安全世界上下文,切换到安全世界。
  5. OP-TEE OS 处理:解析 SMC 参数,查找目标 TA,通过调度器进入 TA 入口。
  6. TA 执行:TA 在安全用户空间执行命令,通过 Internal API 访问安全资源。
  7. 返回:TA 完成后,OP-TEE OS 打包结果,再次 SMC 切回普通世界,驱动将结果返回 CA。
世界切换流程(CA → TA → CA) ① CA 调用 TEEC_InvokeCommand ② OP-TEE 驱动构造 SMC ③ SMC → Monitor 模式 ④ 切换到安全世界 ⑤ OP-TEE OS 调度 TA ⑥ TA 执行安全操作 ⑦ TA 返回结果 ⑧ SMC 切回普通世界 ⑨ 驱动返回结果给 CA 整个切换过程由 Monitor 固件和 OP-TEE OS 内核协同完成,驱动层负责参数传递与中断管理

1.5 驱动在隔离机制中的角色

OP-TEE 驱动(optee.ko)是普通世界与安全世界之间的桥梁,承担以下关键职责:

  • SMC 调用封装:将 CA 的请求转换为标准 SMC 调用格式,通过 smc 指令触发世界切换。
  • 共享内存管理:分配和管理非安全世界与安全世界共享的内存缓冲区,用于传递参数和返回结果。
  • 中断路由辅助:配合 OP-TEE OS 处理 IRQ/FIQ 路由,确保安全世界执行期间普通世界中断不被丢失。
  • 安全监控:检测异常世界切换请求,防止非授权访问安全资源。
调试切入点:驱动层是调试世界切换和中断协同问题的第一现场。通过 dmesg 查看驱动日志、使用 ftrace 跟踪 SMC 调用频率、在驱动代码中插入 dev_dbg 打印共享内存状态,是定位隔离问题的常用手段。