3. 回滚与降级攻击剖析

回滚与降级攻击(Rollback & Downgrade Attack)是可信固件体系中最具现实威胁的一类攻击。它并不需要攻破密码算法本身,而是利用固件更新机制中“版本可被替换、旧镜像仍可被接受”的信任缺口,把设备从已修复的高版本强行拉回到存在已知漏洞的低版本,从而重新打开已被封堵的攻击面。理解这类攻击,必须从攻击动机、攻击向量、真实案例与影响四个维度同时切入。

一、核心原理:为什么“旧固件”是攻击者的武器

固件更新链的信任通常建立在签名验证之上:厂商用私钥签名新固件,设备用内置公钥验证签名。但签名只证明“这个镜像来自厂商”,并不天然证明“这个镜像比当前版本更新”。如果设备只校验签名、不校验版本单调性,那么任何一份历史上被合法签名的旧固件,都可以被重新刷入并通过验证。这就是回滚攻击的根因。

降级攻击是回滚攻击的一个变体:攻击者不一定使用完整旧镜像,而是利用更新协议中的版本协商、分块校验或恢复模式,让设备接受一个版本号更低、但签名合法的组件。二者的共同本质是版本单调性(Monotonicity)缺失。防御的核心手段是引入防回滚计数器(Rollback Counter / SVN,Security Version Number),并把它与一次性可编程存储(OTP/eFuse)或可信执行环境绑定,使设备“记得”自己曾经到达过的最高安全版本。

关键判据:一次合法的固件更新,必须同时满足“签名有效”“版本不低于当前安全版本”“防回滚计数器未被回退”三个条件。缺少任何一条,更新链就存在降级窗口。

二、攻击动机与攻击向量

攻击者的动机通常分为四类:一是重新启用旧版本中已修复的远程代码执行漏洞;二是绕过新版本引入的权限限制或安全启动策略;三是利用旧固件中已知的调试接口、默认口令或未加密通信;四是在供应链场景中把设备“锁死”在可控版本,便于后续持久化控制。

常见攻击向量包括:

  • 更新服务器劫持或镜像替换:攻击者获取到历史签名镜像后,通过中间人、镜像仓库污染或本地升级接口重新下发。
  • 恢复模式滥用:许多设备在恢复模式下放宽校验,允许刷入“出厂固件”,攻击者借此注入旧版本。
  • 组件级降级:只替换引导链中的某一级(如只降级 BL2 或只降级某个协处理器固件),绕过整体版本检查。
  • 版本号伪造:若版本号存放在可写分区且未纳入签名保护,攻击者可直接篡改版本字段,使旧镜像“看起来”更新。
  • 回滚计数器回退:若计数器存储在可擦写区域且缺少完整性保护,攻击者可将其清零,使设备重新接受旧版本。

三、历史案例:BootHole 与 Ripple20

BootHole(2020)是回滚与降级攻击的经典案例。该漏洞影响使用 GRUB2 引导程序的 Linux 系统,攻击者可以绕过 UEFI 安全启动(Secure Boot)的验证,加载未签名的内核或引导程序。其关键点在于 GRUB 配置文件(grub.cfg)的解析过程存在缓冲区溢出,攻击者可在受信任的引导阶段执行任意代码。更严重的是,即使厂商发布了修补后的 GRUB,攻击者仍可通过降级到旧版 GRUB 或替换配置文件,重新触发漏洞。BootHole 揭示了引导链中“配置文件与引导程序版本未同步纳入信任度量”的普遍问题。

Ripple20(2020)则从另一个角度说明了降级风险。该漏洞集合影响 Treck 公司 TCP/IP 协议栈,涉及数十个 CVE,波及大量嵌入式与 IoT 设备。由于这些设备往往长期不更新,或更新机制只做签名校验而不做版本强制,攻击者可以利用旧版本协议栈中的漏洞进行远程代码执行。Ripple20 的影响面之所以巨大,正是因为大量设备被“冻结”在存在漏洞的旧固件上,而缺乏有效的防回滚更新通道。

案例攻击面降级/回滚关键点影响
BootHoleUEFI Secure Boot + GRUB2旧版 GRUB 或 grub.cfg 可绕过验证引导链信任被打破,可加载未签名内核
Ripple20Treck TCP/IP 协议栈旧固件长期不更新,缺少版本强制大量 IoT/嵌入式设备可被远程控制

四、影响分析与防御要点

回滚与降级攻击的影响具有连锁性。第一层是安全边界失效:设备重新暴露于已修复漏洞,攻击者可获得代码执行、权限提升或持久化能力。第二层是信任链断裂:一旦引导链某一级被降级,后续所有度量结果都不可信,远程证明与可信启动形同虚设。第三层是合规与召回成本:设备被降级后可能违反行业安全基线,厂商需要大规模召回或远程强制升级。

防御上应遵循以下要点:

  1. 在引导链每一级引入安全版本号(SVN),并写入 OTP/eFuse,确保版本只能递增。
  2. 将版本号、回滚计数器纳入签名保护范围,防止被单独篡改。
  3. 恢复模式必须执行与正常升级相同的签名与版本校验,禁止“出厂固件”绕过。
  4. 对组件级更新实施独立版本控制,避免只降级某一级而绕过整体检查。
  5. 建立更新日志与远程证明机制,及时发现异常降级行为。
常见误区:认为“签名验证通过就安全”。签名只解决来源真实性,不解决版本新鲜性。没有防回滚计数器的签名更新链,仍然可以被合法旧镜像攻破。
# 典型的防回滚校验伪代码
verify_update(image):
    if not verify_signature(image, pubkey):
        return REJECT
    if image.svn < device.current_svn:
        return REJECT_ROLLBACK
    if image.version <= device.current_version:
        return REJECT_DOWNGRADE
    return ACCEPT

复盘来看,BootHole 与 Ripple20 的共同教训是:固件安全不能只依赖“签名”这一层,而必须把版本单调性、计数器完整性和恢复模式策略一起纳入信任模型。只有让设备“记住”自己曾经到达的安全高度,才能真正封堵回滚与降级攻击的入口。

回滚/降级攻击的信任链缺口与防御闭环 攻击者 持有历史签名镜像 攻击向量 镜像替换 / 恢复模式 组件降级 / 版本伪造 计数器回退 固件引导链(信任逐级传递) BL1/ROM BL2 OS / 应用 信任缺口:只验签名,不验版本单调性 旧镜像签名合法 → 被接受 → 漏洞重新暴露 防御闭环:版本单调性 + 计数器完整性 + 恢复模式同等校验 安全版本号 SVN 写入 OTP/eFuse 防回滚计数器 只增不减,纳入签名 恢复模式校验 禁止出厂固件绕过 远程证明与日志 发现异常降级行为 封堵缺口 BootHole / Ripple20 真实案例驱动