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)执行安全操作。
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)配置物理内存区域的安全属性。
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 的完整世界切换路径如下:
- CA 发起请求:调用
TEEC_InvokeCommand,libteec 将参数打包到共享内存。 - 驱动介入:OP-TEE 驱动通过 ioctl 接收请求,构造 SMC 调用参数。
- SMC 陷入:执行
smc #0指令,CPU 进入 Monitor 模式。 - Monitor 切换:保存普通世界上下文,恢复安全世界上下文,切换到安全世界。
- OP-TEE OS 处理:解析 SMC 参数,查找目标 TA,通过调度器进入 TA 入口。
- TA 执行:TA 在安全用户空间执行命令,通过 Internal API 访问安全资源。
- 返回:TA 完成后,OP-TEE OS 打包结果,再次 SMC 切回普通世界,驱动将结果返回 CA。
1.5 驱动在隔离机制中的角色
OP-TEE 驱动(optee.ko)是普通世界与安全世界之间的桥梁,承担以下关键职责:
- SMC 调用封装:将 CA 的请求转换为标准 SMC 调用格式,通过
smc指令触发世界切换。 - 共享内存管理:分配和管理非安全世界与安全世界共享的内存缓冲区,用于传递参数和返回结果。
- 中断路由辅助:配合 OP-TEE OS 处理 IRQ/FIQ 路由,确保安全世界执行期间普通世界中断不被丢失。
- 安全监控:检测异常世界切换请求,防止非授权访问安全资源。
调试切入点:驱动层是调试世界切换和中断协同问题的第一现场。通过
dmesg 查看驱动日志、使用 ftrace 跟踪 SMC 调用频率、在驱动代码中插入 dev_dbg 打印共享内存状态,是定位隔离问题的常用手段。