2. 固件安全基础
固件是介于硬件与操作系统之间的“第一层软件”,它负责在设备上电后完成最基础的硬件初始化、自检、参数装载,并把控制权逐级交给更高级的引导程序与操作系统。与普通应用软件不同,固件通常直接驻留在 SPI Flash、eMMC、UFS 或片上 ROM 中,生命周期长、更新频率低、权限层级高,一旦被篡改,攻击者往往可以在操作系统之前获得执行机会,因此固件安全是整个设备可信链的起点。
一、固件概念与启动流程
典型嵌入式或计算设备的启动过程可以抽象为“上电 → 可信根 → 逐级引导 → 操作系统”。以常见的 SoC 平台为例,上电后首先运行的是固化在芯片内部 ROM 中的 BootROM,它不可修改,负责加载第一级引导程序;随后依次经过一级引导(如 BL1/SPL)、二级引导(如 U-Boot/EDK II)、操作系统加载器,最终进入内核。每一级都应当对下一级镜像进行完整性校验和签名验证,形成一条可传递的信任链。
下面用一张信号链与信任传递关系图,展示从硬件可信根到操作系统的逐级验证过程。图中每一级既是上一级的“被验证对象”,又是下一级的“验证者”,这正是可信启动的核心思想。
二、威胁模型:先明确“防谁、防到什么程度”
做固件安全设计,第一步不是选算法,而是建立威胁模型。威胁模型至少要回答四个问题:攻击者是谁、具备什么能力、想达到什么目标、我们愿意付出多少成本。常见攻击者可分为远程网络攻击者、本地恶意软件、物理接触攻击者和供应链攻击者。远程攻击者通常只能通过固件更新通道或带外管理接口下手;物理攻击者则可能直接读取 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.
总结来看,固件安全的基础可以归纳为一条主线:以不可变的硬件可信根为起点,通过逐级签名验证构建信任链,用明确的威胁模型界定防护边界,并针对 Flash、调试口、更新通道、配置区和密钥存储等攻击面分别设计缓解措施。只有把“概念—流程—威胁—攻击面—可信根”串成闭环,后续的签名算法、密钥管理和完整性验证技术才有稳固的落点。