2. 安全启动基础

安全启动不是某一个单独的功能,而是一套从芯片上电第一刻就开始执行的信任建立机制。它的核心目标只有一个:确保设备运行的每一级固件都经过授权且未被篡改。要理解 BootROM 到 Bootloader 的信任链工程,必须先掌握四个基础概念——信任根、信任链、度量与验证,以及支撑它们落地的安全启动标准。

一、信任根:一切信任的起点

信任根(Root of Trust, RoT)是整个安全启动体系中不可被篡改、必须无条件被信任的最小基元。它通常由硬件实现,因为软件可以被替换,而硬件在流片后其逻辑就固定了。信任根一般包含三个部分:

  • 可信根存储(RTS):存放不可更改的密钥或哈希,例如熔丝(eFuse)中烧录的公钥哈希、OTP 区域中的根密钥。
  • 可信根度量(RTM):负责对下一级固件计算哈希,是度量链的起点。
  • 可信根验证(RTV):使用 RTS 中的密钥或哈希对度量结果进行校验,决定是否放行。

在典型的 SoC 中,BootROM 就是信任根的执行载体。它固化在芯片内部 ROM 中,上电后首先运行,负责验证第一级可引导固件(通常是 BL1 或 SPL)。如果 BootROM 本身可被改写,整个信任链就失去了根基,因此它必须只读、不可绕过。

信任根的关键属性:不可篡改、可被无条件信任、是度量与验证的起点。任何“信任根可配置”的设计都需要格外谨慎,因为可配置往往意味着可攻击。

二、信任链:逐级传递的信任

信任链(Chain of Trust, CoT)是把信任根的单点信任,逐级传递到后续每一级固件的过程。其基本逻辑是:上一级验证下一级的完整性与真实性,验证通过后把控制权交给下一级,同时下一级继续验证再下一级。这样形成一条从 BootROM 到 Bootloader、再到操作系统内核的完整链条。

信任链有两种常见形态:

  • 验证式信任链:每一级在加载下一级之前先验证签名或哈希,验证失败则停止启动。这是安全启动最常用的模式。
  • 度量式信任链:每一级把下一级的度量值记录到受保护的寄存器或 TPM 中,启动后再由远端或本地策略判断是否可信。度量不阻断启动,但会留下证据。

实际工程中,两者经常结合使用:先验证再度量,既保证启动安全,又保留可审计的度量日志。

安全启动信任链:验证 + 度量逐级传递 信任根 RoT BootROM / eFuse 公钥哈希 · 只读 BL1 / SPL 第一阶段引导 签名验证入口 BL2 / U-Boot Bootloader 主体 加载内核镜像 OS Kernel 内核与根文件系统 最终运行环境 验证 验证 验证 度量寄存器 / TPM PCR 记录每一级固件的哈希值,形成可审计证据 验证失败 停止启动 / 进入恢复模式 任一环节失败 标准支撑:UEFI Secure Boot · TCG · ARM TBBR 定义信任链模型、度量格式与验证策略

三、度量与验证:两种互补的安全手段

度量(Measurement)和验证(Verification)经常被混为一谈,但它们在安全启动中承担不同职责。

维度 度量 Measurement 验证 Verification
核心动作 计算固件的哈希值并记录 用公钥或哈希比对判断是否可信
是否阻断启动 通常不阻断,只留证据 失败即阻断,拒绝交出控制权
典型实现 TPM PCR、TEE 度量寄存器 RSA/ECDSA 签名校验、哈希比对
主要用途 远程证明、审计、合规 安全启动、防篡改
失败后果 记录异常,供策略判断 停止启动或进入恢复流程

度量解决的是“我能不能证明自己运行了什么”,验证解决的是“我能不能阻止未授权代码运行”。在 BootROM 到 Bootloader 的信任链中,验证是主线,度量是旁路证据链。两者结合,才能同时满足安全启动和远程证明的需求。

四、安全启动标准:让信任链有章可循

不同芯片、不同操作系统对安全启动的实现方式差异很大,因此业界形成了一系列标准来统一信任链模型、镜像格式和验证策略。工程中最常接触的有以下几类:

  • UEFI Secure Boot:定义基于 PK、KEK、db、dbx 的密钥层级和镜像签名验证流程,广泛用于 PC 和服务器。
  • TCG(Trusted Computing Group):定义 TPM、CRTM、PCR 度量模型和远程证明接口,是度量式信任链的事实标准。
  • ARM TBBR(Trusted Board Boot Requirements):ARM 平台安全启动的规范,定义 BL1、BL2、BL31、BL33 等阶段的信任链和镜像认证方式。
  • NIST SP 800-193:面向平台固件弹性的指南,强调固件恢复、保护和检测能力。
在嵌入式 Linux 项目中,常见组合是:BootROM 按芯片厂商规范验证 BL1,BL1 按 TBBR 或自定义格式验证 U-Boot,U-Boot 再按 UEFI Secure Boot 或 FIT 签名验证内核。标准之间可以叠加,但信任根和密钥层级必须清晰。

五、常见误区与复盘

理解概念之后,还要避开工程中反复出现的误区:

  • 把“签名校验”等同于“安全启动”:只校验镜像签名,却不保护验证公钥,攻击者可以替换公钥后重新签名。
  • 信任根可写:把根公钥放在可修改的 Flash 中,等于没有信任根。
  • 只做度量不做验证:度量日志再完整,也无法阻止恶意固件运行。
  • 忽略回滚保护:攻击者用旧版本有漏洞但签名合法的固件替换新版本,版本号必须参与验证。
  • 调试口未关闭:JTAG 或 UART 下载模式可绕过整条信任链,量产设备必须关闭或鉴权。
# 典型 FIT 镜像签名验证配置片段
[images]
  kernel {
    signature {
      algo = "sha256,rsa2048";
      key-name-hint = "dev-key";
      sign-images = "kernel";
    };
  };

# 验证命令示例
mkimage -F -k keys -r image.its image.itb
fit_check_sign -f image.itb -k keys

复盘时可以问三个问题:信任根是否真正不可篡改?每一级是否在交出控制权之前完成了验证?度量值是否被安全记录并可用于后续证明?这三个问题答清楚了,安全启动的基础才算打牢。