1、安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任链模型
各位同学,咱们今天聊安全启动。说实话,这个主题我讲了快十年,每次开课都从它开始。为什么?因为它是整个设备安全的基石。你想想看,如果连启动过程都不安全,后面做再多加密、防火墙,都是白搭。
1.1 什么是安全启动
安全启动,英文叫 Secure Boot。说白了,就是让设备从通电到操作系统跑起来,每一步都经过验证。验证什么?验证代码的完整性和合法性。
我习惯用一个比喻来解释:安全启动就像机场安检。你从入口到登机口,每过一个关卡都要出示证件、检查行李。如果有人想混进去,安检员会立刻拦住他。
在嵌入式设备里,这个“安检员”就是硬件。它检查每一段即将执行的代码:
- Boot ROM 检查 Bootloader
- Bootloader 检查操作系统内核
- 内核检查文件系统
每一层都验一遍签名。签名不对?直接拒绝执行。设备就停在原地,不会让你跑起来。
核心要点:安全启动不是“能不能启动”,而是“只让可信的代码启动”。
1.2 为什么需要安全启动
你可能要问:不加安全启动,设备不也能跑吗?是的,能跑。但风险有多大,我举个例子。
几年前我参与过一个 IoT 网关项目。客户说设备已经量产了,突然发现有人能通过串口刷入恶意固件。刷完之后,设备变成了肉鸡,往外疯狂发包。客户连夜打电话问我怎么办。
我问他:你们上安全启动了吗?他说没有。那没办法,只能召回。那次召回,损失了大概两百万。
所以,为什么需要安全启动?三个原因:
- 防篡改:防止攻击者替换你的固件。没有签名验证,谁都能往 Flash 里写东西。
- 防回滚:防止攻击者刷回有漏洞的老版本。这个我们后面专门有一章讲。
- 建立信任根:从硬件开始,一层层验证,确保整个系统是可信的。
注意:安全启动不是万能的。它解决的是“启动时”的安全问题。运行时漏洞、侧信道攻击,它管不了。但如果没有安全启动,其他安全措施都是空中楼阁。
1.3 安全启动的信任链模型
好,接下来是重点。信任链模型,这是安全启动的核心设计思想。
什么叫信任链?就是从绝对可信的起点开始,一级验证一级,把信任传递下去。
这个起点,叫信任根(Root of Trust, RoT)。在嵌入式设备里,信任根通常是芯片内部的 Boot ROM。Boot ROM 是出厂时固化在芯片里的,不可修改。它天然可信。
信任链的传递过程是这样的:
- 芯片上电,CPU 从 Boot ROM 开始执行。
- Boot ROM 读取外部 Flash 中的 Bootloader,验证它的签名。
- 签名通过,Bootloader 获得控制权。
- Bootloader 再验证操作系统内核的签名。
- 内核验证文件系统或应用层的签名。
每一层都只信任上一层的验证结果。只要有一层验证失败,链条就断了,设备停止启动。
下面这张图展示了典型的信任链结构:
这张图里,Boot ROM 是信任根。它不可篡改,所以是安全的起点。后面的每一层,都依赖上一层的验证结果。这就是“链”的含义。
1.4 信任链的两种实现方式
在实际项目中,我见过两种信任链实现方式。它们各有优劣,我列个表对比一下:
| 对比项 | 静态信任链 | 动态信任链 |
|---|---|---|
| 验证时机 | 启动时一次性验证 | 启动时验证 + 运行时持续验证 |
| 实现复杂度 | 低 | 高 |
| 安全性 | 中等(启动后不再检查) | 高(持续监控) |
| 典型应用 | 消费电子、IoT 设备 | 汽车、工业控制、金融终端 |
我个人习惯,在资源受限的 MCU 上用静态信任链。够用,而且省资源。但在 Linux 系统上,我建议上动态信任链。因为 Linux 启动后还会加载内核模块、动态库,这些都需要验证。
经验之谈:我曾经在一个项目里只做了静态信任链,结果上线后发现攻击者通过内核模块注入恶意代码。从那以后,凡是跑 Linux 的设备,我都坚持加上 IMA(Integrity Measurement Architecture)做运行时验证。
1.5 信任链中的关键要素
要实现信任链,有几个要素缺一不可。我列出来,你对照自己的项目检查一下:
- 信任根:必须是硬件级别的,不可修改。常见的是 Boot ROM 或 eFuse。
- 公钥:用于验证签名的公钥,必须安全存储。通常烧录在 eFuse 或 OTP 区域。
- 签名算法:推荐 RSA-2048 或 ECDSA。别用 MD5 或 SHA-1,已经不安全了。
- 签名机制:每一级代码都附带签名,由上一级验证。
- 回滚保护:防止攻击者刷回旧版本。这个我们后面会详细讲。
嗯,这里要注意:公钥的存储位置非常关键。如果公钥能被篡改,整个信任链就崩塌了。我见过一个厂商把公钥放在外部 Flash 里,结果攻击者直接替换了公钥和自己的签名,轻松绕过安全启动。
避坑指南:公钥必须存储在芯片内部的一次性可编程(OTP)区域或 eFuse 中。写入后锁定,不可再改。这是底线,没得商量。
1.6 小结
这一章我们聊了安全启动的基本概念。核心就三句话:
- 安全启动是让设备只运行经过签名的代码。
- 它防止固件被篡改和回滚。
- 信任链模型从硬件信任根开始,一层验证一层。