4

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

 2 years ago
source link: https://www.51cto.com/article/707139.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
关于TEE,你需要知道的五大要素-51CTO.COM
关于TEE,你需要知道的五大要素 原创
作者:赵青窕 2022-04-22 08:00:00
现在手机已经成为我们每个人生活的必需品,那安卓手机的安全就成为了最为重要的一部分。

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

1.TEE和安卓架构

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

095dfd146b5cd1c47134084bd9b560ae5348eb.png

图 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的中断处理类似于系统中的上下文切换。

14e347307fb83f52ae11876f6a7436f978249a.png

图 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厂商,他们实现细节会存在一些差异,但其思路都是一致的。

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

我在同一些从事安卓的朋友交流时,发现他们要么是不知道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和网络安全领域,发表过网络相关专利。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK