GP TEE中的几种存储方式介绍

转载:https://cloud.tencent.com/developer/article/1043705

我们知道TEEOS最重要的功能莫过于安全存储了,这是一切安全的前提,根据存储安全性和使用场景GP TEE安全存储分为RPMB安全存储、SFS安全存储和SQLFS安全存储。如下图所示,临时对象、持久化对象、持久化枚举、数据流,分别可以存储在RPMB、SFS、SQLFS三种存储媒介上。

GP TEE中的几种存储方式介绍_第1张图片

RPMB(Replay Protected Memory Block),作用在于存放机密数据。由于访问需要密钥,所以可以防止未授权的访问并且在每次的数据写入时都需要验证Write Counter寄存器值,这个寄存器值每写入成功便会加1,如果是黑客截取写入报文再进行重放攻击,由于counter已经更新了写入会无效。系统开机时在preloader阶段写入RPMB鉴权密钥,为保证密钥的安全性和保密密钥的分散方法,密钥一般由TEEOS提供库接口获取,在preloader跳入ATF执行时把密钥以参数传递方式放入安全SRAM,在TEEOS启动再将该密钥拷贝到安全DRAM中用于后续的RPMB操作。RPMB特点是非安全世界不可见,使用场景是安全性要求高、容量小,可以有效防止回滚和重放攻击。

一个SFS安全存储对象在Linux/Android端会生成多个文件,数据块文件和对应的meta文件,SFS特点是非安全世界可见,无法有效防止回滚,但可以同时在SFS和RPMB中写入读写次数检测回滚。使用场景是安全性要求略低、容量大。

SQLFS机制与SFS类似,由Android侧提供SQLITE数据库操作接口,一个安全存储对象在Linux/Android下只会生成单个文件,文件会比SFS少,并且SQLITE本身会支持到数据库的原子性操作和容错机制。特点是非安全世界可见,使用场景是安全性要求略低、容量大。

GP TEE中可信存储定义

每个TA可以访问一组可信存储空间,由32位存储标识符标识。 目前GP版本的规范定义了一个信任存储空间对于每个TA,是自己的私有存储空间。这个存储空间的对象只能是生成对象的TA所访问,其他TA是不可见的。其他存储标识符可以定义在规范的未来版本中,例如: 存储空间共享于多个TA或用于启动实体和运行时TA之间的通讯。 一个可信存储空间包含持久化对象。这个持久化对象可以是加密密钥对象或者是数据对象。每个持久对象由对象标识符识别,这是一个变长二进制缓冲区从0到64字节。对象标识符包含任意字节,包括对应于非输出字符的字节。 每个持久化对象都有一个类型,它精确地定义了对象的内容。例如,有对象类型为AES钥匙,RSA密钥对,数据对象,等等。

所有持久化对象都有一个相关的数据流。数据对象只有一个数据流。加密对象(即密钥或密钥对)有一个数据流,对象属性和元数据。

数据流是完全在TA内存空间管理。当打开一个持久化对象时它可以加载一个TA-allocated缓冲区或者当创建一个持久化对象时从TA-allocated缓冲区存储数据。它也可以当做一个数据流来访问,所以它可以用来存储由小块访问方式的大量数据。 对象属性用于少量的数据(通常几十或几百个字节)。他们可以存储在一个内存池, 与TA实例和TA自身需要隐藏的一些属性相隔离。属性用于存储结构化的方式的密钥数据。比如,一个RSA密钥对模数(N),公钥(E),私钥(D)等。当一个对象被创建,它的所有对象属性已指定。 另外 ,API的实现可以允许储存比可见属性更多的信息在对象里。 与每个加密对象相关联的元数据包括:密钥长度。取决于算法的关键。例如,AES的密钥可以有128位、192位或256位,RSA密钥可以有1024位或2048位等 密钥使用标识符,定义是否允许操作密钥,或TA能否重新获取这个密钥敏感部分信息 TA同样也可以申请临时对象,与可持久化对象区别如下 临时对象保持在内存里,当对象关闭或TA实例销毁时这些内存自动清除和回收。临时对象只包含有属性而没有数据流。 一个临时对象可以是未被初始化,在这种情况下这个对象分配了一个特定对象类型和最大空间但没有属性,只有属性被填充时对象才是初始化的。可持久化对象都是创建时初始化的。这就意味着TA生成或获取一个持久化的密钥对象需要先申请一个临时对象,再把属性写入临时对象再放入到可持久化对象中。 临时对象没有标识符,只能通过对象句柄来操作。 一般情况下,临时对象都是用于密钥和密钥对。 临时对象和可持久化对象都是通过不透明的对象句柄来操作的。 一些函数接口接受两种类型的对象句柄,比如填充对象的属性只能用临时对象,因为它需要一个未初始化的对象,持久对象总是完全初始化。 类似于文件操作的API函数访问数据流只能用可持久化对象,因为临时对象没有数据流。

弄清楚了以上这些,你才更方便的操作TEE的接口函数!

关于防攻击

防克隆

为防止对数据从一个设备克隆到另一个设备,需要硬件上支持一机一密和OTP方式的唯一TEE ID,在HUK上保证每个有设备的密钥都是唯一的,在数据克隆到另一个设备上,由于HUK不一致,SSK也就不一样,SSK生成的TSK也会不一致,这样数据才可以防克隆。

防回滚

SFS和SQL FS在Android侧是可见的,在root后可以对生成的文件进行拷贝和备份下来,当后续这些文件更新后,攻击者可以把最新的这些文件用之前的备份文件替换掉,这样文件就被回滚回去以达到攻击者目的。这样的回滚是无法被防止的,只能借助于RPMB分区的防回滚机制检测到这样的回滚攻击,在SFS和SQL FS的文件与RPMB同步更新读写次数,不一致则表示被回滚了。

HUK (Hardware Unique Key) 硬件唯一密钥

SSK (Secure Storage Key) 安全存储密钥

TSK(Trusted app Storage Key) 可信应用存储密钥

FEK (File Encryption Key) 文件加密密钥

你可能感兴趣的:(TEE)