2. BootROM基础

BootROM 是芯片上电后执行的第一段不可修改的固化代码,通常存放在 SoC 内部只读存储器或受硬件保护的 ROM 区域。它不依赖外部 Flash、DDR 或操作系统,是整条启动链的起点。理解 BootROM,是理解启动回滚保护(Anti-Rollback)为何必须从信任根开始设计的前提。

核心结论:BootROM 是硬件信任根(Root of Trust, RoT)的代码载体,它决定了“谁有资格被加载、以什么顺序加载、加载失败时如何回退”。回滚保护本质上是在这条链的早期阶段,对固件版本号与安全计数器进行强制校验。

一、BootROM 的定义与硬件定位

BootROM 是固化在芯片内部的启动代码,具有以下特征:

  • 不可修改:出厂后无法擦写,攻击者无法通过软件手段篡改其逻辑。
  • 最先执行:复位向量指向 BootROM 入口,早于任何外部存储介质。
  • 极小可信基:代码量通常只有几十 KB,便于形式化验证与安全审计。
  • 硬件依赖:直接操作时钟、复位、引脚复用、存储控制器等底层资源。

正因为 BootROM 不可改,它才成为信任根的最佳载体。后续所有固件(BL1、BL2、U-Boot、内核)都必须由 BootROM 或其派生阶段逐级验证,形成安全启动链。

二、典型启动流程与固件加载机制

以常见 ARM 平台为例,上电后的启动流程可概括为:

  1. 复位释放,CPU 从 BootROM 入口取指。
  2. BootROM 初始化最小硬件:时钟、看门狗、串口、存储接口。
  3. 根据启动模式引脚或 eFuse 配置,选择启动介质(SPI Flash、eMMC、SD、UART/USB 下载)。
  4. 从介质读取头部(Header),解析固件长度、加载地址、签名信息。
  5. 使用内置公钥或 OTP 中烧录的公钥哈希,验证固件签名。
  6. 验证通过后,将固件搬运到 SRAM 或 DDR,跳转执行下一阶段。

固件加载机制的关键在于“先验证、后执行”。BootROM 不会盲目跳转到外部代码,而是先完成完整性校验。若校验失败,则进入恢复模式或停止启动。

BootROM 启动日志示例:
[BOOTROM] reset vector entered
[BOOTROM] clk init done, uart0 ready
[BOOTROM] boot mode: SPI NOR
[BOOTROM] read header @0x0, len=0x2A000
[BOOTROM] verify signature ... OK
[BOOTROM] load BL1 to SRAM 0x20000
[BOOTROM] jump to BL1

三、信任根与安全启动链

信任根(RoT)是安全启动的锚点。它通常由三部分组成:

  • 不可变代码:BootROM 本身。
  • 不可变数据:OTP/eFuse 中烧录的公钥哈希、安全版本号、生命周期状态。
  • 不可变密钥:硬件唯一密钥或设备密钥,用于派生会话密钥。

安全启动链(Chain of Trust)是一个逐级验证的过程:BootROM 验证 BL1,BL1 验证 BL2,BL2 验证 U-Boot,U-Boot 验证内核。每一级都使用上一级提供的公钥或哈希,形成一条不可断裂的信任链。

回滚保护切入点:BootROM 在验证 BL1 时,除了校验签名,还会读取 BL1 头部中的安全版本号(Security Version Number, SVN),并与 OTP 中的最小允许版本比较。若固件版本低于 OTP 记录值,则拒绝启动。这就是启动回滚保护的最底层实现。

四、参数关系与关键数据结构

BootROM 解析的固件头部通常包含以下字段,它们直接决定回滚保护是否生效:

字段含义与回滚保护的关系
magic固件头标识用于快速识别合法镜像
image_len镜像长度防止越界读取
load_addr加载地址决定搬运目标
svn安全版本号与 OTP 比较,低于则拒绝
signature签名值验证完整性与来源
pubkey_hash公钥哈希与 OTP 中哈希比对

其中 svn 是回滚保护的核心参数。OTP 中通常有一个单调递增的计数器或版本阈值,BootROM 只允许 svn 大于等于该阈值的固件启动。

五、案例场景:一次回滚攻击的拦截过程

假设某设备已升级到 SVN=5,OTP 中最小允许版本被烧录为 5。攻击者试图将设备降级到存在漏洞的 SVN=3 固件,以利用旧漏洞。启动过程如下:

[BOOTROM] read header: svn=3
[BOOTROM] otp min_svn=5
[BOOTROM] svn check FAILED
[BOOTROM] enter recovery mode

BootROM 在签名验证之前或之后执行 SVN 检查,直接拒绝加载。攻击者即使拥有合法旧固件及其签名,也无法绕过,因为 OTP 中的阈值不可回退。这就是启动回滚保护的实际效果。

六、常见误区与复盘

  • 误区一:签名验证通过就安全。签名只证明固件来源合法,不证明版本足够新。旧固件同样可以有合法签名,因此必须叠加 SVN 检查。
  • 误区二:回滚保护只在应用层做。应用层可被绕过,只有 BootROM 和 OTP 层面的检查才具备硬件强制性。
  • 误区三:OTP 可以随意重烧。OTP 是一次性可编程,烧录后不可逆。设计时必须预留足够的版本空间,避免后期无法升级。
  • 误区四:忽略恢复模式。BootROM 校验失败后进入恢复模式,若恢复模式本身不校验 SVN,可能成为回滚攻击的旁路。
工程提醒:在量产前必须确认 OTP 中 min_svn 的烧录策略。若烧录过早或过高,会导致后续合法固件无法启动;若烧录过低,则回滚保护形同虚设。建议结合生产阶段与固件版本规划,分阶段递增。

七、本节小结

BootROM 是芯片启动的第一段代码,也是硬件信任根的载体。它通过启动介质选择、固件头部解析、签名验证和 SVN 检查,构建了安全启动链的起点。回滚保护之所以有效,是因为 BootROM 不可改、OTP 不可逆、SVN 单调递增。理解这三者的关系,是后续实战中设计、调试和排障的基础。

BootROM 启动流程与信任根 / 回滚保护关系 硬件信任根 RoT BootROM 固化代码 OTP / eFuse 公钥哈希 OTP min_svn 阈值 BootROM 启动流程 复位取指 硬件初始化 选择启动介质 读取头部 签名验证 + SVN 回滚检查 加载并跳转 BL1 / 下一阶段 校验失败 → 恢复模式 安全启动链(Chain of Trust)逐级验证 BootROM 信任根 BL1 SVN 校验 BL2 SVN 校验 U-Boot SVN 校验 Kernel 最终运行 验证 验证 验证 验证 回滚保护贯穿全链:每一级都检查 SVN ≥ OTP min_svn,低于阈值即拒绝启动 OTP 单调递增,不可回退,构成硬件级防降级屏障