1. 安全启动概述:什么是安全启动、为什么需要安全启动、安全启动的信任根概念

各位好,我是老周。做嵌入式安全这块十几年了,今天咱们聊聊安全启动。

说实话,我刚入行那会儿,压根没把启动安全当回事。那时候觉得,只要应用层代码写好了,系统就能跑。直到有一次,我在一个物联网网关项目里,发现设备被人通过串口刷了第三方固件——整个设备变成了别人的肉鸡。嗯,从那以后,我再也不敢轻视启动过程的安全性了。

1.1 什么是安全启动

安全启动,说白了就是一套机制。它确保设备从通电到操作系统加载完成,每一步执行的代码都是可信的、未被篡改的。

你想想看,设备启动就像盖楼。地基没打好,上面盖得再漂亮也没用。安全启动就是给这个地基加了一道锁——每一层砖都要验证,确认是原厂生产的,才能往上垒。

具体来说,安全启动包含三个核心动作:

  • 度量:计算当前代码的哈希值
  • 验证:将哈希值与签名或预期值比对
  • 执行:验证通过才允许运行

我在一个车规级项目中见过一个典型案例:某款T-Box因为没做安全启动,黑客通过OTA漏洞刷入了恶意Bootloader,结果整车远程控制功能被劫持。后来我们帮他们重新设计了安全启动链路,才把这个问题堵死。

1.2 为什么需要安全启动

这个问题我问过很多刚入行的工程师。有人说是为了防破解,有人说是为了合规。都对,但不够全面。

我总结了几点核心原因:

威胁场景 没有安全启动的后果 我见过的真实案例
固件被篡改 设备执行恶意代码,沦为肉鸡 某智能摄像头被植入挖矿程序
回滚攻击 攻击者刷回有漏洞的旧版本 某路由器被降级后利用已知漏洞
非授权固件 山寨固件导致设备损坏或数据泄露 某工控PLC被刷入第三方固件后失控
启动链劫持 攻击者在启动过程中注入代码 某POS机通过U-Boot漏洞被植入后门

除了这些,还有合规要求。现在很多行业标准都明确要求设备必须支持安全启动:

  • 汽车行业的ISO 21434
  • 工业控制的IEC 62443
  • 金融支付的PCI PTS
  • 消费电子的FIPS 140-3

我曾经帮一家客户过PCI认证,对方的安全启动方案被审计师连问了三个问题:信任根在哪?度量链完整吗?回滚保护做了吗?结果他们一个都答不上来。嗯,后来我们花了两个月重新设计。

1.3 安全启动的信任根概念

信任根,英文叫Root of Trust,简称RoT。这是安全启动里最核心的概念。

什么叫信任根?我打个比方:你手里有一把祖传的钥匙,这把钥匙是绝对可靠的。你用这把钥匙打开第一个箱子,箱子里放着第二把钥匙;再用第二把钥匙打开第二个箱子……以此类推。只要第一把钥匙没问题,整个链条就是可信的。

信任根就是那把祖传钥匙。它是整个安全体系的起点,不可伪造、不可篡改。

在实际系统中,信任根通常固化在硬件里:

  • ROM Bootloader:芯片出厂时烧录在ROM中的代码,只读不可改
  • eFuse:一次性可编程存储,用于存放公钥哈希或芯片唯一密钥
  • HSM/Secure Element:独立的安全芯片,专门负责密钥管理和签名验证

我习惯把信任根分为三个层级:

信任根层级模型

  • 硬件信任根:芯片内部的不可变逻辑,如ROM代码、eFuse
  • 软件信任根:由硬件信任根验证并加载的第一段软件,如Bootloader
  • 运行时信任根:操作系统内核及后续组件的度量基准

这里有个容易踩的坑。我曾经在一个项目里看到,工程师把信任根的公钥放在了Flash里。我说这不叫信任根,这叫信任沙堡——攻击者只要把Flash拆下来读出来,就能替换公钥。真正的信任根必须放在芯片内部,物理上不可读、不可改。

避坑指南:我曾经见过一个团队,把信任根的公钥哈希放在外部Flash,然后用CRC校验完整性。结果攻击者直接修改了Flash内容和CRC值,整个信任链就崩了。记住:信任根必须依赖硬件保护,不能靠软件自校验。

下面这张图展示了典型的信任链传递过程:

安全启动信任链传递示意图 安全启动信任链传递 硬件信任根 ROM Code / eFuse BootROM 验证Bootloader签名 Bootloader 验证OS内核签名 OS内核 验证系统服务签名 系统服务 验证应用签名 关键原则: 每一级只信任上一级,上一级验证下一级。 信任根一旦被攻破,整个链条就失效了。

从这张图你能看到,信任链是一级一级传递的。每一级只信任上一级,上一级验证下一级的完整性和真实性。这就是安全启动的核心逻辑。

我的经验:在设计信任链时,我习惯把验证粒度控制在"最小必要"原则。比如Bootloader只验证OS内核的签名,不验证每个驱动模块。因为验证越多,启动时间越长,而且验证逻辑本身也会增加攻击面。平衡安全性和性能,是架构师的基本功。

最后说一句:信任根不是选配,是标配。如果你的设备连信任根都没有,那安全启动就是空中楼阁。我见过太多项目,安全方案做得花里胡哨,结果信任根放在Flash里——嗯,那还不如不做。