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 的内存。
二、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 负责保存和恢复上下文,并决定哪些寄存器、哪些内存区域可以跨世界传递。这一层是安全边界的关键,也是攻击者最关注的目标。
三、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 的完整流程如下:
- CA 通过
TEEC_InitializeContext打开/dev/tee0,建立与 TEE 的上下文。 - CA 调用
TEEC_OpenSession,libteec 将请求交给 optee.ko,驱动通过 SMC 陷入 EL3,Monitor 切换到安全世界。 - OP-TEE OS 根据 UUID 找到并加载对应 TA,建立会话,返回会话 ID。
- CA 通过
TEEC_InvokeCommand发起命令,参数通过共享内存传递,TA 在安全世界执行敏感操作。 - TA 返回结果,OP-TEE OS 通过 Monitor 切回普通世界,驱动把结果回传给 CA。
- 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);
五、常见误区与复盘
复盘要点:TEE 的价值在于“最小化可信代码”,只把密钥、身份、加解密等最敏感逻辑放入安全世界;普通世界的驱动与 supplicant 只是搬运工,不应持有明文密钥。理解 TrustZone 的 NS 位、SMC 切换、共享内存三条主线,就掌握了 OP-TEE 驱动与安全外设集成的底层脉络。