1. 安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任根概念

1.1 什么是安全启动?

安全启动,说白了就是一套「只让可信代码运行」的机制。

我经常跟团队里的新人这么解释:
你想想看,你的设备上电后,CPU 执行的第一行代码是谁的?
如果这第一行代码就被篡改了,后面所有的安全措施都是白搭。

安全启动要解决的问题,就是确保从设备上电那一刻起,每一级代码都经过验证。
只有验证通过,才允许执行。否则,直接锁死或进入恢复模式。

我在项目中遇到过最典型的场景:
某款 IoT 设备在量产时,发现 bootloader 被意外刷入了测试版本。
结果设备上线后,攻击者通过调试接口直接拿到了 root 权限。
嗯,这就是没有安全启动的后果。

核心定义: 安全启动(Secure Boot)是一种硬件与软件协同的机制,确保设备只运行经过数字签名的、可信的固件或操作系统。

1.2 为什么需要安全启动?

你可能觉得,我一个小设备,谁稀罕攻击我?
我告诉你,攻击者不挑食。他们专挑「看起来好欺负」的设备下手。

安全启动的必要性,可以从三个层面来看:

  • 防篡改: 防止攻击者替换你的 bootloader、内核或文件系统。一旦被替换,设备就变成了别人的「肉鸡」。
  • 防回滚: 防止攻击者刷回有漏洞的旧版本固件。我曾经见过一个案例,攻击者把设备降级到三年前的固件,然后利用已知漏洞轻松拿下控制权。
  • 建立信任链: 从硬件到操作系统,每一级都验证下一级。这样即使某个环节被攻破,影响范围也能被限制。
避坑指南: 我曾经接手过一个项目,客户说「我们不需要安全启动,设备在内网」。结果呢?内网里一台打印机被攻破,横向移动把整个产线都瘫痪了。记住:没有绝对安全的网络边界。

1.3 信任根(Root of Trust)概念

信任根,是整个安全启动的基石。
说白了,就是「第一个被信任的东西」。它必须是不可篡改的。

我习惯把信任根比作「家族族谱的始祖」:
始祖的身份是确定的,后代才能依次验证。如果始祖的身份都存疑,整个族谱就乱了。

在嵌入式系统中,信任根通常有以下几种形式:

类型 载体 特点
硬件信任根 ROM(只读存储器) 出厂固化,不可修改。最安全,但灵活性差
软件信任根 BootROM + 公钥 公钥存储在 eFuse 或 OTP 中。灵活性较好
混合信任根 硬件安全模块(HSM) 专用安全芯片,独立执行验证。成本较高

我个人最推荐硬件信任根 + 公钥存储的组合。
为什么呢?因为 ROM 代码无法被修改,而公钥存储在一次性可编程(OTP)区域,攻击者即使物理接触设备,也很难篡改。

经验之谈: 我在设计安全启动方案时,通常会预留一个「恢复密钥」。万一主密钥丢失,还能通过物理授权的方式恢复设备。这个细节,很多工程师会忽略。

1.4 信任链的传递过程

信任根只是起点。真正的安全启动,需要一条完整的信任链。

我画了一张图,帮你理解这个过程:

安全启动信任链传递流程 信任根(BootROM) 硬件固化,不可修改 验证签名 Bootloader 验证下一级固件 验证签名 固件/内核 验证文件系统

这张图展示了典型的信任链:

  1. BootROM 作为信任根,验证 Bootloader 的数字签名
  2. Bootloader 验证通过后,再验证固件或内核的签名
  3. 固件/内核 验证通过后,再验证文件系统或应用程序的签名

每一级都只信任上一级。如果任何一级验证失败,设备就会停止启动。
这就是「链式信任」的核心思想。

关键点: 信任链的长度越短越好。每增加一级,就多一个攻击面。我一般建议控制在 3-4 级以内。

1.5 常见的信任根实现方式

在实际项目中,我见过三种主流的信任根实现方式:

  • eFuse/OTP: 一次性可编程存储器,存储公钥哈希。成本低,但一旦烧录就无法更改。适合量产稳定的产品。
  • TPM(可信平台模块): 独立安全芯片,提供硬件密钥存储和加密运算。安全性最高,但成本也高。适合金融、政务等高安全场景。
  • ARM TrustZone: 利用 ARM 架构的安全世界(Secure World)来隔离敏感操作。不需要额外硬件,但需要软件配合。适合移动设备和 IoT。

我个人习惯根据产品定位来选择:
消费级产品用 eFuse 就够了,工业级产品建议上 TPM,车规级产品必须用硬件安全模块。

注意: 我曾经见过一个团队,为了省钱用了软件模拟的信任根。结果攻击者通过电压故障注入,绕过了签名验证。硬件信任根,真的不能省。

1.6 小结

安全启动不是可选项,而是嵌入式设备的「安全带」。
信任根是这条安全带的锚点,锚点不牢,一切白费。

记住三个核心原则:

  • 信任根必须硬件固化
  • 信任链必须逐级验证
  • 验证失败必须停止启动

嗯,这一章就到这里。下一章我们会深入 BootROM 的实现细节,看看代码层面是怎么做的。

可可精品资料库