2、可信开机链基础:Secure Boot 与信任根
好,我们正式开始聊可信开机。这一章是整个课程的基石,说白了,后面所有关于调试接口的安全分析,都建立在你对可信开机链的理解上。我个人习惯把可信开机想象成一场接力赛——每一棒都必须确认上一棒的身份,才能继续跑下去。
2.1 什么是可信开机(Secure Boot)?
Secure Boot,不是指“安全的开机过程”这么简单。它是一套密码学验证机制,确保设备从按下电源键到操作系统启动,每一段执行的代码都是经过签名的、未被篡改的。
我遇到过不少工程师,觉得 Secure Boot 就是检查一下 bootloader 的哈希值。嗯,这只是冰山一角。真正的 Secure Boot 要覆盖整个启动链:
- Boot ROM —— 芯片出厂固化的第一段代码
- SPL / 一级 bootloader —— 初始化内存和时钟
- U-Boot / 二级 bootloader —— 加载内核和设备树
- 操作系统内核 —— 比如 Linux kernel
- 关键内核模块 —— 驱动、文件系统等
每一级在加载下一级之前,都要验证其数字签名。只要有一级验证失败,启动就中断。你想想看,如果攻击者能在 bootloader 里植入后门,那整个系统就毫无安全可言了。
核心原则:Secure Boot 不是防物理攻击的,它防的是持久性恶意软件。攻击者无法通过替换启动镜像来获得持久控制权。
2.2 信任根(Root of Trust)
信任根,英文叫 Root of Trust,简称 RoT。它是整个安全体系的起点。为什么叫“根”?因为它是不可伪造、不可篡改的。
在嵌入式系统里,信任根通常由以下几部分组成:
| 组件 | 作用 | 存储位置 |
|---|---|---|
| 不可变 Boot ROM | 芯片上电后执行的第一段代码 | 芯片内部掩膜 ROM |
| 公钥哈希 / 公钥 | 用于验证 bootloader 签名 | 一次性可编程存储器(eFuse / OTP) |
| 硬件安全模块 | 提供安全存储和密码运算 | 独立安全芯片或 SoC 内部 |
我个人习惯把信任根比作“不可说谎的证人”。它不会执行任何外部代码,只做一件事:验证。Boot ROM 是芯片出厂时就写死的,你改不了它。公钥存储在 eFuse 里,一旦烧写就无法修改。这就是信任的起点。
注意:如果攻击者能够物理篡改 eFuse 或替换 Boot ROM,那信任根就不存在了。这也是为什么调试接口(如 JTAG)如果不受保护,可以直接绕过信任根——我后面会详细讲。
2.3 信任链的传递机制
信任链,英文叫 Chain of Trust。它的核心思想是:每一级代码在加载下一级之前,先验证下一级的签名。验证通过,信任就传递下去;验证失败,启动终止。
我画了一张图,帮你理解这个流程:
这个流程看起来简单,但实际落地时有很多细节。我举一个我在项目中踩过的坑:
避坑指南:我曾经在一个 IoT 芯片项目里,SPL 验证 U-Boot 时只检查了哈希值,没检查签名。结果攻击者只要替换了 U-Boot 镜像,同时修改哈希值,就能绕过验证。记住:哈希只能防意外篡改,签名才能防恶意篡改。一定要用非对称签名验证。
2.4 信任链的两种模式
在实际工程中,信任链有两种常见实现模式:
- 静态信任链(Static Chain of Trust):所有验证都在启动阶段完成,启动后不再验证。优点是性能好,缺点是运行时加载的模块无法被覆盖。
- 动态信任链(Dynamic Chain of Trust):不仅启动时验证,运行时加载的模块(如内核模块、固件更新)也要验证。安全性更高,但需要额外的运行时验证机制。
我个人建议,只要硬件性能允许,尽量用动态信任链。因为现在很多攻击是在系统运行后注入恶意模块的,静态信任链防不住这种情况。
2.5 信任链的薄弱环节
信任链再强,也有几个常见的薄弱点:
| 薄弱环节 | 风险描述 | 典型攻击方式 |
|---|---|---|
| Boot ROM 漏洞 | Boot ROM 本身存在代码漏洞 | 利用缓冲区溢出执行任意代码 |
| 公钥存储被篡改 | eFuse 被物理篡改或未正确烧写 | 激光切割、电压故障注入 |
| 签名验证逻辑缺陷 | 验证代码存在逻辑错误 | 绕过验证、降级攻击 |
| 调试接口未锁定 | JTAG/SWD 在启动后仍可访问 | 通过调试接口读取内存、修改寄存器 |
你想想看,如果调试接口在 Secure Boot 完成后还开着,攻击者就能直接读取内存中的密钥,或者修改内核代码。这就是为什么调试接口的安全管理,是可信开机链中不可忽视的一环。
总结一下:可信开机链的核心是“信任根 + 信任链传递”。信任根不可篡改,信任链逐级验证。调试接口如果不受控,就等于在信任链上开了一个后门。后面几章,我会详细拆解调试接口如何影响这个链条。