2. 安全启动基础:可信根、信任链与威胁模型

各位同学,咱们今天聊点实在的。安全启动这个概念,说白了就是解决一个问题:你怎么知道你的设备跑的是你写的代码?

我刚开始做嵌入式安全那会儿,总觉得这玩意儿离我挺远。直到有一次,一个客户的产品在野外被人通过串口把整个固件给换了,设备直接变成了别人的“肉鸡”。嗯,从那以后,我再也不敢轻视安全启动的任何一个环节了。

2.1 可信根(Root of Trust)—— 信任的起点

信任链这个东西,你得有个起点。这个起点就是可信根(RoT)。它必须是绝对可信的,不能被篡改的。

我个人习惯把可信根比作“保险箱的钥匙”。你所有的安全措施,最终都依赖于这把钥匙的绝对安全。在嵌入式系统里,这个“钥匙”通常固化在硬件里。

核心要点:可信根必须是 不可变 且 不可绕过 的。如果攻击者能修改可信根,那整个信任链就崩塌了。

常见的可信根实现方式有几种:

  • ROM 代码(BootROM):芯片出厂时固化在只读存储器中的一段代码。这是最底层的信任锚点。我见过一些芯片,BootROM 里有个 bug,导致攻击者能通过特定电压毛刺让 CPU 跳过这段代码,直接执行外部 Flash 里的恶意程序。所以,BootROM 的硬件防护设计极其重要。
  • 一次性可编程存储器(OTP/eFuse):用于存储公钥哈希、芯片唯一ID、安全配置位。一旦写入,无法修改。我在项目中常用 eFuse 来存储 SM2 公钥的哈希值,用于校验后续加载的固件签名。
  • 硬件安全模块(HSM/SE):独立的加密协处理器,专门负责密钥管理和签名验证。它本身就是一个微型的安全系统。

避坑指南:我曾经在一个项目里,把公钥直接编译进了 BootROM 之后的第二级 Bootloader 里。结果发现,攻击者可以通过替换整个 Flash 内容,连第二级 Bootloader 一起换掉,然后用自己的公钥签名恶意固件。教训就是:公钥的哈希必须存储在 OTP 里,由 BootROM 去校验。

2.2 信任链传递机制 —— 一级验证一级

有了可信根,接下来就是怎么把信任传递下去。这个过程叫信任链传递。你想想看,BootROM 只有几十 KB,它不可能去校验整个 Linux 内核。所以,它只校验下一级加载器,下一级再校验下下一级,直到整个系统启动完成。

这个过程就像接力赛,每一棒都必须确认下一棒是“自己人”。

信任链传递机制(Chain of Trust) BootROM (可信根) Bootloader (SPL/FSBL) OS Loader (U-Boot/EFI) 操作系统 (Kernel/OS) 每一级在加载下一级之前,必须验证其签名 签名校验失败 → 停止启动

这个图很直观。每一级都只信任它的直接下一级。BootROM 验证 Bootloader 的签名,Bootloader 验证 OS Loader 的签名,OS Loader 再验证内核的签名。任何一级验证失败,系统立即停止启动。

注意:信任链的长度不是越长越好。每增加一级,就多一个攻击面。我见过一些设计,Bootloader 分了四五个阶段,结果每个阶段都要从 Flash 里读数据、验签名,启动时间慢得离谱,而且中间某个环节的代码稍微有点漏洞,整个链就断了。我的建议是:尽量缩短信任链,能两级完成的事,不要搞三级。

2.3 安全启动的威胁模型 —— 你在防谁?

做安全设计,第一件事不是写代码,而是想清楚你在防谁。不同的威胁模型,决定了你的安全启动方案要花多少钱、做到什么程度。

我一般把威胁分为几个等级:

威胁等级 攻击者能力 典型攻击手段 防护要求
L1 - 软件攻击 远程或本地,无物理接触 固件替换、缓冲区溢出、提权 签名校验、加密存储
L2 - 简单物理攻击 有物理接触,无专业设备 串口调试、SPI Flash 读取、JTAG 破解 熔丝、调试接口锁定、Flash 加密
L3 - 高级物理攻击 有物理接触,有专业设备 电压毛刺、激光故障注入、探针监听 电压/时钟检测、金属屏蔽层、传感器
L4 - 芯片级逆向 有实验室条件 FIB 修改、电子显微镜读取 ROM 专用安全芯片、防篡改封装

对于大多数物联网设备,我们主要防的是 L1 和 L2 级别的攻击。你想想看,一个智能插座,攻击者犯得着用激光去打它的芯片吗?成本都不够。但如果是车规级 ECU 或者金融支付终端,那 L3、L4 级别的攻击就必须考虑了。

我的经验:做安全启动设计时,先问自己三个问题:

  1. 设备部署环境是否可控?(比如:是放在家里,还是暴露在公共场所?)
  2. 设备被攻破后的损失有多大?(比如:是泄露个温度数据,还是能控制刹车?)
  3. 攻击者的投入产出比是多少?(比如:花 10 万块钱破解一个 100 块的设备,傻子才干。)

想清楚这些,你才知道你的安全启动方案要做到什么程度。

2.4 常见的攻击路径与防御

咱们来看看攻击者通常会从哪些地方下手。说白了,就是信任链上的每一个环节,都可能成为突破口。

  • 攻击点 1:BootROM 漏洞
    • 攻击方式:利用 BootROM 中的缓冲区溢出或逻辑错误,跳过签名校验。
    • 防御:芯片选型时关注 BootROM 的安全审计报告;使用带硬件防回滚的芯片。
  • 攻击点 2:外部 Flash 篡改
    • 攻击方式:直接拆下 Flash 芯片,用编程器写入恶意固件。
    • 防御:Flash 内容加密存储;启用芯片的 Secure Boot 模式,强制校验签名。
  • 攻击点 3:调试接口(JTAG/SWD)
    • 攻击方式:通过调试接口读取内存、寄存器,甚至直接 halt CPU 修改执行流。
    • 防御:量产时永久熔断调试接口(eFuse 烧断 JTAG 使能位)。
  • 攻击点 4:回滚攻击
    • 攻击方式:刷入一个存在已知漏洞的旧版本固件。
    • 防御:实现版本号防回滚机制,Bootloader 在升级时检查版本号是否高于当前版本。

避坑指南:我曾经在一个项目里,只做了签名校验,没做防回滚。结果客户现场的设备被攻击者刷回了一个有后门的旧版本固件,然后利用那个后门远程控制了设备。从那以后,我所有的安全启动方案里,防回滚 和 签名校验 是绑定的,缺一不可。

2.5 小结

安全启动不是某个单一的技术,而是一套信任传递的体系。从硬件可信根出发,一级验证一级,直到整个系统安全运行。同时,你必须清楚你的威胁模型——你在防谁,防到什么程度。

嗯,这一章的内容就到这里。记住,安全设计没有银弹,但如果你连可信根和信任链都没搞明白,那你的系统基本就是裸奔。