4. 安全启动:基于HSM的信任根建立、镜像校验与安全启动流程

安全启动,说白了就是给ECU装一把「锁」。这把锁要确保:只有我签过名的、没被篡改的固件,才能跑起来。你想想看,如果攻击者往你的车机里刷了个恶意固件,那后果……嗯,我在项目里见过一次,整台车的CAN总线被接管,刹车信号都能伪造。

那HSM在这里扮演什么角色?它就是那个「锁芯」。硬件级的信任根,软件改不了,物理也撬不开。今天我们就来拆解这个流程。

4.1 信任根:一切安全的起点

信任根(Root of Trust, RoT)是安全启动的基石。它必须满足三个条件:

  • 不可篡改:存储在HSM的OTP(一次性可编程)区域或ROM里
  • 不可旁路:上电后第一个执行的代码必须是它
  • 不可伪造:私钥永远不出HSM

我个人习惯把信任根分成两级:

层级 存储位置 作用
硬件信任根 HSM ROM / OTP 存储HSM自身固件、公钥哈希、芯片唯一ID
软件信任根 BootROM 第一级启动代码,验证下一级镜像

关键点:硬件信任根是「根」,软件信任根是「枝」。根坏了,整棵树都倒。所以HSM的OTP区域,我建议在产线烧录后就锁死,连调试接口都封掉。

4.2 镜像校验:签名与哈希的配合

镜像校验不是简单的「比个哈希」。它是一套密码学协议。我遇到过有人只做CRC校验,结果被攻击者轻松绕过——CRC没有抗碰撞性,改完镜像重新算一个就行。

正确的做法是:数字签名 + 哈希。

4.2.1 签名生成(在服务器端)

  1. 计算固件镜像的哈希值(SHA-256或SHA-384)
  2. 用HSM私钥对哈希值签名(ECDSA或RSA-PSS)
  3. 将签名附加到固件镜像尾部

4.2.2 签名验证(在ECU端)

  1. 读取固件镜像,计算哈希值
  2. 从HSM中读取公钥(存储在OTP中)
  3. HSM硬件加速验证签名:签名中的哈希 == 计算出的哈希?
  4. 验证通过 → 允许启动;验证失败 → 进入恢复模式

避坑指南:我曾经在一个项目里发现,有人把公钥存在Flash里。结果攻击者替换了公钥和自己的签名,轻松绕过校验。记住:公钥必须存储在HSM的OTP或ROM里,且只能读,不能写。

4.3 安全启动流程:从复位到应用

安全启动是一个链式信任传递过程。每一级只验证下一级,环环相扣。我画了一张流程图,你看一眼就明白了。

安全启动链式信任流程 安全启动链式信任流程 硬件复位 BootROM 执行(信任根) HSM 初始化 & 密钥加载 验证 Bootloader 签名 ✅ 通过 → 启动Bootloader ❌ 失败 → 恢复模式 Bootloader 验证通过后,继续以同样方式验证 Application 镜像

流程其实不复杂,但每一步都有坑。我挑几个重点说说。

4.3.1 第一级:BootROM

BootROM是芯片上电后第一个执行的代码。它固化在ROM里,改不了。它的任务很简单:初始化HSM,然后验证Bootloader的签名。

注意:BootROM里不能有复杂逻辑。我见过一个设计,BootROM里塞了USB驱动和文件系统,结果一个缓冲区溢出漏洞让攻击者跳过了签名校验。BootROM越简单越好,最好只做三件事:初始化HSM、读镜像头、调用HSM验签。

4.3.2 第二级:Bootloader

Bootloader是真正的「看门人」。它负责:

  • 验证Application镜像的签名
  • 管理固件升级(回滚保护、版本检查)
  • 提供恢复模式(当镜像校验失败时)

我个人习惯在Bootloader里加一个「版本回滚锁」。如果新固件版本号低于当前运行版本,直接拒绝启动。为什么?因为攻击者经常用旧版本固件(含有已知漏洞)来降级攻击。

4.3.3 第三级:Application

Application是最终运行的业务固件。它不需要再验证别人,但运行时可以调用HSM做「运行时完整性检查」——比如定期校验自己的代码段哈希。嗯,这个我们后面章节会细讲。

4.4 关键参数与配置

实际项目中,安全启动的配置项很多。我整理了一个常用参数表:

参数 推荐值 说明
签名算法 ECDSA P-256 / RSA 2048 兼顾性能与安全性
哈希算法 SHA-256 足够安全,硬件加速支持好
公钥存储 HSM OTP 一次性编程,不可改写
回滚保护 版本计数器(单调递增) 存储在HSM NVM中
恢复模式 UDS 0x38 服务 通过诊断刷写合法固件

经验之谈:ECDSA P-256在HSM硬件加速下,一次验签大约5-10ms。RSA 2048会慢一些,大约20-30ms。如果ECU有严格的启动时间要求(比如<100ms),我建议用ECDSA。

4.5 常见攻击与防御

安全启动不是万能的。我见过几种绕过手法:

  • 电压毛刺攻击:在签名校验时注入电压毛刺,让CPU跳过校验指令。防御:HSM内部有独立的电压监测器,检测到异常直接复位。
  • 时钟毛刺攻击:类似电压毛刺,但针对时钟。防御:HSM使用内部PLL,不依赖外部时钟。
  • JTAG/SWD调试接口攻击:通过调试接口读取内存或跳过校验。防御:产线烧录后熔断调试保险丝(eFuse)。
  • 回滚攻击:刷回旧版本固件。防御:版本计数器存储在HSM NVM中,只增不减。

重要提醒:我曾经在一个项目里发现,攻击者通过SPI接口直接读取了外部Flash里的固件,然后修改了签名校验逻辑。为什么?因为Bootloader代码也在同一个Flash里。解决方案:把Bootloader放在内部Flash或HSM管理的安全区域,外部Flash只存Application镜像。

4.6 小结

安全启动的核心就三句话:

  1. 信任根要硬:存储在HSM的OTP/ROM里,软件改不了。
  2. 链式验证要严:每一级只信任下一级的签名,环环相扣。
  3. 回滚保护要牢:版本计数器锁死在HSM里,只增不减。

嗯,做到这三点,你的ECU基本就安全了。当然,攻击者不会轻易放弃——他们可能会盯着你的产线、你的OTA通道、你的调试接口。但至少,安全启动把最基础的「门」给锁死了。