1. 安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任链模型

各位同学,咱们今天聊一个嵌入式系统里绕不开的话题——安全启动。说实话,我入行那会儿,安全启动还是个“加分项”,很多产品压根不关心。但这些年,从智能家居到车规芯片,从工业控制器到医疗设备,安全启动几乎成了标配。为什么?因为吃过亏的人太多了。

我记得2016年参与过一个IoT网关项目,产品都量产了,结果被爆出固件可以被任意替换。攻击者只需要一个USB转JTAG工具,就能把我们的固件换成恶意版本。那一次,公司紧急召回了两万多台设备,损失惨重。从那以后,我每次做系统设计,安全启动都是第一道防线。

1.1 什么是安全启动

安全启动,说白了就是一套机制。它确保设备每次上电后,运行的代码是厂商签过名的、没有被篡改过的、且版本合法的。

你想想看,设备从ROM里第一条指令开始,到加载完操作系统,中间要经过好几个阶段:BootROM、Bootloader、固件镜像、应用分区。任何一个环节被动了手脚,整个系统就不可信了。安全启动要做的,就是给这条执行链加上“数字锁”。

我习惯把安全启动比作“洋葱模型”。每一层代码在运行之前,都要先验证下一层代码的签名和哈希。只有验证通过,才把执行权交出去。一层套一层,直到整个系统跑起来。

核心要点:安全启动不是单一技术,而是一套从硬件到软件的完整验证链条。它的目标是保证设备只运行经过授权的代码。

1.2 为什么需要安全启动

这个问题,我经常被刚入行的工程师问到。我的回答很简单:没有安全启动,你的设备就是“裸奔”。

具体来说,有四个场景让我觉得安全启动必不可少:

  • 防固件篡改:攻击者通过物理接口(JTAG、UART)或网络漏洞,把恶意固件写进Flash。没有安全启动,设备会乖乖执行这些恶意代码。
  • 防回滚攻击:攻击者把设备固件降级到有已知漏洞的旧版本。我见过一个案例,攻击者把路由器固件回滚到三年前的版本,利用那个版本里的后门漏洞,控制了整个内网。
  • 防克隆设备:没有安全启动,攻击者可以把你的固件完整复制到另一块硬件上,造出“山寨版”。这在工业控制领域尤其致命。
  • 满足合规要求:现在很多行业标准(如IEC 62443、ISO 21434、FIPS 140-3)都明确要求设备具备安全启动能力。不做,就拿不到认证。

注意:安全启动不是万能的。它解决的是“启动过程”的信任问题。如果系统运行起来后存在内存破坏漏洞,攻击者仍然可以绕过安全启动。但反过来,没有安全启动,后续的所有安全措施都建立在沙地上。

1.3 安全启动的信任链模型

信任链模型,是安全启动的骨架。我画了一张图,帮你理解这个模型长什么样。

安全启动信任链模型 安全启动信任链模型 硬件根信任 (Root of Trust) BootROM (不可变代码) Bootloader 第一级 (SPL/FSBL) Bootloader 第二级 (U-Boot/LK) 操作系统内核 (Kernel) 验证方向 每一层在运行前 验证下一层的签名和哈希 验证通过才移交执行权 信任传递 信任从硬件根开始 逐级向上传递 任何一级验证失败则停止启动

这张图展示的就是典型的信任链模型。我解释一下每个环节的作用:

层级 名称 特点 我的经验
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)。这才是信任链的根基。