1. 可信启动概述
各位同学,咱们今天聊聊可信启动。说实话,这个名词在嵌入式圈子里已经火了很久了。但真正把它搞明白的人,其实不多。
我刚开始接触这个领域时,也觉得可信启动就是个花架子——不就是启动时多检查几道吗?后来在一次产品安全事故中,我亲眼看到一台设备因为启动链被篡改,整个系统被植入后门。嗯,从那以后,我再也不敢轻视它了。
什么是可信启动
可信启动,英文叫 Secure Boot 或 Trusted Boot。说白了,就是让设备从通电开始,每一步都验证「我是谁」和「谁让我启动的」。
你想想看,一台嵌入式设备从按下电源键到系统跑起来,中间经历了多少环节?BootROM、Bootloader、内核、文件系统……每个环节都可能被攻击者利用。可信启动要做的,就是确保这些环节一个都没被篡改。
核心思想:信任不是天生的,而是通过逐级验证建立起来的。每一级都验证下一级的完整性和合法性,然后才把控制权交出去。
我个人习惯把可信启动比作「接力赛」——每一棒都要确认下一棒是自家队员,才把接力棒递过去。如果发现对方是冒牌货,立刻停赛报警。
为什么需要可信启动
这个问题我问过很多刚入行的工程师。最常见的回答是:「为了安全啊。」但具体安全什么?很多人说不清楚。
我给大家列几个真实场景:
- 防止固件被篡改:攻击者通过物理接口(JTAG、UART)或网络漏洞,把恶意固件写进Flash。没有可信启动,设备照样跑,但跑的是别人的代码。
- 防止启动降级攻击:攻击者把设备「回滚」到有漏洞的旧版本固件,然后利用已知漏洞入侵。可信启动可以强制版本号检查,拒绝旧版本启动。
- 保护知识产权:你的固件里可能有核心算法或商业逻辑。可信启动能防止别人把固件dump出来直接用在竞品上。
- 满足合规要求:现在很多行业标准(如IEC 62443、GDPR、汽车功能安全)都明确要求设备具备安全启动能力。没有这个,产品根本过不了认证。
我在一个物联网项目中遇到过这样的情况:客户的产品已经量产了,结果发现市面上出现了外观一模一样的山寨设备,里面跑的是盗版固件。后来我们在新版本里加了可信启动,山寨厂直接傻眼了——他们没法伪造签名,设备启动不了。
注意:可信启动不是万能的。它只能保证启动过程的完整性,不能防御运行时的攻击。如果你系统跑起来后被远程利用了,可信启动也救不了你。它只是安全体系的第一道门,不是全部。
可信启动的信任链模型
这是整个章节的核心。信任链模型,我习惯叫它「信任接力棒」。
它的基本逻辑是这样的:
- 信任根(Root of Trust, RoT):这是整个信任链的起点。通常固化在芯片内部的BootROM里,不可修改。它是最原始的信任依据。
- 信任传递:信任根验证第一级Bootloader的签名,验证通过后把控制权交给它。第一级Bootloader再去验证第二级Bootloader或内核,以此类推。
- 信任终止:当整个启动链都验证通过后,系统进入运行态。此时信任链使命完成。
下面这张图展示了典型的信任链结构:
这张图里,信任从BootROM开始,一路向下传递。每一级都只信任上一级,也只验证下一级。这就是典型的「链式信任模型」。
除了链式模型,还有一种叫「星型模型」——所有验证都直接由信任根完成。但实际产品中,链式模型更常见,因为BootROM空间有限,做不了太复杂的验证逻辑。
经验之谈:我在设计信任链时,一般控制在3到4级。太短了,灵活性不够;太长了,启动时间受不了。曾经有个项目把信任链搞了6级,结果启动时间从2秒飙到8秒,产品经理差点跟我翻脸。
信任链中的关键要素
要真正理解信任链,有几个概念必须搞清楚:
| 要素 | 说明 | 常见实现 |
|---|---|---|
| 信任根 | 不可修改的硬件或固件,是信任的起点 | BootROM、eFuse、HSM |
| 公钥 | 用于验证签名的公开密钥,通常固化在信任根中 | RSA 2048/4096、ECDSA P-256 |
| 私钥 | 用于签名的秘密密钥,必须严格保护 | 存储在HSM或离线环境中 |
| 签名 | 对固件内容进行哈希后,用私钥加密的结果 | PKCS#1 v1.5、PSS |
| 度量 | 对固件进行哈希计算,得到度量值 | SHA-256、SHA-384 |
| 策略 | 验证失败时的处理规则 | 停止启动、报警、回退 |
这里我要特别强调一下私钥保护。我曾经见过一个团队,把签名私钥直接放在CI/CD服务器的环境变量里。结果服务器被攻破,私钥泄露,所有产品的信任链瞬间崩塌。那次事故导致几十万台设备需要现场升级固件,成本惨重。
血的教训:私钥必须离线存储,使用HSM或专用签名服务器。永远不要把私钥放在开发机、代码仓库或CI环境里。哪怕只是临时用一下,也不行。
信任链的变体
实际项目中,信任链模型会有一些变体。我简单列几种常见的:
- 静态信任链:启动时一次性验证,之后不再检查。适合对启动性能要求高的场景。
- 动态信任链:系统运行过程中,定期或按需重新验证。适合安全等级要求高的场景。
- 混合信任链:启动时做静态验证,运行时对关键模块做动态验证。这是目前大多数高端嵌入式设备的做法。
我个人比较推荐混合模式。因为静态验证只能保证启动那一刻是安全的,但系统跑起来后,内核模块、动态库、配置文件都可能被篡改。动态验证能弥补这个短板。
好了,这一章的内容就到这里。可信启动的概念和信任链模型是后续所有章节的基础。你如果现在觉得有些抽象,没关系,后面我们会一步步把它落地到代码和硬件上。