4. 安全启动链:BootROM校验Bootloader、Bootloader校验系统内核、内核校验应用固件
安全启动链,说白了就是给设备装上一道「信任的传送带」。
从芯片上电的第一行代码开始,每一级都只信任上一级签过名的东西。只要有一环被篡改,整条链就断了,设备直接罢工。
我在项目中见过太多「裸奔」的设备——Bootloader 随便刷、内核随便换、应用固件随便改。结果呢?被植入后门、被提取密钥、被当成肉鸡。嗯,今天我们就来把这根链条焊死。
4.1 信任根:BootROM 做了什么
芯片上电后,CPU 执行的第一段代码是 BootROM。这段代码固化在芯片内部,物理上无法修改。
BootROM 的任务很简单:验证 Bootloader 的签名。
核心逻辑:BootROM 内部烧录了芯片厂商的公钥(通常是 RSA 或 ECC 公钥)。它用这把公钥去解密 Bootloader 的签名,如果匹配,才把控制权交给 Bootloader。
我个人习惯把 BootROM 比作「看门大爷」。他不认识你是谁,他只认你手里的工牌(签名)。工牌不对,门都不开。
避坑指南:我曾经遇到一个项目,BootROM 的公钥竟然可以通过 JTAG 接口读取并修改。这相当于看门大爷的工牌样本被公开了。后来我们强制熔断了 JTAG 保险丝,才堵住这个漏洞。
4.2 Bootloader 校验系统内核
BootROM 放行后,Bootloader 开始运行。它要做的第一件事——校验内核镜像的完整性。
这里通常有两种做法:
| 校验方式 | 原理 | 安全性 | 我推荐吗? |
|---|---|---|---|
| 哈希校验 | Bootloader 计算内核的 SHA256 值,与存储的哈希值对比 | 中等(哈希值本身可能被篡改) | 不推荐单独使用 |
| 签名校验 | Bootloader 用公钥验证内核的数字签名 | 高(私钥在服务器端) | 强烈推荐 |
| 加密+签名 | 内核镜像先加密再签名,Bootloader 解密后校验 | 极高(防逆向+防篡改) | 对安全要求极高的场景 |
你想想看,如果只做哈希校验,攻击者完全可以同时替换内核和哈希值。签名校验就不一样了——攻击者没有私钥,伪造不了签名。
注意:Bootloader 自身的公钥必须存储在安全区域(如 eFuse 或 OTP)。如果公钥可以被篡改,那整个信任链就崩塌了。
4.3 内核校验应用固件
内核启动后,挂载根文件系统,然后加载应用固件。这一步很多人会忽略——觉得内核都起来了,应用固件还校验什么?
大错特错。
我在项目中遇到过这样的情况:攻击者通过漏洞拿到了用户态权限,然后替换了应用固件。因为内核没有校验应用固件的签名,攻击者成功植入了恶意程序。设备看起来正常运行,实际上已经在向外发送数据了。
内核校验应用固件,通常通过以下机制实现:
- IMA(Integrity Measurement Architecture):内核在加载可执行文件时,自动计算哈希并与扩展属性中的签名对比。
- dm-verity:对只读分区进行块级别的哈希校验,任何篡改都会导致 I/O 错误。
- 应用层签名验证:应用固件自身携带签名,内核或 init 进程在启动应用前调用验证接口。
我的建议:对于 IoT 设备,优先使用 dm-verity 保护根文件系统。它不需要修改应用代码,而且校验粒度细到每个块,篡改后立即失效。
4.4 整条链的信任传递
把上面三节串起来,就是一条完整的信任链:
BootROM (固化公钥)
│
├── 校验 Bootloader 签名
│ └── 通过 → 执行 Bootloader
│
Bootloader (存储公钥)
│
├── 校验内核签名
│ └── 通过 → 启动内核
│
内核 (内置公钥或使用内核模块)
│
├── 校验应用固件签名 (dm-verity / IMA)
│ └── 通过 → 运行应用
│
应用固件 (正常运行)
每一级都只信任上一级签过名的东西。只要有一环校验失败,设备就进入「安全模式」或直接死机。
下面这张图可以更直观地展示这个流程:
4.5 实现中的几个关键点
光有理论不够,落地时这几个坑你得提前知道:
- 公钥存储位置:BootROM 的公钥必须熔断在 eFuse 中,Bootloader 的公钥可以放在 OTP 或安全 Flash 区域。绝对不能放在普通 Flash 里。
- 签名算法选择:我个人习惯用 ECDSA(P-256)而不是 RSA。同样的安全强度下,ECDSA 的签名更短,计算更快,对 IoT 设备更友好。
- 回滚保护:安全启动链还要配合版本号检查。我曾经见过一个设备,攻击者刷回旧版本固件(有已知漏洞),因为没做版本号校验,安全启动链形同虚设。
- 调试接口:量产设备必须禁用 JTAG/SWD 等调试接口。否则攻击者可以直接 halt CPU,读取内存中的公钥或签名数据。
重要提醒:安全启动链不是「配置完就完事」的东西。每次固件更新,都要重新签名并更新版本号。我见过太多团队,第一次部署时做得很好,后续 OTA 更新时忘了签名,导致设备变砖。
4.6 小结
安全启动链的本质,就是建立一条从硬件到应用的信任传递路径。BootROM 信任 Bootloader,Bootloader 信任内核,内核信任应用固件。每一环都通过数字签名来验证。
你想想看,如果这条链断了,攻击者就能在任意环节植入恶意代码。所以,别偷懒,把每一环都焊死。