3、安全启动链:从BootROM到应用固件的链式验证

安全启动链,说白了就是给固件装上一套「身份证核验系统」。每次上电,芯片都会从最底层的BootROM开始,一级一级往上验证,直到应用固件跑起来。只要中间任何一环出了问题,系统就拒绝启动。

我刚开始做嵌入式安全时,总觉得这玩意儿离自己很远。直到有一次,客户的产品被攻击者通过篡改引导加载程序拿到了root权限……嗯,从那以后,我对安全启动链的态度就彻底变了。

信任根(RoT)—— 整个安全体系的基石

信任根(Root of Trust,RoT)是什么?它是系统中「绝对可信」的最小单元。你想想看,如果连最底层的代码都不安全,那上层再怎么加固也没用。

在嵌入式系统里,信任根通常固化在芯片的BootROM中。BootROM是芯片出厂时写死的只读代码,无法被篡改。这就是整个安全链的起点。

核心要点:信任根必须是物理不可变的。BootROM、一次性编程(OTP)熔丝、硬件唯一密钥,这些都是常见的信任根载体。

我个人习惯把信任根比作「保险箱的锁芯」。锁芯本身是焊死在保险箱上的,攻击者无法更换它。只要锁芯可靠,整个保险箱的安全就有了基础。

安全启动的基本流程

安全启动链的验证过程,其实就是一个「接力赛」。每一级代码在加载下一级之前,都要先验证它的签名和完整性。

典型的流程是这样的:

  1. BootROM(阶段0):芯片上电后,CPU直接执行BootROM中的代码。BootROM验证下一级引导加载程序(通常是SPL或BL1)的签名。
  2. 一级引导加载程序(阶段1):验证通过后,控制权移交给SPL/BL1。SPL/BL1负责初始化DRAM,然后验证二级引导加载程序(如U-Boot或BL2)。
  3. 二级引导加载程序(阶段2):U-Boot/BL2验证操作系统内核或应用固件的签名。
  4. 操作系统/应用固件(阶段3):内核或固件启动后,可以继续验证文件系统、应用程序模块的完整性。

你看,每一级都只信任上一级。这就是「链式验证」的核心思想。

避坑指南:我曾经在一个项目里遇到过这样的问题——BootROM验证了SPL,但SPL没有验证U-Boot就直接跳转了。结果攻击者替换了U-Boot,整个安全链形同虚设。记住:每一级都必须验证下一级,不能跳过任何一环。

链式验证的信任传递模型

为了让你更直观地理解这个信任传递过程,我画了一张流程图。它展示了从BootROM到应用固件的完整验证路径。

安全启动链式验证流程图 安全启动链式验证流程 BootROM(阶段0) 信任根(RoT),不可篡改 验证签名 SPL / BL1(阶段1) 初始化DRAM,验证下一级 验证签名 U-Boot / BL2(阶段2) 验证操作系统/应用固件 验证签名 应用固件(阶段3) 运行时完整性检查 每一级都验证下一级的签名,信任从BootROM逐级传递到应用固件 不可变 可变但需签名 可变但需签名 可变但需签名

验证机制:签名与哈希

每一级验证到底是怎么做的?其实核心就两件事:哈希校验和数字签名验证。

验证步骤 说明 典型算法
计算哈希 对下一级固件镜像计算哈希值 SHA-256, SHA-384
验证签名 用公钥解密签名,与哈希值比对 RSA-2048, ECDSA P-256
检查版本号 防止回滚攻击,验证固件版本不低于当前 单调计数器

这里有个细节要注意:公钥存放在哪里?通常,根公钥会烧录在OTP熔丝中,或者由BootROM从芯片内部安全存储中读取。子级公钥则可以通过证书链的方式逐级传递。

重要提醒:公钥的存储位置决定了整个安全链的强度。如果攻击者能篡改公钥,那签名验证就形同虚设。所以,根公钥必须放在OTP或BootROM中,并且要锁定写入权限。

回滚保护在安全启动链中的位置

回滚保护,通常是在每一级验证签名时,额外检查固件的版本号。具体做法是:

  • 在固件镜像头中嵌入版本号字段
  • 芯片内部维护一个单调计数器(如eFuse或TPM中的计数器)
  • 每次启动时,比较固件版本号与计数器值
  • 如果固件版本低于计数器值,拒绝启动

我参与过一个车规级项目,客户要求固件只能升级不能降级。我们就是在SPL阶段加了这个版本检查逻辑。当时踩过一个坑:单调计数器写一次就永久增加,测试时不小心烧错了版本,结果那块芯片再也无法降级回旧版本了……所以,单调计数器一定要在充分测试后再启用。

常见攻击路径与防御

安全启动链不是万能的。攻击者通常会盯着这些薄弱环节:

  • 跳过验证:通过硬件调试接口(JTAG/SWD)直接跳转到下一级代码,绕过签名检查。防御措施:量产时锁定调试接口。
  • 降级攻击:用旧版本的固件替换新版本,利用旧版本中已知的漏洞。防御措施:单调计数器 + 版本号检查。
  • 密钥泄露:签名私钥被提取,攻击者可以签署恶意固件。防御措施:私钥存储在HSM中,严格管控密钥生命周期。
  • BootROM漏洞:BootROM本身存在缓冲区溢出等漏洞。防御措施:选择经过安全审计的芯片平台。

个人经验:我曾经在一个IoT项目中遇到过「跳过验证」的攻击。攻击者通过未锁定的SWD接口,直接向SRAM中注入了一段恶意代码,绕过了SPL的签名检查。从那以后,我每次做硬件设计都会在原理图上标注「量产必须熔断调试保险丝」。

小结

安全启动链的核心,就是「信任传递」四个字。从BootROM这个不可变的信任根出发,逐级验证,直到整个系统启动完成。回滚保护则是在这个链条上,额外加了一道版本号检查的关卡。

记住:链条的强度取决于最弱的一环。BootROM要固化,公钥要锁死,每一级都不能跳过验证。只有这样,你的固件才能真的「安全」起来。