4. Secure Boot 核心组件

UEFI Secure Boot 的安全模型建立在四个核心数据库之上:平台密钥(PK)、密钥交换密钥(KEK)、签名数据库(db) 和 禁止签名数据库(dbx)。这四个组件构成了一个从平台所有者到最终可执行文件的信任链,任何一环的缺失或配置错误都会导致安全启动失败。

4.1 组件概述与层级关系

四个组件按照权限从高到低形成严格的层级结构。PK 位于最顶层,拥有最高权限;KEK 负责管理签名数据库的更新;db 和 dbx 直接决定哪些二进制文件可以执行。下表总结了每个组件的核心属性:

组件 全称 存储位置 主要功能 更新权限
PK Platform Key UEFI 非易失性变量(PK) 建立平台所有者对固件的控制权 仅 PK 自身(物理存在)
KEK Key Exchange Key UEFI 非易失性变量(KEK) 授权对 db/dbx 的更新操作 PK
db Signature Database UEFI 非易失性变量(db) 存储受信任的签名/证书/哈希 KEK
dbx Forbidden Signature Database UEFI 非易失性变量(dbx) 存储被撤销的签名/证书/哈希 KEK
关键概念: PK 是信任的根,通常由平台制造商(OEM)在出厂时写入。KEK 是信任的桥梁,操作系统厂商(如 Microsoft)的证书通常作为 KEK 被预置。db 和 dbx 是执行策略的最终裁决者。

4.2 平台密钥(PK)

PK 是 Secure Boot 信任链的根锚点。它唯一标识平台的所有者。在固件层面,PK 是一个 UEFI 变量,存储一个或多个公钥证书(X.509)。

  • 角色: 平台所有者(OEM 或最终用户)的数字身份。
  • 权限: 只有使用与 PK 对应的私钥签名的更新请求,才能修改 PK 本身或 KEK 变量。
  • 状态: PK 可以处于“已注册”或“未注册”状态。未注册时,Secure Boot 处于“设置模式”(Setup Mode),允许任何实体更新 KEK 和 db/dbx。一旦 PK 被注册,系统进入“用户模式”(User Mode),所有更新必须经过签名验证。
  • 更新流程: 更新 PK 需要物理存在验证(通常通过 BIOS 设置界面)或使用当前 PK 私钥签名的更新请求。
安全警告: 丢失 PK 私钥意味着永久失去对平台 Secure Boot 策略的控制权。OEM 必须安全保管 PK 私钥,通常存储在硬件安全模块(HSM)中。

4.3 密钥交换密钥(KEK)

KEK 是 PK 与 db/dbx 之间的授权代理。它定义了哪些实体有权更新签名数据库。KEK 变量可以包含多个公钥证书。

  • 角色: 授权签名数据库更新的中间信任节点。
  • 权限: 使用 KEK 私钥签名的更新请求可以添加、删除或替换 db 和 dbx 中的条目。
  • 典型配置: 大多数 x86 平台预置 Microsoft 的 KEK 证书,允许 Windows 操作系统通过安全更新机制(如 Windows Update)更新 db/dbx。
  • 与 PK 的关系: KEK 的更新必须由 PK 签名。这确保了只有平台所有者才能决定谁有权管理签名数据库。

4.4 签名数据库(db)

db 是 Secure Boot 的白名单。它包含受信任的签名者证书、具体二进制文件的哈希值或经过签名的允许列表。当固件加载一个 EFI 可执行文件(如 bootloader、Option ROM、UEFI 驱动)时,会将其签名与 db 中的条目进行匹配。

  • 匹配规则:
    1. 如果文件的数字签名链中的任何证书在 db 中,则允许执行。
    2. 如果文件的哈希值在 db 中,则允许执行。
    3. 如果文件未签名且 db 中允许未签名执行(通常不推荐),则允许执行。
  • 内容类型: X.509 证书、RSA-2048 密钥、SHA-256 哈希、EFI_CERT_TYPE 等。
  • 管理: 通过 KEK 签名的更新请求进行管理。操作系统厂商会定期发布包含新受信任证书的 db 更新。

4.5 禁止签名数据库(dbx)

