TEE-OS 入门第二篇:核心概念体系与运行原理
承接第一篇的基础认知,本篇将系统拆解TEE的完整概念体系,把所有零散的术语和机制串联成一个逻辑自洽的知识框架。掌握这些核心概念,你就能看懂任何TEE-OS的代码结构,理解所有TEE相关的系统行为。
一、TEE的核心运行模型
TEE不是一个孤立的系统,它永远和REE(富执行环境)成对存在,两者通过严格定义的接口进行交互。理解这个交互模型,是所有TEE学习的起点。
1. REE与TEE的交互本质
两个世界是完全隔离的,非安全世界的代码无法直接访问安全世界的任何资源。所有交互都必须通过SMC(Secure Monitor Call)指令这个唯一的网关。
SMC指令的本质:
- 这是ARM架构专门为TrustZone设计的一条特权指令
- 非安全世界的代码执行SMC指令时,CPU会立即从非安全世界切换到安全世界的EL3级别
- Secure Monitor(安全监控器)会处理这个请求,然后转发给TEE内核
- 处理完成后,再切换回非安全世界,返回结果
2. 完整的CA-TA调用流程(逐步骤)
这是TEE中最基础也最重要的流程,所有TEE操作都基于这个模型:
[非安全世界] [安全世界] CA | v TEE客户端API(libteec) | v TEE内核驱动(tee.ko) | v SMC指令 → EL3 Secure Monitor | v TEE内核(optee_os) | v 加载并验证TA签名 | v 创建TA进程上下文 | v 执行TA的入口函数 | v 处理请求并返回结果 | v 销毁TA上下文(或保留) | v SMC返回 → 切换回非安全世界 | v TEE内核驱动 | v libteec | v CA
3. 关键概念辨析:同步调用 vs 异步调用
- 同步调用:CA发送请求后阻塞等待,直到TA返回结果。这是最常用的调用方式,适合大多数安全操作。
- 异步调用:CA发送请求后立即返回,TA处理完成后通过回调通知CA。适合耗时较长的操作(如大文件加密)。
二、TEE的内部组件详解
一个完整的TEE-OS由以下四个层级的组件构成,从底层到上层依次为:
1. 安全监控器(Secure Monitor)
- 处理所有SMC调用,负责两个世界之间的切换
- 管理安全中断和非安全中断的路由
- 保护EL3级别的硬件资源(如efuse控制器)
- 特点:代码量极小(通常只有几千行),逻辑极其简单,攻击面最小
- MTK平台注意点:MTK的Secure Monitor由Preloader初始化,闭源不可修改
2. TEE内核
- 管理安全世界的内存(TZRAM)
- 线程调度与进程管理
- 驱动硬件安全引擎(AES、SHA、RSA等)
- 加载、验证和运行可信应用(TA)
- 提供系统调用接口给TA使用
- 核心模块:
- 内存管理单元(MMU)
- 线程调度器
- 驱动框架
- 加密服务框架
- TA管理框架
- 安全存储服务
3. 可信应用(Trusted Application, TA)
- 运行级别:安全世界EL0
- 核心定义:运行在TEE中的专用程序,执行具体的安全任务
- 生命周期:
- 加载:TEE内核收到CA的请求后,从存储介质读取TA镜像
- 验证:验证TA的数字签名,确保是厂商官方发布的
- 初始化:创建TA的地址空间和线程上下文
- 运行:执行TA的入口函数,处理CA的请求
- 销毁:处理完成后,销毁TA的上下文,释放资源
- 重要特性:
- 每个TA都运行在独立的沙箱中,互相隔离
- TA只能访问自己被授权的资源
- TA崩溃不会影响TEE内核和其他TA
4. 客户端应用(Client Application, CA)
- 运行级别:非安全世界EL0
- 核心定义:运行在Android系统中的普通应用,是TEE服务的使用者
- 职责:
- 初始化与TEE的连接
- 打开指定的TA会话
- 向TA发送请求并接收结果
- 关闭会话并释放资源
三、TEE的四大关键安全机制
这四个机制是TEE安全的核心支柱,所有TEE的安全能力都建立在它们之上。
1. 安全启动(Secure Boot)
核心原理:从硬件根信任开始,建立一条完整的信任链,确保只有经过厂商签名的代码才能运行。
MTK平台信任链:
芯片内置ROM(根信任) ↓ 验证签名 Preloader ↓ 验证签名 LK + TEE内核 ↓ 验证签名 Linux内核 ↓ 验证签名 Android系统镜像
重要性:安全启动是TEE安全的前提。如果安全启动被关闭,攻击者可以刷入一个恶意的TEE镜像,整个TEE的安全就不复存在。
2. 安全存储(Secure Storage)
核心问题:如何安全地存储敏感数据,即使攻击者获得了整个系统的控制权,也无法读取这些数据?
TEE安全存储的实现原理:
- 每个设备都有一个唯一的硬件根密钥(HUK),烧录在efuse中,无法读取
- 敏感数据在存储前,会用HUK派生的密钥进行加密
- 加密后的数据存储在普通的文件系统中(如/data/tee/)
- 只有TEE内核才能访问HUK,也只有TEE内核才能解密这些数据
特点:
- 数据与设备绑定,即使把存储芯片拆下来放到其他设备上,也无法解密
- 即使攻击者获得了Android系统的root权限,也无法解密TEE的安全存储数据
3. RPMB分区
全称:Replay Protected Memory Block(重放保护内存块)
- 物理位置:eMMC/UFS闪存中的一个特殊分区
- 核心特性:
- 只有TEE内核才能访问,非安全世界无法直接读写
- 内置计数器,防止重放攻击
- 数据写入后具有原子性,不会因断电损坏
- 存储OTA升级包的哈希值
- 存储安全启动的状态
- 存储设备的唯一标识
- 存储指纹模板的哈希值
4. eFuse(一次性可编程存储器)
- 物理特性:芯片中的一组熔丝,只能被编程一次,一旦烧录就无法修改
- 典型用途:
- 存储硬件根密钥(HUK)
- 存储设备的唯一ID
- 存储安全启动的公钥哈希
- 标记设备是否被root过
- 重要性:efuse是整个系统的根信任源,所有的安全机制最终都依赖于efuse中的数据。
四、GlobalPlatform TEE标准
GlobalPlatform(GP)是TEE行业的标准制定组织,所有主流的TEE-OS(包括OP-TEE、Trustonic、QSEE)都兼容GP标准。
1. 标准的核心内容
GP TEE标准分为四个部分:
- 系统架构规范:定义TEE的整体架构和组件
- 内部API规范:定义TA调用TEE内核服务的接口
- 客户端API规范:定义CA调用TEE服务的接口
- 安全功能规范:定义安全存储、加密、时间等服务的标准
2. 核心API分类
API类型 | 作用 |
TEE Client API | CA与TEE通信的接口,如TEEC_InitializeContext、TEEC_OpenSession |
TEE Internal Core API | TA的基础功能接口,如内存管理、线程管理 |
TEE Cryptographic API | 加密服务接口,如AES加密、RSA签名、哈希计算 |
TEE Storage API | 安全存储接口,如TEE_CreatePersistentObject |
TEE Time API | 时间服务接口 |
3. 安全级别划分
GP标准定义了两个安全级别:
- TEE Security Level 1:软件级安全,抵抗纯软件攻击
- TEE Security Level 2:硬件级安全,抵抗物理攻击和侧信道攻击
目前所有主流手机的TEE都达到了Security Level 2。
五、核心概念总结
一句话核心概念总结
- TEE:运行在CPU硬件隔离空间中的独立操作系统,提供比Android更高的安全级别
- REE:运行Android/Linux的富执行环境,与TEE硬件隔离
- SMC:两个世界之间通信的唯一网关指令
- Secure Monitor:运行在EL3的安全监控器,处理SMC调用
- CA:运行在Android中的普通应用,使用TEE服务
- TA:运行在TEE中的可信应用,执行具体的安全任务
- 安全启动:从硬件根信任开始的完整信任链
- 安全存储:用硬件根密钥加密的持久化存储
- RPMB:eMMC中的特殊分区,只有TEE才能访问
- eFuse:一次性可编程存储器,存储系统的根信任