一、Zephyr安全启动概述

为什么需要安全启动?

说实话,我刚开始接触嵌入式安全时,也觉得安全启动是个「锦上添花」的功能。直到有一次,我在一个物联网项目中,亲眼看到设备被刷入了恶意固件——整个系统完全失控,数据被窃取,设备变成了僵尸网络的一部分。那次教训让我彻底明白了:没有安全启动,你的设备就是裸奔的

安全启动要解决的核心问题其实很简单:你怎么知道设备上跑的程序是「你写的」?

你想想看,嵌入式设备通常部署在物理不可控的环境中。攻击者可以:

  • 通过JTAG/SWD接口直接读取或篡改Flash内容
  • 利用OTA更新机制注入恶意固件
  • 替换启动介质(比如SPI Flash)
  • 利用Bootloader漏洞执行任意代码

嗯,这里要注意:安全启动不是防止固件被读取,而是防止固件被篡改后还能运行。说白了,它建立了一条信任链——从芯片上电的第一条指令开始,每一步都验证下一步的合法性。

核心目标:确保设备只运行经过授权的、未被篡改的固件。

Zephyr安全启动架构

Zephyr的安全启动方案,我个人觉得设计得相当优雅。它没有重新发明轮子,而是整合了业界成熟的方案。目前主流的选择有两个:

方案 特点 适用场景
MCUboot 开源、轻量、支持多种MCU 大多数Zephyr项目
TF-M 基于ARM TrustZone,提供完整安全服务 需要安全隔离的ARM Cortex-M33/M23

我个人的习惯是:能用MCUboot就用MCUboot。为什么?因为它简单、成熟,而且Zephyr对它的支持非常完善。TF-M虽然功能更强,但配置复杂,除非你确实需要TrustZone的安全隔离能力,否则没必要给自己找麻烦。

整个安全启动的流程,大致是这样的:

  1. 芯片上电:ROM代码执行,检查Bootloader的签名
  2. Bootloader启动:MCUboot验证固件镜像的签名
  3. 固件运行:如果签名验证通过,跳转到应用固件
  4. 运行时验证:应用固件可以进一步验证后续加载的模块

这里有个关键点:每一步的验证者,都必须比被验证者更「可信」。这就是信任链的核心思想。

避坑指南:我曾经在一个项目里,把签名验证放在应用固件中执行。结果攻击者直接跳过了Bootloader,把篡改后的固件刷到Flash里,应用固件自己验证自己——这等于没验证。记住:验证者必须比被验证者先执行,且不能被篡改

信任根(RoT)概念

信任根,英文叫Root of Trust,简称RoT。这个概念其实不复杂——它是整个安全体系的「第一块基石」。你想想看,如果连信任根都不安全,那后面所有的验证都是空中楼阁。

信任根通常固化在芯片的ROM或一次性可编程(OTP)存储器中。为什么放在这里?因为:

  • ROM不可修改:芯片出厂后,ROM内容就固定了
  • OTP只能写一次:一旦写入,无法更改
  • 物理防护:现代芯片对ROM和OTP有专门的物理防护措施

信任根包含哪些东西?我总结了一下:

组件 作用 存储位置
公钥哈希 用于验证Bootloader签名 OTP或ROM
ROM Bootloader 芯片上电后执行的第一段代码 ROM
唯一设备密钥 用于设备身份认证 OTP

嗯,这里要特别强调一点:信任根不存储私钥。私钥永远保存在安全的离线环境中。信任根只存储公钥的哈希值,用来验证签名。这个设计很巧妙——即使芯片被物理破解,攻击者也拿不到私钥,无法伪造合法签名。

重要提醒:我曾经见过一个团队,把私钥硬编码在固件中用于签名验证。结果固件被反编译后,私钥直接暴露。攻击者用这个私钥签发了任意固件,整个安全体系瞬间崩塌。记住:私钥永远不要出现在设备端

在Zephyr中,信任根的配置通常通过Kconfig完成。比如:

# 启用MCUboot签名验证
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="path/to/signing-key.pem"

# 配置信任根公钥
CONFIG_MCUBOOT_HW_KEY=y
CONFIG_MCUBOOT_HW_KEY_FILE="path/to/public-key.bin"

我个人建议:在生产环境中,一定要使用硬件信任根。很多MCU(比如NXP的i.MX RT系列、ST的STM32H7系列)都内置了OTP区域,可以用来存储公钥哈希。软件模拟的信任根虽然方便开发,但安全性大打折扣。

最后,我想分享一个经验:安全启动不是一劳永逸的。它只是整个安全体系的第一道防线。你还需要考虑:

  • 安全OTA更新机制
  • 运行时内存保护
  • 安全日志和审计
  • 物理防篡改措施

但话说回来,没有安全启动,后面这些全都白搭。所以,先把这第一道防线扎扎实实建好吧。

一句话总结:信任根是安全启动的「锚点」,MCUboot是Zephyr的「守门员」,签名验证是「通行证」。三者缺一不可。