1、安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任链模型

各位同学,咱们今天聊安全启动。说实话,这个主题我讲了快十年,每次开课都从它开始。为什么?因为它是整个设备安全的基石。你想想看,如果连启动过程都不安全,后面做再多加密、防火墙,都是白搭。

1.1 什么是安全启动

安全启动,英文叫 Secure Boot。说白了,就是让设备从通电到操作系统跑起来,每一步都经过验证。验证什么?验证代码的完整性和合法性。

我习惯用一个比喻来解释:安全启动就像机场安检。你从入口到登机口,每过一个关卡都要出示证件、检查行李。如果有人想混进去,安检员会立刻拦住他。

在嵌入式设备里,这个“安检员”就是硬件。它检查每一段即将执行的代码:

  • Boot ROM 检查 Bootloader
  • Bootloader 检查操作系统内核
  • 内核检查文件系统

每一层都验一遍签名。签名不对?直接拒绝执行。设备就停在原地,不会让你跑起来。

核心要点:安全启动不是“能不能启动”,而是“只让可信的代码启动”。

1.2 为什么需要安全启动

你可能要问:不加安全启动,设备不也能跑吗?是的,能跑。但风险有多大,我举个例子。

几年前我参与过一个 IoT 网关项目。客户说设备已经量产了,突然发现有人能通过串口刷入恶意固件。刷完之后,设备变成了肉鸡,往外疯狂发包。客户连夜打电话问我怎么办。

我问他:你们上安全启动了吗?他说没有。那没办法,只能召回。那次召回,损失了大概两百万。

所以,为什么需要安全启动?三个原因:

  1. 防篡改:防止攻击者替换你的固件。没有签名验证,谁都能往 Flash 里写东西。
  2. 防回滚:防止攻击者刷回有漏洞的老版本。这个我们后面专门有一章讲。
  3. 建立信任根:从硬件开始,一层层验证,确保整个系统是可信的。

注意:安全启动不是万能的。它解决的是“启动时”的安全问题。运行时漏洞、侧信道攻击,它管不了。但如果没有安全启动,其他安全措施都是空中楼阁。

1.3 安全启动的信任链模型

好,接下来是重点。信任链模型,这是安全启动的核心设计思想。

什么叫信任链?就是从绝对可信的起点开始,一级验证一级,把信任传递下去。

这个起点,叫信任根(Root of Trust, RoT)。在嵌入式设备里,信任根通常是芯片内部的 Boot ROM。Boot ROM 是出厂时固化在芯片里的,不可修改。它天然可信。

信任链的传递过程是这样的:

  1. 芯片上电,CPU 从 Boot ROM 开始执行。
  2. Boot ROM 读取外部 Flash 中的 Bootloader,验证它的签名。
  3. 签名通过,Bootloader 获得控制权。
  4. Bootloader 再验证操作系统内核的签名。
  5. 内核验证文件系统或应用层的签名。

每一层都只信任上一层的验证结果。只要有一层验证失败,链条就断了,设备停止启动。

下面这张图展示了典型的信任链结构:

安全启动信任链模型 Boot ROM(信任根) Bootloader 操作系统内核 文件系统 / 应用 验证关系说明 ① Boot ROM 验证 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 小结

这一章我们聊了安全启动的基本概念。核心就三句话:

  • 安全启动是让设备只运行经过签名的代码。
  • 它防止固件被篡改和回滚。
  • 信任链模型从硬件信任根开始,一层验证一层。