RPMB全称Replay Protected Memory Block, 重放保护存储块,用于存放一些重要的安全信息,eMMC和UFS都有这一区域.
RPMB防重放攻击的原理:
有两个条件决定了这一块内容具有这样的特性, 一是访问这一区域的数据需要获得授权, 二是有一个计数器记录每一次访问动作.
关于第一点, 如何给予和获得授权呢?
就需要在使用这一块区域之前, 预先烧写一把key进去, 那这把key就是RPMB key.
有了这把key, 在之后访问RPMB区域的时候, 都要用这把key生成Message Authentication Code(MAC), 用来鉴定授权,鉴权过程通常是TEE中使用每次开机生成的RPMB key得到MAC值和EMMC RPMB本身根据写入的RPMB key生成的MAC值做compare.
更多详细信息可以参考spec:eMMC 5.1 spec文档JESD84-B50-1.pdf, UFS 2.1 spec文档JESD220C.pdf
目前在mtk平台, 这把key的生成规则有两种, 一是common key, 另一种是per device key.
使用哪一种规则, 取决于是否开启宏RPMB_PER_DEVICE_KEY
Common key的内容可以在文件rpmb_cust_key.h中修改
Per device key的内容根据CPU的HRID生成, 会使得每一台机器的RPMB key都不同. 这样有一个结果是, 如果更换了CPU, 也要同时更换FLASH, 否则会无法访问RPMB区域.
3. How to program RPMB key?
那如何将这把RPMB key预先烧录到RPMB相应的寄存器中呢?
3.1 默认的方案, 如果有开宏CFG_TEE_SUPPORT && CFG_RPMB_SET_KEY, 会在第一次开机preloader阶段自动烧写.
但是由于per device key的CPU与FLASH绑定特性, 会造成工厂的维修成本增加, 所以提供了一种手动触发烧写RPMB key的方案.
3.2 在kernel阶段, 可以通过TEE, 在基本测试结束后手动触发. 详细信息可以参考文档MTK RPMB External User Guide_Android N.docx
- FAQ
Q: RPMB key可以重复写吗?
A: 不可以, 只能写一次且不能更改
Q: 可以不写RPMB key吗?
A: 如果要用RPMB这个分区, 就一定要写这把key
Q: RPMB分区中的内容可以重复写吗?
A: 可以. RPMB分区不可以擦除, 但可以覆盖