1. 安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任链模型
各位同学,咱们今天聊一个嵌入式系统里绕不开的话题——安全启动。说实话,我入行那会儿,安全启动还是个“加分项”,很多产品压根不关心。但这些年,从智能家居到车规芯片,从工业控制器到医疗设备,安全启动几乎成了标配。为什么?因为吃过亏的人太多了。
我记得2016年参与过一个IoT网关项目,产品都量产了,结果被爆出固件可以被任意替换。攻击者只需要一个USB转JTAG工具,就能把我们的固件换成恶意版本。那一次,公司紧急召回了两万多台设备,损失惨重。从那以后,我每次做系统设计,安全启动都是第一道防线。
1.1 什么是安全启动
安全启动,说白了就是一套机制。它确保设备每次上电后,运行的代码是厂商签过名的、没有被篡改过的、且版本合法的。
你想想看,设备从ROM里第一条指令开始,到加载完操作系统,中间要经过好几个阶段:BootROM、Bootloader、固件镜像、应用分区。任何一个环节被动了手脚,整个系统就不可信了。安全启动要做的,就是给这条执行链加上“数字锁”。
我习惯把安全启动比作“洋葱模型”。每一层代码在运行之前,都要先验证下一层代码的签名和哈希。只有验证通过,才把执行权交出去。一层套一层,直到整个系统跑起来。
核心要点:安全启动不是单一技术,而是一套从硬件到软件的完整验证链条。它的目标是保证设备只运行经过授权的代码。
1.2 为什么需要安全启动
这个问题,我经常被刚入行的工程师问到。我的回答很简单:没有安全启动,你的设备就是“裸奔”。
具体来说,有四个场景让我觉得安全启动必不可少:
- 防固件篡改:攻击者通过物理接口(JTAG、UART)或网络漏洞,把恶意固件写进Flash。没有安全启动,设备会乖乖执行这些恶意代码。
- 防回滚攻击:攻击者把设备固件降级到有已知漏洞的旧版本。我见过一个案例,攻击者把路由器固件回滚到三年前的版本,利用那个版本里的后门漏洞,控制了整个内网。
- 防克隆设备:没有安全启动,攻击者可以把你的固件完整复制到另一块硬件上,造出“山寨版”。这在工业控制领域尤其致命。
- 满足合规要求:现在很多行业标准(如IEC 62443、ISO 21434、FIPS 140-3)都明确要求设备具备安全启动能力。不做,就拿不到认证。
注意:安全启动不是万能的。它解决的是“启动过程”的信任问题。如果系统运行起来后存在内存破坏漏洞,攻击者仍然可以绕过安全启动。但反过来,没有安全启动,后续的所有安全措施都建立在沙地上。
1.3 安全启动的信任链模型
信任链模型,是安全启动的骨架。我画了一张图,帮你理解这个模型长什么样。
这张图展示的就是典型的信任链模型。我解释一下每个环节的作用:
| 层级 | 名称 | 特点 | 我的经验 |
|---|---|---|---|
| 1 | 硬件根信任 | 芯片内部不可更改的硬件逻辑,通常包含OTP熔丝存储的公钥哈希 | OTP熔丝一旦烧写就不可逆,所以量产前一定要反复确认公钥的正确性。我见过一个团队烧错了熔丝,整批芯片报废。 |
| 2 | BootROM | 掩膜在芯片内部的只读代码,出厂后无法修改 | BootROM的bug是致命的,因为没法打补丁。所以芯片设计阶段,BootROM的代码审查要做得比任何模块都严格。 |
| 3 | Bootloader第一级 | 通常叫SPL或FSBL,存储在Flash中,由BootROM加载并验证 | 这一级代码要尽量精简,功能越少,攻击面越小。我习惯只保留DDR初始化和Flash驱动。 |
| 4 | Bootloader第二级 | 完整的Bootloader(如U-Boot),负责加载内核 | 这里要特别注意环境变量的保护。U-Boot的环境变量如果没做签名保护,攻击者可以通过修改启动参数绕过安全启动。 |
| 5 | 操作系统内核 | 经过签名的内核镜像,由Bootloader验证后加载 | 内核模块也要签名。我遇到过只签了内核镜像,没签驱动模块,结果攻击者通过加载恶意模块绕过了安全启动。 |
1.4 信任链的两种实现方式
在实际项目中,我见过两种主流的信任链实现方式。它们各有优劣,我简单对比一下:
| 特性 | 链式信任 (Chain of Trust) | 星型信任 (Star of Trust) |
|---|---|---|
| 验证方式 | 每一层验证下一层,逐级传递 | 所有镜像都由BootROM直接验证 |
| 灵活性 | 高,可以灵活添加中间层 | 低,所有镜像必须提前注册 |
| 性能开销 | 逐级验证,启动时间较长 | 一次验证所有镜像,启动更快 |
| 安全性 | 中间层被攻破则后续全失效 | BootROM是唯一信任锚点,攻击面小 |
| 典型应用 | U-Boot + Linux 启动流程 | 高通、MTK等手机平台的早期启动 |
我个人更倾向于链式信任。虽然它启动慢一点,但灵活性高。尤其是在产品迭代过程中,你可能需要增加新的固件分区或中间件层。链式信任让你不用每次都改BootROM。
小技巧:如果你选择链式信任,建议在每一级验证时都记录验证日志到OTP或安全寄存器中。这样在调试阶段,你可以快速定位是哪一级验证失败了。我曾经靠这个技巧,半天就定位了一个因为Flash位翻转导致的启动失败问题。
1.5 一个常见的误区
很多初学者以为,只要给固件加了签名,就是安全启动了。其实不是。
安全启动的核心在于“谁来做验证”。如果验证代码本身是可被篡改的,那签名再强也没用。举个例子,你把签名验证逻辑放在Flash里的Bootloader中,攻击者直接把你的Bootloader替换成不验证签名的版本,那你的签名就形同虚设。
所以,验证逻辑必须放在不可更改的硬件中——要么是BootROM,要么是硬件安全模块(HSM/Secure Element)。这才是信任链的根基。