dbx 是 Secure Boot 的黑名单。它包含已知不安全、已撤销或已过期的签名证书、哈希值。dbx 的优先级高于 db:如果一个文件同时匹配 db 和 dbx,则禁止执行。

  • 角色: 撤销受信任实体的信任,应对安全漏洞和证书泄露。
  • 更新机制: 通过 KEK 签名的更新请求进行更新。Microsoft 通过 Windows Update 定期推送 dbx 更新,以撤销被攻破的 bootloader 或证书。
  • 典型用例: 当发现某个版本的 GRUB2 存在 BootHole 漏洞时,其签名哈希会被加入 dbx,阻止所有使用该版本 GRUB2 的系统启动。
  • 大小限制: dbx 变量有大小限制(通常为 64KB 或 128KB),因此需要谨慎管理条目数量。

4.6 核心组件交互流程

下图展示了 Secure Boot 启动过程中四个核心组件的交互关系:

Secure Boot 核心组件交互流程 Secure Boot 核心组件交互流程 平台密钥 (PK) 密钥交换密钥 (KEK) 签名数据库 (db) 禁止签名数据库 (dbx) EFI 可执行文件 (Bootloader/驱动) 签名授权 签名授权更新 签名授权更新 白名单匹配 黑名单匹配 说明:PK 授权 KEK 更新,KEK 授权 db/dbx 更新。启动时,EFI 可执行文件依次与 db(白名单)和 dbx(黑名单)匹配。 dbx 优先级高于 db,匹配 dbx 则直接禁止执行。

4.7 组件关系与信任链

四个组件共同构建了 Secure Boot 的信任链模型。下图展示了从平台所有者到最终可执行文件的完整信任传递路径:

Secure Boot 信任链模型 Secure Boot 信任链模型 平台所有者 (OEM/用户) PK 根信任锚点 KEK 授权代理 db / dbx 策略执行 信任传递:平台所有者 → PK → KEK → db/dbx → EFI 可执行文件 每一级都通过数字签名验证下一级的更新请求,形成不可篡改的信任链。 关键安全属性 • PK 私钥丢失 → 平台锁定,无法更新任何 Secure Boot 策略 • KEK 私钥泄露 → 攻击者可任意修改 db/dbx,绕过安全启动

4.8 实际开发中的注意事项

开发实践要点:
  • PK 管理: 在固件开发阶段,建议使用测试 PK 证书,并确保在量产前替换为生产证书。测试 PK 私钥必须严格隔离。
  • KEK 配置: 对于支持多操作系统的平台,KEK 应包含所有目标 OS 厂商的证书。例如,同时支持 Windows 和 Linux 的机器需要包含 Microsoft 和特定 Linux 发行版的 KEK。
  • db 更新策略: 避免在 db 中存储过多哈希值,优先使用证书链。哈希值更新需要重新签名整个 db 变量,效率较低。
  • dbx 容量规划: 由于 dbx 变量大小有限,建议仅存储关键安全更新(如已知漏洞的 bootloader 哈希)。定期清理过期条目。
  • 测试方法: 使用 KeyTool.efi 或 EfiShell 中的 dbxupdate 命令在开发板上手动测试 PK/KEK/db/dbx 的更新流程。

4.9 常见配置错误与排查

错误场景 现象 根因 解决方案
PK 未注册 Secure Boot 处于 Setup Mode,任何实体可修改策略 出厂时未写入 PK 或 PK 被清除 通过 BIOS 设置或工具注册 PK 证书
KEK 缺失 无法通过操作系统更新 db/dbx KEK 变量为空或不包含 OS 厂商证书 使用 PK 签名添加正确的 KEK 证书
db 中缺少 bootloader 签名 系统无法启动,显示 Secure Boot 违规 bootloader 的签名证书不在 db 中 将 bootloader 证书或哈希添加到 db
dbx 误添加 合法的 bootloader 被阻止启动 错误的哈希或证书被加入 dbx 使用 KEK 签名从 dbx 中移除错误条目
变量空间不足 更新 db/dbx 时返回 EFI_OUT_OF_RESOURCES UEFI 变量存储空间耗尽 清理无效条目或扩大 NVRAM 分区
调试技巧: 在 UEFI Shell 中使用 dmpstore -d PK、dmpstore -d KEK、dmpstore -d db、dmpstore -d dbx 命令查看当前变量内容。使用 var-check PK 验证变量属性。