3. 回滚保护概述

在嵌入式安全启动体系中,BootROM 是信任链的根。它负责在芯片上电后第一时间校验并加载下一级固件,因此 BootROM 所信任的“版本策略”直接决定了设备能否抵御回滚攻击(Rollback Attack)。回滚保护并不是简单地“禁止降级”,而是围绕版本号、防回滚计数器、签名校验和策略存储构建的一整套安全机制。理解回滚攻击的本质,是设计 BootROM 回滚保护方案的第一步。

一、回滚攻击的定义

回滚攻击是指攻击者将设备固件、配置或安全策略替换为旧版本,从而利用旧版本中已修复的漏洞、已撤销的密钥或已放宽的权限,重新获得对设备的控制能力。它的核心不是“伪造新固件”,而是“让设备接受一个本应被淘汰的旧固件”。

从信任链角度看,回滚攻击破坏的是“版本单调递增”这一隐含假设。BootROM 如果只校验签名是否合法,而不校验版本是否低于当前安全基线,那么一个签名合法但存在漏洞的旧固件仍然可以通过校验并运行。

关键区别:普通篡改攻击需要伪造签名;回滚攻击使用的是厂商自己签发的旧镜像,因此签名校验无法单独防御。

二、回滚攻击的危害

回滚攻击的危害具有隐蔽性和持久性。攻击者一旦成功降级,往往可以重新打开已经关闭的调试接口、恢复已撤销的密钥、绕过新加入的访问控制,甚至利用旧版本中的已知漏洞植入持久化后门。更严重的是,如果回滚发生在 BootROM 阶段,整个信任链的起点都会被污染,后续所有安全机制都可能失效。

  • 漏洞复活:旧版本中已修复的 CVE 重新可用。
  • 密钥撤销失效:已吊销的签名密钥重新被信任。
  • 安全策略降级:调试口、JTAG、串口下载等被重新打开。
  • 持久化控制:攻击者可长期驻留,难以通过常规升级清除。
  • 合规风险:违反安全认证对版本防回滚的强制要求。

三、常见回滚场景

回滚攻击并不只出现在实验室。在真实产品中,常见场景包括:通过串口或 USB 下载旧固件;利用 OTA 服务器漏洞替换升级包;在双分区 A/B 系统中强制切换到旧分区;通过外部存储卡加载旧配置;以及利用 BootROM 下载模式写入旧镜像。下面这张图展示了回滚攻击在启动链路中的典型位置与保护点。

回滚攻击路径与回滚保护机制 BootROM 信任根 / 版本策略 BL1 / SPL 一级引导 BL2 / U-Boot 二级引导 Kernel / OS 操作系统 旧固件镜像 签名合法但版本低 回滚注入点 OTA / 串口 / 分区切换 旧漏洞复活 调试口 / 密钥 / 权限 降级写入 回滚保护机制 版本号校验 SVN / Anti-Rollback 防回滚计数器 OTP / eFuse 签名与哈希校验 RSA / ECDSA / SHA 策略存储保护 只增不减 / 锁定 拦截降级

四、回滚保护的基本原理

回滚保护的基本原理可以概括为:让设备记住“曾经见过的最高安全版本”,并拒绝任何低于该版本的镜像。这个“记忆”必须存放在攻击者难以篡改的位置,通常是 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 中落地回滚保护实战的基础。