RPMB(Replay Protected Memory Block)是 eMMC / UFS 中带认证和单调计数器的小型安全存储区域,用来防止攻击者把旧版本数据重新写回设备以回滚安全状态。
它常用于保存很小但安全敏感的状态,例如安全启动计数器、TEE 相关状态、密钥派生绑定信息或防回滚版本号。
核心问题
普通存储可以被复制和回写。攻击者如果能拿到旧镜像,可能把设备状态回滚到旧版本:
- 把安全补丁后的状态回滚到漏洞版本。
- 把失败次数、锁定状态或版本计数器恢复到旧值。
- 用旧的授权状态绕过新策略。
RPMB 的目标不是加密大容量数据,而是让小块状态具备认证写入和防回放能力。
核心对象
| 对象 | 含义 | 工程关注点 |
|---|---|---|
| RPMB key | 设备内写入的认证密钥 | 通常一次性烧录,不能读出,写错可能不可恢复 |
| write counter | 单调递增计数器 | 防止旧写请求被重放 |
| data frame | RPMB 读写帧 | 地址、数据、nonce、MAC、计数器 |
| MAC | 消息认证码 | 验证请求来自持有密钥的一方 |
| nonce | 一次性随机数 | 防止读取响应被复用 |
| trusted software | 持有或派生 RPMB 访问能力的软件 | TEE、bootloader、安全服务 |
核心机制
RPMB 写入通常需要认证帧:
MAC = HMAC(key, address || data || write_counter || nonce)key是 RPMB 认证密钥,写入设备后通常不可读出。address是 RPMB 内部块地址。data是要写入的小块数据。write_counter是设备维护的单调计数器。nonce是本次请求相关的随机数或挑战。HMAC是基于密钥的消息认证码,用来证明请求没有被篡改且来自持有密钥的一方。
设备验证 MAC 和计数器后才接受写入,并递增计数器。攻击者即使保存了旧帧,也无法让旧计数器重新通过验证。
工程用途
- 存放安全启动和 OTA 防回滚状态。
- 给 TEE 或安全服务提供小容量可信状态存储。
- 绑定设备身份、密钥使用状态或授权计数器。
- 防止简单镜像回滚攻击。
工程上要明确 RPMB 密钥烧录时机、密钥来源、是否每台设备唯一、访问权限在哪个启动阶段建立,以及失败设备如何处置。
边界与常见坑
- RPMB 不是大容量加密盘:容量小、访问慢,适合小状态,不适合日志或普通数据。
- RPMB 密钥通常不能重置:烧错密钥可能导致该区域永久不可用。
- RPMB 不自动保护 user area:它只能保护 RPMB 内的数据和计数语义,普通分区仍需文件系统、加密或签名保护。
- 防回放不等于防篡改全部系统:启动链、TEE、密钥管理和访问控制仍要正确。
- 计数器有寿命和协议限制:不能把 RPMB 当高频计数数据库使用。