2. 固件安全基础

固件是介于硬件与操作系统之间的“第一层软件”,它负责在设备上电后完成最基础的硬件初始化、自检、参数装载,并把控制权逐级交给更高级的引导程序与操作系统。与普通应用软件不同,固件通常直接驻留在 SPI Flash、eMMC、UFS 或片上 ROM 中,生命周期长、更新频率低、权限层级高,一旦被篡改,攻击者往往可以在操作系统之前获得执行机会,因此固件安全是整个设备可信链的起点。

一、固件概念与启动流程

典型嵌入式或计算设备的启动过程可以抽象为“上电 → 可信根 → 逐级引导 → 操作系统”。以常见的 SoC 平台为例,上电后首先运行的是固化在芯片内部 ROM 中的 BootROM,它不可修改,负责加载第一级引导程序;随后依次经过一级引导(如 BL1/SPL)、二级引导(如 U-Boot/EDK II)、操作系统加载器,最终进入内核。每一级都应当对下一级镜像进行完整性校验和签名验证,形成一条可传递的信任链。

下面用一张信号链与信任传递关系图,展示从硬件可信根到操作系统的逐级验证过程。图中每一级既是上一级的“被验证对象”,又是下一级的“验证者”,这正是可信启动的核心思想。

固件启动流程与信任链传递 硬件可信根 BootROM / eFuse 公钥哈希 · 不可改 一级引导 BL1 SPL / 最小初始化 验签后跳转 二级引导 BL2 U-Boot / EDK II 加载内核镜像 操作系统内核 Linux / RTOS dm-verity 等 验签 验签 验签 信任链:每一级验证下一级镜像的签名与完整性,验证失败则停止启动或进入恢复模式 常见攻击面 • SPI Flash 物理读取/改写 • 调试口 JTAG/UART 滥用 • 固件更新包未签名 • 回滚到含漏洞旧版本 可信根基本思想 • 起点不可变:ROM/eFuse • 公钥哈希预置,防替换 • 逐级度量与验签 • 失败即停,不降级信任 威胁模型要点 • 攻击者能力:物理/远程 • 目标:持久化控制 • 边界:ROM 与 eFuse 之外 • 假设:OS 可能已失陷

二、威胁模型:先明确“防谁、防到什么程度”

做固件安全设计,第一步不是选算法,而是建立威胁模型。威胁模型至少要回答四个问题:攻击者是谁、具备什么能力、想达到什么目标、我们愿意付出多少成本。常见攻击者可分为远程网络攻击者、本地恶意软件、物理接触攻击者和供应链攻击者。远程攻击者通常只能通过固件更新通道或带外管理接口下手;物理攻击者则可能直接读取 Flash、短接调试点、做故障注入。二者对应的防护强度完全不同。

一个实用的威胁模型清单如下:

  • 资产:BootROM 公钥哈希、各级引导镜像、设备密钥、固件更新包、调试接口。
  • 攻击者能力:是否可物理接触、是否可控制更新服务器、是否可降级版本、是否可读取总线。
  • 攻击目标:植入持久化后门、绕过安全启动、提取密钥、拒绝服务。
  • 安全假设:ROM 与 eFuse 不可改;OS 可能已失陷;网络不可信。
威胁模型不是一次性文档。每当新增一个调试接口、一条固件更新通道或一个外部存储介质,都应重新评估攻击面是否扩大。

三、常见攻击面与典型场景

固件攻击面可以按“启动前、启动中、启动后”三个阶段划分。启动前主要是物理与供应链攻击面,例如 Flash 芯片可被夹取读取、调试口未熔断、产线密钥泄露。启动中集中在镜像加载与验签逻辑,例如验签公钥被替换、签名校验被条件跳过、回滚保护缺失。启动后则包括运行时固件更新、SMM/TrustZone 等特权环境、以及带外管理接口。

攻击面 典型攻击手法 后果 基础缓解方向
SPI Flash 离线读取、整片替换 植入持久化固件 签名校验、Flash 加密、写保护
调试接口 JTAG/UART 读写内存 绕过启动校验 熔断调试口、认证调试
固件更新 降级、重放、中间人 回滚到漏洞版本 版本单调递增、签名+防回滚
引导配置 篡改环境变量、启动脚本 加载未签名镜像 配置区签名、只读化
密钥存储 提取对称密钥或私钥 伪造合法固件 密钥封装、HSM、安全存储

四、可信根的基本思想与工程误区

可信根(Root of Trust)的核心是“从一个不可变的起点出发,逐级验证,信任可传递但不可跳跃”。这个起点通常由芯片 ROM 代码和一次性可编程的 eFuse 共同构成:ROM 代码不可修改,eFuse 中烧录了根公钥的哈希。BootROM 用该公钥验证一级引导,一级引导再验证二级引导,依此类推。任何一级验证失败,系统应停止启动或进入受限恢复模式,而不是“忽略错误继续启动”。

工程实践中常见的误区有三类。第一,把“有签名”等同于“安全”,却忽略了验签公钥本身是否可被替换;第二,只做完整性哈希而不做签名,攻击者可以同时替换镜像和哈希;第三,缺少防回滚设计,攻击者用旧版本固件配合已知漏洞即可绕过新版本修复。下面是一段典型的验签失败日志,说明启动链在何处被截断:

[BOOTROM] Loading BL1 from SPI offset 0x0000
[BOOTROM] Verifying BL1 signature with eFuse root key hash...
[BOOTROM] ERROR: signature mismatch (expected 0x9f3a..., got 0x1c7e...)
[BOOTROM] Secure boot failed, entering recovery mode
[BOOTROM] System halted.
可信根一旦被绕过,后续所有安全机制都建立在不可信的基础之上。因此,ROM 与 eFuse 的配置、密钥烧录流程、产线安全必须作为最高优先级资产来管理。

总结来看,固件安全的基础可以归纳为一条主线:以不可变的硬件可信根为起点,通过逐级签名验证构建信任链,用明确的威胁模型界定防护边界,并针对 Flash、调试口、更新通道、配置区和密钥存储等攻击面分别设计缓解措施。只有把“概念—流程—威胁—攻击面—可信根”串成闭环,后续的签名算法、密钥管理和完整性验证技术才有稳固的落点。