1. 安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任根概念
1.1 什么是安全启动?
安全启动,说白了就是一套「只让可信代码运行」的机制。
我经常跟团队里的新人这么解释:
你想想看,你的设备上电后,CPU 执行的第一行代码是谁的?
如果这第一行代码就被篡改了,后面所有的安全措施都是白搭。
安全启动要解决的问题,就是确保从设备上电那一刻起,每一级代码都经过验证。
只有验证通过,才允许执行。否则,直接锁死或进入恢复模式。
我在项目中遇到过最典型的场景:
某款 IoT 设备在量产时,发现 bootloader 被意外刷入了测试版本。
结果设备上线后,攻击者通过调试接口直接拿到了 root 权限。
嗯,这就是没有安全启动的后果。
1.2 为什么需要安全启动?
你可能觉得,我一个小设备,谁稀罕攻击我?
我告诉你,攻击者不挑食。他们专挑「看起来好欺负」的设备下手。
安全启动的必要性,可以从三个层面来看:
- 防篡改: 防止攻击者替换你的 bootloader、内核或文件系统。一旦被替换,设备就变成了别人的「肉鸡」。
- 防回滚: 防止攻击者刷回有漏洞的旧版本固件。我曾经见过一个案例,攻击者把设备降级到三年前的固件,然后利用已知漏洞轻松拿下控制权。
- 建立信任链: 从硬件到操作系统,每一级都验证下一级。这样即使某个环节被攻破,影响范围也能被限制。
1.3 信任根(Root of Trust)概念
信任根,是整个安全启动的基石。
说白了,就是「第一个被信任的东西」。它必须是不可篡改的。
我习惯把信任根比作「家族族谱的始祖」:
始祖的身份是确定的,后代才能依次验证。如果始祖的身份都存疑,整个族谱就乱了。
在嵌入式系统中,信任根通常有以下几种形式:
| 类型 | 载体 | 特点 |
|---|---|---|
| 硬件信任根 | ROM(只读存储器) | 出厂固化,不可修改。最安全,但灵活性差 |
| 软件信任根 | BootROM + 公钥 | 公钥存储在 eFuse 或 OTP 中。灵活性较好 |
| 混合信任根 | 硬件安全模块(HSM) | 专用安全芯片,独立执行验证。成本较高 |
我个人最推荐硬件信任根 + 公钥存储的组合。
为什么呢?因为 ROM 代码无法被修改,而公钥存储在一次性可编程(OTP)区域,攻击者即使物理接触设备,也很难篡改。
1.4 信任链的传递过程
信任根只是起点。真正的安全启动,需要一条完整的信任链。
我画了一张图,帮你理解这个过程:
这张图展示了典型的信任链:
- BootROM 作为信任根,验证 Bootloader 的数字签名
- Bootloader 验证通过后,再验证固件或内核的签名
- 固件/内核 验证通过后,再验证文件系统或应用程序的签名
每一级都只信任上一级。如果任何一级验证失败,设备就会停止启动。
这就是「链式信任」的核心思想。
1.5 常见的信任根实现方式
在实际项目中,我见过三种主流的信任根实现方式:
- eFuse/OTP: 一次性可编程存储器,存储公钥哈希。成本低,但一旦烧录就无法更改。适合量产稳定的产品。
- TPM(可信平台模块): 独立安全芯片,提供硬件密钥存储和加密运算。安全性最高,但成本也高。适合金融、政务等高安全场景。
- ARM TrustZone: 利用 ARM 架构的安全世界(Secure World)来隔离敏感操作。不需要额外硬件,但需要软件配合。适合移动设备和 IoT。
我个人习惯根据产品定位来选择:
消费级产品用 eFuse 就够了,工业级产品建议上 TPM,车规级产品必须用硬件安全模块。
1.6 小结
安全启动不是可选项,而是嵌入式设备的「安全带」。
信任根是这条安全带的锚点,锚点不牢,一切白费。
记住三个核心原则:
- 信任根必须硬件固化
- 信任链必须逐级验证
- 验证失败必须停止启动
嗯,这一章就到这里。下一章我们会深入 BootROM 的实现细节,看看代码层面是怎么做的。