参考书籍:《手机安全和可信应用开发指南》
参考博客:TEE原理及应用举例
参考规范:GPD TEE API Specification合集下载
官方规范文档地址
REE(Rich Execution Environment)富执行环境
是指移动端系统的运行环境,运行的系统称为Rich OS(Rich Operating System),如常见的Android、iOS操作系统。
REE 是一个开放的环境,容易受到恶意软件的攻击,比如 敏感数据被窃取、数字版权被滥用、移动支付被盗用
等。因此,2010年7月 GP(Global Platform,全球平台组织)提出了 TEE (Trusted Execution Environment) 可信执行环境
的设计。
例如:Trusty,就是 Google 基于 ARM 架构的 Trustzone 技术实现的一套运行环境,通过硬件和系统软件层面的隔离,实现 normal world和secure world,也就是 REE和TEE 。Trustzone 从 ARM-v6 即开始支持,且在 ARM-v8 上增强了secure mode
,TrustZone 技术能提供芯片级别对硬件资源的保护和隔离,当前在手机芯片领域已被广泛应用。而Google也规定从 Android M 版本以后所有的 人脸、指纹、虹膜识别 的隐私数据都需要使用TEE环境进行安全保护,否则无法通过Google的 CTS认证授权。
TEE 是一个与 REE 并存运行的独立执行环境,它具有自身完全可信的执行空间,即使设备被 root 也依旧安全,它可以访问设备主处理器和内存的全部功能,但完全隔离。Trusted OS 比 Rich OS 的安全级别更高,因此为Rich OS提供安全服务,如 指纹的录入比对、支付校验认证 等操作。
OP-TEE 由非营利的开源软件工程公司 Linaro 按照 GP规范 开发,所有源代码均可在 Github 上下载到。支持 QEMU、Hikey(Linaro推广的96Board系列平台之一,使用Hisilicon处理器)以及其他通用的 ARMv7/ARMv8 平台,开发环境搭建方便,便于开发者开发自有的 上层可信应用 ,且OP-TEE提供了完整的 SDK ,方便编译 TA和CA 。
OP-TEE 遵循 GP规范 ,支持各种 加解密和电子签名验签算法 以便实现 DRM、在线支付、指纹和虹膜识别 功能。OP-TEE 也支持在芯片中集成第三方的硬件加解密算法。除此之外,在 IoT和车载芯片 领域也大都使用 OP-TEE 作为TEE解决方案。
术语 | 全称 | 解释
----- | ---------------------------- | ---------------
REE | Rich Execution Environment | 富执行环境
TEE | Trusted Execution Environment | 可信任执行环境
GP | Global Platform | 全球平台组织
SE | Secure Element |
Client | 指REE端 |
Trusty | 指TEE端 |
CA | Client Application | 运行在REE上的应用程序
TA | Trusted Application | 运行在TEE上的应用程序
UUID | Universally Unique Identifier | TA的通用唯一身份标识符
CA 与 TA 交互规范中的名词概念:
Contexts | 上下文 | CA与TA连接使用的上下文,用于打开会话,TEEC_InitializeContext
Session | 会话 | 发送命令的通道,TEEC_OpenSession
Commands | 命令 | 通过指定命令ID,CA向TA发送实际指令
Share Memroy | 共享内存 | CA和TEE之间数据交互的区域
Memory References | 共享内存区 | 固定范围的共享内存块
UUID | 通用唯一身份标识 | TA的身份标识ID,用于CA调用某TA时,TEE通过UUID启动某TA镜像
Panic |
Task |
Command Identifier | 命令标识符,一个32位的整型数
Single Instance Trusted Application | 单实例运行环境
Multi Instance Trusted Application | 多实例运行环境
加解密或摘要算法:
CMAC | Cipher-based Message Authentication Code
HMAC | Hash-based Message Authentication Code
AE | Authenticated Encryption
AES | Advanced Encryption Standard
DES | Data Encryption Standard
RSA | Rivest,Shamir,Adleman asymmetric algorithm
MD5 | Message Digest 5
SHA | Secure Hash Algorithm
CA 即执行在 REE 中的 普通应用程序,TA 则是执行在 TEE 中的 完全被信任安全程序。涉及到安全方面的操作时(如:人脸比对、指纹校验),CA就需要与TA交互,从TA中获取到结果。
CA(Client Application)对应 REE 层应用,比如指纹采集、支付能力等,通过调用 TEE Client API 实现与 TA 进行交互。CA通过接口让TA完成工作,完成对应功能然后返回计算结果,CA不需关心计算过程。
REE Communication Agent 为TA和CA之间的消息传递提供了REE支持
TEE Client API 是REE中的TEE驱动程序提供给外部的接口,用于 CA 与 TA 交互。
TA(Trusted Application)是TEE中完成特定功能的应用。由于TEE中完成计算因此具有较高的安全性。每一个TA在REE中有一个或者多个对应的CA。TEE Internal Core API 则是TA侧的接口。
TEE Communication Agent 是可信操作系统的特殊组成部分,它与REE Communication Agent 一起工作,保证TA与CA之间传输消息的安全。
TEE Internal Core API 是TEE系统提供给TA调用的内部接口,包括密码学算法,内存管理等功能。
Trusted Device Drivers 可信设备驱动程序,为专用于TEE的可信外设提供通信接口。
Shared Memory 是一块只有CA和TA可以访问的一块安全内存,CA和TA通过共享内存来快速有效传输指令和数据
下面是TEE的软件交互流程,使用GlobalPlatform组织定义的 GP API 接口。
CA与TA通信需要使用下列接口完成整个会话流程:
TEEC_InitializeContext / TEEC_FinalizeContext:
对变量Context进行初始化和释放,用来建立和结束CA和TEE的联系,向TEE申请共享内存地址用于存放数据。
TEEC_OpenSession / TEEC_CloseSession:
建立和关闭一个CA和TA间的session,用于CA和UUID指定的TA进行通信,是CA连接TA的起始点和终点。
TEEC_InvokeCommand:
依靠打开的session,将传送命令请求给TA,并将必要的指令执行参数一并发送给TA。
TEEC_RegisterSharedMemory / TEEC_ReleaseSharedMemory:
TEEC_AllocateSharedMemory / TEEC_ReleaseSharedMemory:
同样是申请共享内存缓冲区,为更接近实现 零拷贝数据传输,TEEC_AllocateSharedMemory 是首选,其次才是 TEEC_RegisterSharedMemory。共享内存是由 REE 拥有 并映射到 TEE 内存空间的内存。
TA_CreateEntryPoint:为CA建立接入点,使得TA可以被CA调用。
TA_DestroyEntryPoint:移除CA的接入点,结束TA的功能。
TA_OpenSessionEntryPoint:建立CA与TA之间的通讯通道,作为CA连接TA的起点。
TA_CloseSessionEntryPoint:关闭CA与TA的通讯通道
TA_InvokeCommandEntryPoint:接收CA传送的指令和参数,并在这TEE侧执行。
在 GP 标准中,CA 要与 TA 进行通信,需要建立如下所示的软件逻辑流程:
1)首先CA 需要与 Trusted OS 之间建立一个 Context,以后此 CA 与 TEE 环境的所有通信均基于此 Context。
2)然后 CA 会向 Trusted OS 申请与请求的 TA 建立一个 Session。
3)CA 与 TA 之间的 Session 建立完成后,CA 就可以向 TA 发送 Commands。
4)Commands 及其参数会通过共享内存的方式传递,TA 从共享内存中获取到 CA 的请求以及请求参数。
5)TA 在 TEE 环境下执行处理,得到的处理结果重新填充到共享内存中,CA 通过共享内存就可以获取到处理结果。
6)获得处理结果后,如不需要进一步请求,则由 CA 发起关闭 Session 的请求,Trusted OS 回收 TA 相关资源,最后 CA 发起销毁 Context 的请求,完成一次完整交互。
CA 通过调用 TEE Client API 触发系统调用,进入 REE 的操作系统内核态,系统根据 CA 的入参来找到需要执行的 REE 驱动程序,REE驱动程序通过 SMC (secure monitor call,安全监控模式调用) 汇编指令进入 Monitor模式,并修改 安全状态读写信号位(Non-secure bit,NS bit)将CPU切换到安全内核状态(改变寄存器最后1bit为0,1为非安全),进入 secure world。
切换到 TEE 后,CA 的服务请求通过 Binder 传到TEE侧,然后 TEE OS 通过 TEE Internal API 拉起对应的 TA,TA 运行结束后将结果和数据返回给 CA 。执行完后回到 TEE内核态,再通过 SMC 汇编指令进入 Monitor 切换到 REE 环境。