关于TEE,你需要知道的五大要素

原创 精选
移动开发 移动应用
现在手机已经成为我们每个人生活的必需品,那安卓手机的安全就成为了最为重要的一部分。

我们通常提到的安卓手机不仅仅只有安卓系统,还有与安全息息相关的TEE系统,当然除了这两个系统之外,还会有其他系统,在此我仅仅阐述TEE与安卓是如何并存的,先向大家介绍下这两个系统如何部署,紧接着从SMC调度和通信方式,库的角度来分别说明两个系统的通信机制,最后为大家简单说明一下TEE API的GP标准。

1.TEE和安卓架构

首先,我们从整体大方向上,先看一下安卓系统和TEE系统是如何并存的。如下图 1 TEE和安卓系统并存架构所示:

图 1 TEE和安卓系统并存架构

上图中的左半部分非安全侧(Non-secure)就是大家熟悉的安卓系统,通常我们称之为REE,右半部分安全侧(Secure)就是TEE系统,目前市场上存在多种TEE系统,如高通的QSEE,Trustonic,开源的OPTEE等。

图中的EL0,EL1,EL3是ARM架构中的异常等级,其中EL0和EL1是必须实现的,可以粗略的认为EL0是应用层,EL1是系统内核层,其中最重要的是REE侧EL1中需要部署TEE相关驱动,REE侧最后是通过该驱动,同后面提到的EL3进行通信,进而完成一些功能的。EL2主要提供对虚拟化的支持,在本文中先忽略EL2。EL3是比较重要的部分,提供了REE侧(Non-secure)和安全侧(Secure)的功能切换。从图中也可以看出,只有EL3横跨REE侧和安全侧,从而为这两个系统提供了通信的接口,比如我们常用的指纹功能和支付功能就需要REE侧和安全侧交互的,后面内容中我会给大家具体阐述两个系统的通信。

在ARM提供的Trustzone白皮书中有提到,为了使系统更加健壮,建议EL3中的Monitor模式在执行时,关闭中断。

2.SMC

在此我首先强调一点,TEE系统和安卓系统是两个完全独立的系统,这两个系统独立运行。但在实际实用中,这两个系统需要进行通信,比如我们手机锁屏或者使用指纹进行解锁时,均需要安卓系统和TEE系统共同配合完成,其通信是通过SMC指令来完成的,其本质上就是触发一个SMC的中断(如下图2中红色框中所示),从而让安卓或者TEE跳转到Monitor模式(下图中的Monitor/Firmware),而SMC的中断处理类似于系统中的上下文切换。

图 2 环境切换

至此大家应该对SMC有了简单的认识,但在此我需要明确一点,进入Monitor模式并非只有SMC一种方式,比如直接写寄存器CPSR等。

3. REE/TEE传输方式

上面简单说明了SMC,那当REE和TEE侧要进行数据传输时,又该如何处理呢?在现有的处理方案中采用了共享内存,包括静态的共享内存和动态的共享内存。由于静态的共享内存是REE侧和TEE侧约定好的一块共享内存,不管是否需要,都会预留一块区域,比较浪费内存。动态共享内存,操作步骤较复杂,需要我们先申请内存,再进行mmap映射(TEE侧和REE侧都需要进行映射)),然后通过共享内存进行数据传输。

那大家再思考一个问题, TEE侧传输数据到REE侧和REE侧传输数据到TEE侧时,其共享内存分别是由谁申请的?解答此问题前,我需要引入一个Session的名词,TEE侧和REE侧通信前都需要建立一个Session,在REE侧建立Session时,共享内存就准备好了,之后不管数据是从哪边传递到哪边,均使用的是之前已经准备好的共享内存。

大家有机会看CA(REE侧的一个可执行程序)的代码,会发现都会先建立Session,之后就可以进行响应的业务处理。目前市场有不同的TEE厂商,他们实现细节会存在一些差异,但其思路都是一致的。

4. 库

一般TEE厂家会给我们提供TEE相关的库,这个库里面会通过调用TEE对应驱动进而完成各项功能。通常在开发需要TEE环境的程序时,最好可以找对应TEE厂家索要Demo,有这个Demo后,我们就知道该如何基于对应的TEE进行程序开发。

5.GP

我在同一些从事安卓的朋友交流时,发现他们要么是不知道TEE,要么是知道TEE,但不知道GP。试想一下,市场上存在很多TEE厂商,比如我们熟悉的豆荚,Trustonic等,每一家都有他们独有的API接口,那对于一些基于TEE的功能,如指纹,支付等,那是不是需要针对每一个TEE,要进行不同的适配?而GP全称是Global Platform,它提供了一些安全相关的API要求,假如所有项目上均采用GP的方式,那基于TEE的模块(如常见的指纹,支付等),就无需做很大的改动,且在同这类供应商沟通时,需要告知供应商,当前项目上是否采用GP接口的方式。

总结

至此,我已经介绍了我们需要知道的五大要素,此时,我们来思考一下,假如我的项目上需要增加指纹功能,我需要做什么工作呢?

  • TEE环境的部署,包含TEE系统本身,Monitor, REE侧同TEE相关的驱动,库等,其他的细节可以同TEE供应商沟通。
  • 同指纹厂商沟通,告知其项目上使用的TEE系统和TEE版本是否采用GP接口,项目上采用的指纹器件型号等。

本文中,我把TEE拆分为五要素,但实际上,TEE系统远比本文介绍的要复杂,希望大家可以通过本文对TEE有一个大框架的认识,在此基础上,可以继续深入研究。

作者介绍

赵青窕,51CTO社区编辑,从事多年驱动开发。研究兴趣包含安全OS和网络安全领域,发表过网络相关专利。

责任编辑:华轩 来源: 51CTO
相关推荐

2010-05-06 08:55:23

ADO.NET

2010-01-06 15:26:14

JSON语法

2018-12-27 14:21:31

https安全http

2019-11-15 14:00:39

HTTPSHTTP前端

2018-12-28 14:16:11

安全

2015-03-03 10:41:43

2013-09-03 09:18:55

云计算混合云

2011-05-06 08:41:33

UI设计应用程序iPad

2013-08-01 10:38:22

2012-01-03 19:09:42

移动应用

2014-07-31 17:13:50

编码程序员

2023-01-30 11:43:04

开源代码

2015-06-30 10:59:22

MobileWeb适配

2023-02-10 08:44:05

KafkaLinkedIn模式

2010-07-26 14:18:08

数据中心能效管理

2017-03-28 15:47:17

数据治理数据库

2018-05-16 09:41:13

神经网络NN函数

2023-10-16 13:36:00

边缘计算数据

2013-12-02 14:07:02

Hadoop大数据集群

2020-05-07 10:14:00

企业架构师CIOIT网络
点赞
收藏

51CTO技术栈公众号