3. 安全启动原理:信任链、Root of Trust 与两种启动模式

安全启动,说白了就是解决一个问题:你怎么确定你跑的系统是干净的?

我刚开始接触嵌入式安全时,觉得只要把镜像签个名、烧进去就完事了。直到有一次,我在一块开发板上发现,攻击者只要在 Flash 里把 Bootloader 的起始地址改掉,就能直接加载恶意代码。嗯,从那以后我才真正理解——信任不是凭空来的,必须从源头一级一级建立起来。

这一节,我们就来拆解安全启动的核心:信任链、Root of Trust,以及 Secure Boot 和 Measured Boot 到底有什么区别。

3.1 什么是信任链?

信任链(Chain of Trust)是一个逐级验证的过程。每一级代码在运行前,都要先验证下一级代码的签名或哈希,确认它没被篡改过。

你可以把它想象成接力赛:

  • 第一棒是硬件固化的代码,它验证第二棒
  • 第二棒验证第三棒
  • 第三棒验证第四棒
  • ……直到操作系统启动

只要有一棒断了,整个信任链就失效了。所以,信任链的起点必须是绝对可信的——这就是 Root of Trust。

核心要点:信任链的本质是「验证接力」。每一级只信任上一级,上一级只信任更上一级,最终追溯到硬件。

3.2 Root of Trust:信任的起点

Root of Trust(RoT)是信任链的根。它通常固化在芯片内部,不可更改。常见的 RoT 形式有:

  • Boot ROM:芯片出厂时烧录的只读代码,无法被篡改
  • OTP(一次性可编程)存储器:存储公钥哈希或芯片唯一密钥
  • 硬件安全模块(HSM):独立的加密协处理器

我个人习惯把 RoT 比作「保险箱的锁芯」。锁芯是焊死在保险箱上的,你没法换。攻击者要撬保险箱,要么破坏锁芯(物理攻击),要么绕过锁芯(逻辑攻击)。

避坑指南:我曾经在一个项目里,把公钥存到了 Flash 里,想着反正有签名保护。结果攻击者直接替换了 Flash 里的公钥和镜像,整个信任链瞬间崩塌。记住:RoT 必须放在不可篡改的存储介质里,比如 OTP 或 eFuse。

3.3 Secure Boot vs Measured Boot

这两个概念经常被混用,但它们的思路完全不同。我画了一张对比表,你一看就明白:

特性 Secure Boot Measured Boot
核心思路 阻止未授权代码运行 记录启动过程,供远程验证
验证方式 签名验证,失败则停止启动 哈希扩展,失败仍可启动
信任模型 静态信任(出厂即固定) 动态信任(可远程证明)
典型应用 嵌入式设备、手机、PC TEE、云服务器、可信计算
对攻击的响应 直接阻断 记录证据,事后追责

你想想看,Secure Boot 就像机场安检——没票的人直接拦在外面。Measured Boot 则像行车记录仪——它不阻止你开车,但全程录像,出了事可以回放。

3.4 两种模式的典型流程

Secure Boot 流程

  1. Boot ROM 加载第一级 Bootloader(通常叫 SPL 或 BL1)
  2. Boot ROM 用固化公钥验证 BL1 的签名
  3. 验证通过后,BL1 加载并验证 BL2(如 U-Boot SPL)
  4. BL2 加载并验证 BL3(如 U-Boot 或 EDK2)
  5. BL3 加载并验证操作系统内核
  6. 任何一步验证失败,系统直接挂起或重启

Measured Boot 流程

  1. Boot ROM 计算 BL1 的哈希值,写入 TPM 的 PCR 寄存器
  2. BL1 计算 BL2 的哈希值,扩展(Extend)到 PCR
  3. BL2 计算 BL3 的哈希值,继续扩展 PCR
  4. ……直到操作系统启动
  5. 远程验证方读取 PCR 值,与预期值比对

注意:Measured Boot 不阻止恶意代码运行。如果攻击者篡改了内核,系统仍然会启动,但 PCR 值会与预期不符。远程验证方可以据此判定设备已被入侵。

3.5 信任链的 SVG 结构图

下面这张图展示了典型的信任链结构,以及 Secure Boot 和 Measured Boot 在其中的位置:

信任链与安全启动模式对比 信任链与安全启动模式 Root of Trust (Boot ROM) BL1 (SPL / 一级引导) BL2 (U-Boot SPL) BL3 (U-Boot / EDK2) OS Kernel Secure Boot 每级验证签名 失败即停止 Measured Boot 每级扩展 PCR 失败仍可启动 信任链从 Boot ROM 开始,逐级向下传递信任 Secure Boot 阻断篡改,Measured Boot 记录篡改

3.6 实际项目中的选择

我在实际项目中,通常这样选择:

  • 消费类产品(手机、平板、路由器):用 Secure Boot。用户不需要知道启动过程,设备坏了直接返厂。
  • 企业级设备(服务器、云节点):用 Measured Boot + 远程证明。运维团队需要知道每台设备的启动状态。
  • 高安全场景(金融终端、军工):两者都用。Secure Boot 保证启动完整性,Measured Boot 提供审计证据。

个人经验:我建议你在设计初期就把两种模式都考虑进去。硬件上预留 TPM 或安全飞地接口,软件上支持签名验证和 PCR 扩展。这样后期切换模式时,不用改板子。

3.7 常见误区

  • 误区一:Secure Boot 能防物理攻击——不能。Secure Boot 主要防软件篡改。攻击者用 JTAG 或探针直接读内存,Secure Boot 拦不住。
  • 误区二:Measured Boot 不需要签名——错。Measured Boot 通常也配合签名使用,只是它不强制阻断。
  • 误区三:信任链越长越安全——不一定。每增加一级,攻击面就多一个。我见过一个项目搞了 7 级引导,结果有一级的签名验证有 bug,整个链都废了。

重要提醒:信任链的强度取决于最弱的一环。如果你在 BL2 里用了弱哈希(比如 SHA-1),攻击者可能伪造签名。我个人现在一律用 SHA-256 或更高。

好了,这一节的内容就到这里。信任链、Root of Trust、Secure Boot 和 Measured Boot 这几个概念,你只要记住一句话:信任从硬件开始,验证逐级传递,阻断还是记录取决于你的安全策略。