3. 回滚保护概述
在嵌入式安全启动体系中,BootROM 是信任链的根。它负责在芯片上电后第一时间校验并加载下一级固件,因此 BootROM 所信任的“版本策略”直接决定了设备能否抵御回滚攻击(Rollback Attack)。回滚保护并不是简单地“禁止降级”,而是围绕版本号、防回滚计数器、签名校验和策略存储构建的一整套安全机制。理解回滚攻击的本质,是设计 BootROM 回滚保护方案的第一步。
一、回滚攻击的定义
回滚攻击是指攻击者将设备固件、配置或安全策略替换为旧版本,从而利用旧版本中已修复的漏洞、已撤销的密钥或已放宽的权限,重新获得对设备的控制能力。它的核心不是“伪造新固件”,而是“让设备接受一个本应被淘汰的旧固件”。
从信任链角度看,回滚攻击破坏的是“版本单调递增”这一隐含假设。BootROM 如果只校验签名是否合法,而不校验版本是否低于当前安全基线,那么一个签名合法但存在漏洞的旧固件仍然可以通过校验并运行。
关键区别:普通篡改攻击需要伪造签名;回滚攻击使用的是厂商自己签发的旧镜像,因此签名校验无法单独防御。
二、回滚攻击的危害
回滚攻击的危害具有隐蔽性和持久性。攻击者一旦成功降级,往往可以重新打开已经关闭的调试接口、恢复已撤销的密钥、绕过新加入的访问控制,甚至利用旧版本中的已知漏洞植入持久化后门。更严重的是,如果回滚发生在 BootROM 阶段,整个信任链的起点都会被污染,后续所有安全机制都可能失效。
- 漏洞复活:旧版本中已修复的 CVE 重新可用。
- 密钥撤销失效:已吊销的签名密钥重新被信任。
- 安全策略降级:调试口、JTAG、串口下载等被重新打开。
- 持久化控制:攻击者可长期驻留,难以通过常规升级清除。
- 合规风险:违反安全认证对版本防回滚的强制要求。
三、常见回滚场景
回滚攻击并不只出现在实验室。在真实产品中,常见场景包括:通过串口或 USB 下载旧固件;利用 OTA 服务器漏洞替换升级包;在双分区 A/B 系统中强制切换到旧分区;通过外部存储卡加载旧配置;以及利用 BootROM 下载模式写入旧镜像。下面这张图展示了回滚攻击在启动链路中的典型位置与保护点。
四、回滚保护的基本原理
回滚保护的基本原理可以概括为:让设备记住“曾经见过的最高安全版本”,并拒绝任何低于该版本的镜像。这个“记忆”必须存放在攻击者难以篡改的位置,通常是 OTP、eFuse 或受保护的 RPMB 分区。BootROM 在加载镜像前,会读取镜像中的安全版本号(SVN,Security Version Number),并与硬件中记录的最小允许版本进行比较。
如果镜像版本低于硬件记录值,BootROM 直接拒绝启动;如果高于或等于,则继续执行签名校验和加载流程。升级时,硬件中的版本记录只能单调递增,不能回退。这样即使攻击者拥有旧版本的合法签名镜像,也无法让设备接受它。
// 伪代码:BootROM 中的回滚校验逻辑
read_image_header(image);
svn_image = image.security_version;
svn_hw = otp_read(ANTI_ROLLBACK_SVN);
if (svn_image < svn_hw) {
secure_fail("ROLLBACK_DETECTED");
halt();
}
if (!verify_signature(image)) {
secure_fail("SIGNATURE_INVALID");
halt();
}
if (svn_image > svn_hw) {
otp_write(ANTI_ROLLBACK_SVN, svn_image); // 单调递增
}
jump_to_image(image);
五、安全目标与设计清单
回滚保护的安全目标不是单一维度,而是需要同时满足完整性、新鲜性和不可逆性。完整性保证镜像未被篡改;新鲜性保证镜像不是旧版本;不可逆性保证版本记录不能被回退。下表列出了回滚保护的核心目标与对应实现手段。
| 安全目标 | 说明 | 典型实现 | 失败后果 |
|---|---|---|---|
| 完整性 | 镜像内容未被篡改 | SHA-256 + RSA/ECDSA 签名 | 任意固件可被替换 |
| 新鲜性 | 镜像版本不低于安全基线 | SVN 版本号比较 | 旧漏洞可被重新利用 |
| 不可逆性 | 版本记录只能递增 | OTP / eFuse 一次性写入 | 攻击者可回退版本记录 |
| 策略一致性 | 多级引导版本策略统一 | 逐级校验 SVN | 某一级被降级绕过 |
| 可恢复性 | 合法升级失败可安全回退 | A/B 分区 + 版本策略 | 设备变砖或被迫降级 |
六、常见误区与复盘
误区一:认为“签名校验通过就安全了”。签名只证明镜像来自厂商,不能证明它是最新版本。
误区二:把版本号放在普通 Flash 中。攻击者可以同时修改镜像和版本号,必须使用 OTP 或受保护存储。
误区三:只保护主固件,忽略 BootROM 和一级引导。信任链任何一级被降级,整体安全目标都会失效。
误区四:升级失败后自动回退到旧分区,却没有检查旧分区版本是否低于安全基线。
工程建议:在项目早期就定义 SVN 递增规则、OTP 烧录策略和 A/B 分区回退条件;在 BootROM 中实现最小可用的回滚校验逻辑,并在后续各级引导中逐级复核。回滚保护不是单点功能,而是贯穿启动链的安全属性。
综上,回滚攻击利用的是“合法旧版本”的信任缺口,其危害在于让已修复漏洞重新生效。回滚保护通过版本号、防回滚计数器和受保护存储,确保设备只接受不低于安全基线的固件,从而实现完整性、新鲜性和不可逆性的统一。理解这些原理,是后续在 BootROM 中落地回滚保护实战的基础。