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 流程
- Boot ROM 加载第一级 Bootloader(通常叫 SPL 或 BL1)
- Boot ROM 用固化公钥验证 BL1 的签名
- 验证通过后,BL1 加载并验证 BL2(如 U-Boot SPL)
- BL2 加载并验证 BL3(如 U-Boot 或 EDK2)
- BL3 加载并验证操作系统内核
- 任何一步验证失败,系统直接挂起或重启
Measured Boot 流程
- Boot ROM 计算 BL1 的哈希值,写入 TPM 的 PCR 寄存器
- BL1 计算 BL2 的哈希值,扩展(Extend)到 PCR
- BL2 计算 BL3 的哈希值,继续扩展 PCR
- ……直到操作系统启动
- 远程验证方读取 PCR 值,与预期值比对
注意:Measured Boot 不阻止恶意代码运行。如果攻击者篡改了内核,系统仍然会启动,但 PCR 值会与预期不符。远程验证方可以据此判定设备已被入侵。
3.5 信任链的 SVG 结构图
下面这张图展示了典型的信任链结构,以及 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 这几个概念,你只要记住一句话:信任从硬件开始,验证逐级传递,阻断还是记录取决于你的安全策略。