RPMB
Preface
RPMB的全称叫做Replay Protected Memory Block,它主要的作用是防止对数据进行非法篡改,特别是通过replay的方式来篡改数据。另外RPMB的机制也保证了数据的完整性(integrity)和正确性(authenticity)。这些特性也是secureity的一部分,也是为什么把RPMB放在security category的原因。本文就来解析下它是怎么工作的。
A Replay Protected Memory Block (RPMB) is provided as a means for a system to store data to the specific memory area in an authenticated and replay protected manner and can only be read and written via successfully authenticated read and write accesses.
Mechanism of RPMB
RPMB目前主要用于数据存贮,主流的的存储设备如eMMC,UFS和NVME都支持RPMB。RPMB是这些存储设备从物理上单独分割出来的一块存储区域,它由以下几部分构成:
- 一块OTP来存储authentication key
一般为32B大小。 - 单向计数器叫做write counter 也是32B,出厂一般为0,最大到0xFFFFFFFF。
- RPBM数据存储区
如上所述,独立的物理分区,只能通过RPMB的命令来读取和写入。 - MAC模块 一般为HMAC-SHA256计算模块
接下来通过几个操作来看RPMB是怎样通过这几个组成部分达成目标的。
Authentication Key
Generation
严格来说,authentication key的生成不算RPMB的硬件特性,但它是RPMB安全特性的保障。前几天的博文写了RoT,把authentication key说成RPMB的RoT也不为过。在整个嵌入式系统中,它可以说是RoT系统衍生出的trusted chain的延续。请注意加粗的这句话,既然这样,这个key自然要从RoT衍生出来。如Keys of RoT所述,它属于内部key,最安全的方法是从RoT模块的TRNG出厂时生成并保存的随机根密码通过固定算法(保证每次使用都能拿到相同的key)衍生出来。
Program
把生成的key写入RPMB的OTP中也需要在机密环境中进行,比如在工厂生产时。这是因为大多数RPMB的driver都运行在REE环境中,写入的过程,该key会出现在REE中。当然也可以实现TEE中运行的RPMB driver,这就需要额外的effort了。这个key program后,最好提供TEE的接口可以查询是否写入(比如RoT的NVM/OTP中保存flag),这是为了防止该key的二次泄露,最典型的是OPTEE中如果TEE判断该key没有program,会再次发起写入操作,导致key在REE中泄露。
Read
上图中博主把HMAC的计算放在了RoT中,这样做的目的是遵循拿到密钥的范围越小越安全原则。毕竟有相当一部分case中RoT的开发是不开放的,而TEE OS开发可能是开放的,这样TEE OS的开发者是可以拿到这个key的。
在OPTEE中,HMAC的计算就是由OPTEE OS来做的,所以RPMB authentication key在OPTEE中存了一份。由于OPTEE是开源软件,很多时候会开放给下游厂商开发。博主认为这不是一种安全的处理方法。
Write
Write中一个重要的步骤就是拿到rpmb端单向递增的write counter。本质上它是个读操作,流程很类似。如下:
拿到write counter后开始写数据。
这里需要注意的是,因为读写操作一方面存在send request和get response两部分操作,另外还可能读写多个block,为了保持这些操作的原子性,Linux提供了MMC_IOC_MULTI_CMD来一次执行多个命令以防止同步问题出现。
Deep Dive
通过上面的流程可知:
- key的注入机密性很重要
- 写入机制保证了只有拥有authentication key的host才能执行write操作
- 读取的机制保证用户拿到数据的真实性和完整性
由于系统运行工程中,RPMB所属设备的驱动一般运行在REE world,RPMB的读取和写入操作一般都要回到REE中进行,这样数据的机密性就得不到保证(program key也是一次写入操作,但只在工厂执行一次,这里不需要考虑),解决的方法也很直接,对数据进行加密就行了。具体操作:
- 写入数据首先用RoT中的密钥(衍生密钥)进行加密,然后根据RPMB机制拿到write counter并用auth key计算MAC,最后把数据包返回到REE driver中写入设备。
- 读取时REE driver把data从设备取出,放在TEE环境中,auth通过后再进行解密。
通过加密数据,RPMB实现了数据的机密性,完整性和真实性。RPMB在很多嵌入式设备中用做Secure Storage。