2. BootROM基础
BootROM 是芯片上电后执行的第一段不可修改的固化代码,通常存放在 SoC 内部只读存储器或受硬件保护的 ROM 区域。它不依赖外部 Flash、DDR 或操作系统,是整条启动链的起点。理解 BootROM,是理解启动回滚保护(Anti-Rollback)为何必须从信任根开始设计的前提。
一、BootROM 的定义与硬件定位
BootROM 是固化在芯片内部的启动代码,具有以下特征:
- 不可修改:出厂后无法擦写,攻击者无法通过软件手段篡改其逻辑。
- 最先执行:复位向量指向 BootROM 入口,早于任何外部存储介质。
- 极小可信基:代码量通常只有几十 KB,便于形式化验证与安全审计。
- 硬件依赖:直接操作时钟、复位、引脚复用、存储控制器等底层资源。
正因为 BootROM 不可改,它才成为信任根的最佳载体。后续所有固件(BL1、BL2、U-Boot、内核)都必须由 BootROM 或其派生阶段逐级验证,形成安全启动链。
二、典型启动流程与固件加载机制
以常见 ARM 平台为例,上电后的启动流程可概括为:
- 复位释放,CPU 从 BootROM 入口取指。
- BootROM 初始化最小硬件:时钟、看门狗、串口、存储接口。
- 根据启动模式引脚或 eFuse 配置,选择启动介质(SPI Flash、eMMC、SD、UART/USB 下载)。
- 从介质读取头部(Header),解析固件长度、加载地址、签名信息。
- 使用内置公钥或 OTP 中烧录的公钥哈希,验证固件签名。
- 验证通过后,将固件搬运到 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 解析的固件头部通常包含以下字段,它们直接决定回滚保护是否生效:
| 字段 | 含义 | 与回滚保护的关系 |
|---|---|---|
| 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,可能成为回滚攻击的旁路。
七、本节小结
BootROM 是芯片启动的第一段代码,也是硬件信任根的载体。它通过启动介质选择、固件头部解析、签名验证和 SVN 检查,构建了安全启动链的起点。回滚保护之所以有效,是因为 BootROM 不可改、OTP 不可逆、SVN 单调递增。理解这三者的关系,是后续实战中设计、调试和排障的基础。