4. 固件安全

固件是平台加电后执行的第一段可信代码,它负责初始化内存、芯片组、外设,并最终把控制权交给操作系统引导程序。在多阶段安全启动体系中,固件层是信任链的起点:如果固件被篡改,后续所有签名验证都可能被绕过。因此,理解 UEFI、传统 BIOS、Coreboot 的差异,以及固件签名与验证机制,是构建可信启动链路的基础。

一、核心原理:固件是信任链的根

固件安全的核心目标不是“让固件不可修改”,而是“让固件修改可被检测、可被授权、可被恢复”。平台加电后,CPU 从固定地址取指,执行固件中的第一条指令。此时还没有操作系统、没有杀毒软件、没有内核完整性度量,因此固件必须自己建立第一层信任。

现代平台通常采用“信任根 + 逐级验证”的方式:

  • 信任根(Root of Trust):通常由固化在芯片内的 Boot ROM 或硬件熔丝中的公钥哈希构成,不可被软件改写。
  • 逐级验证:Boot ROM 验证第一阶段固件,第一阶段固件验证第二阶段固件,依此类推,直到引导加载程序和操作系统内核。
  • 度量与记录:每一级在验证通过后,把自身或下一级的哈希值写入 TPM/PCR 或安全寄存器,供后续远程证明或本地策略判断。
  • 恢复路径:当验证失败时,平台应进入恢复模式,而不是直接放行或永久变砖。
固件安全的关键不是“一次验证”,而是“每一级都验证下一级,并且验证结果可被记录、可被审计、可被恢复”。

二、UEFI、BIOS 与 Coreboot 的差异

传统 BIOS 是 16 位实模式固件,接口封闭、扩展性差,安全机制主要依赖写保护、BIOS 密码和可选的 Boot Block 校验。UEFI 是模块化、32/64 位、带驱动模型和协议接口的固件规范,支持 Secure Boot、Measured Boot、 capsule update 等安全能力。Coreboot 则是开源固件框架,强调“最小化硬件初始化 + 快速跳转到 payload”,常与 SeaBIOS、Tianocore、LinuxBoot 等 payload 组合使用。

维度 传统 BIOS UEFI Coreboot
执行模式 16 位实模式为主 32/64 位保护模式 32/64 位,阶段化
模块化 低,整体镜像 高,DXE 驱动模型 高,romstage/ramstage
安全启动 有限,Boot Block 校验 Secure Boot、Measured Boot 依赖 payload 与验证策略
更新机制 厂商工具,风险高 Capsule Update、ESRT Flash 分区更新
典型场景 旧设备、嵌入式 PC、服务器、云主机 Chromebook、服务器、开源平台

三、固件签名与验证机制

固件签名通常采用非对称密码:厂商用私钥对固件镜像或镜像哈希签名,平台用预置公钥或公钥哈希验证。验证流程一般包括:读取固件分区、计算哈希、用公钥验签、检查版本防回滚、写入度量值、决定是否放行。

# 典型固件验证伪代码
firmware_hash = SHA256(firmware_image)
if not RSA_Verify(pubkey, signature, firmware_hash):
    enter_recovery_mode("signature_invalid")
if firmware_version < min_allowed_version:
    enter_recovery_mode("rollback_detected")
tpm_extend(pcr[0], firmware_hash)
jump_to_next_stage()

在 UEFI Secure Boot 中,验证对象是 PE/COFF 格式的引导加载程序和驱动;密钥存储在 KEK、db、dbx 等 UEFI 变量中。db 表示允许的签名证书或哈希,dbx 表示吊销列表。平台固件自身通常由 OEM 签名,并通过 Boot Guard、Verified Boot 等硬件机制在 Boot ROM 阶段验证。

Secure Boot 验证的是“引导链上的下一级”,不是“整个磁盘”。它不替代全盘加密,也不保证操作系统内核之后的模块一定可信。

四、场景与误区复盘

场景一:服务器批量部署时,运维人员关闭 Secure Boot 以兼容旧驱动,结果攻击者替换了引导加载程序,植入内核级 rootkit。复盘:应优先更新驱动签名,而不是关闭验证;若必须关闭,应通过 TPM 度量与远程证明补偿检测。

场景二:Coreboot 平台使用 LinuxBoot 作为 payload,但未对 payload 做签名验证。攻击者修改 flash 中的 payload,即可在早期阶段执行任意代码。复盘:Coreboot 本身不自动提供完整信任链,需要结合 vboot、TPM 或硬件写保护构建验证策略。

常见误区包括:

  • 把“固件写保护”等同于“固件安全”:写保护只防运行时改写,不防供应链篡改或物理刷写。
  • 只验证第一阶段,忽略后续阶段:信任链必须逐级传递,任何一级跳过验证都会形成断点。
  • 忽略防回滚:攻击者可用旧版有漏洞固件替换新版,版本计数器与最小版本策略必须配合使用。
  • 把 Secure Boot 当成万能药:它主要保护引导链,不覆盖固件自身更新、管理引擎和部分外设固件。
固件信任链:从 Boot ROM 到操作系统 Boot ROM 硬件信任根 第一阶段固件 Boot Block / romstage 主固件 UEFI DXE / ramstage 引导加载程序 GRUB / Windows Boot OS 内核 Kernel / initrd 验签 验签 验签 验签 TPM / PCR 度量记录 PCR[0] 固件 · PCR[4] 引导程序 · PCR[8] 内核 每级验证通过后扩展哈希,供远程证明使用 验证失败路径 签名无效 / 哈希不匹配 版本回滚 / 吊销证书 → 进入恢复模式或告警 验证成功路径 公钥验签通过 版本 ≥ 最小允许版本 → 度量并跳转下一级 关键安全机制 Secure Boot / db / dbx Boot Guard / Verified Boot Capsule Update / 防回滚

综上,固件安全不是单一开关,而是一条从 Boot ROM 到操作系统的逐级验证链。UEFI 提供了标准化的 Secure Boot 与度量接口,Coreboot 提供了可审计的开源实现路径,传统 BIOS 则更多依赖硬件写保护和有限校验。真正落地时,需要把签名验证、防回滚、TPM 度量、恢复模式和更新机制组合起来,才能让固件层成为可信启动的坚实起点。