3、安全启动技术原理:UEFI安全启动流程、信任链、平台密钥(PK/KEK/db/dbx)
安全启动(Secure Boot)是 UEFI 2.3.1 规范中定义的一项关键安全特性,旨在防止在系统启动过程中加载和执行未经签名的恶意代码(如 Bootkit、Rootkit)。其核心机制是通过数字签名和公钥基础设施(PKI)构建一条从固件到操作系统的信任链,确保每个启动组件都经过授权且未被篡改。
3.1 UEFI 安全启动流程
安全启动的验证流程发生在 CPU 重置之后、操作系统加载之前。整个流程分为四个主要阶段,每个阶段都会验证下一阶段组件的数字签名。
核心原则: 只有使用存储在 UEFI 非易失性 RAM(NVRAM)中受信任公钥签名的启动组件,才被允许执行。任何签名验证失败都会导致启动中止,并显示安全违规错误。
3.2 信任链模型
安全启动的信任链是一个逐级验证的链式结构,从硬件固件开始,一直延伸到操作系统内核。每一级都负责验证下一级的数字签名,确保整个启动过程的可信性。
| 信任链层级 |
组件 |
签名者 |
验证方式 |
| 第1级(根信任) |
UEFI 固件(BIOS) |
OEM 厂商 |
硬件熔断(不可更改) |
| 第2级 |
固件引导块(IBB) |
OEM 厂商 |
使用内嵌公钥验证 |
| 第3级 |
UEFI 驱动(Option ROM) |
驱动开发商 |
使用 db 数据库验证 |
| 第4级 |
启动管理器(Boot Manager) |
操作系统厂商 |
使用 db/dbx 数据库验证 |
| 第5级 |
操作系统内核 |
操作系统厂商 |
使用 db 数据库验证 |
信任根(Root of Trust): 信任链的起点是 UEFI 固件中的初始引导块(IBB),其哈希值被固化在 CPU 或芯片组的熔断(Fuse)中,物理上不可篡改。这是整个安全启动信任模型的基础。
3.3 平台密钥体系(PK/KEK/db/dbx)
UEFI 安全启动使用四类密钥/数据库来管理签名验证策略。这些密钥存储在 UEFI NVRAM 中,由固件和操作系统共同维护。
3.3.1 平台密钥(PK)
PK 是安全启动的最高权限密钥,由 OEM 厂商在出厂时写入。PK 的公钥用于验证 KEK 的更新请求。只有拥有 PK 私钥的实体才能修改 KEK 列表。PK 通常只有一个,但规范允许存在多个 PK。
3.3.2 密钥交换密钥(KEK)
KEK 用于签署对 db 和 dbx 数据库的更新。操作系统厂商(如 Microsoft)会将自己的 KEK 公钥注册到 UEFI 固件中。当操作系统需要更新签名数据库时,必须使用 KEK 私钥对更新请求进行签名。
3.3.3 签名数据库(db)
db 是一个包含受信任签名者证书或镜像哈希的数据库。所有在启动过程中加载的 UEFI 驱动、启动管理器、操作系统加载器,其数字签名必须与 db 中的某个条目匹配,才能通过验证。
3.3.4 撤销数据库(dbx)
dbx 用于存储已被撤销的签名或哈希。如果某个签名或镜像哈希同时出现在 db 和 dbx 中,dbx 具有更高优先级,该组件将被拒绝执行。dbx 通常用于吊销已知存在安全漏洞的旧版驱动或启动加载器。
重要提示: 在驱动开发中,如果驱动需要被安全启动系统加载,其数字证书必须被添加到目标系统的 db 数据库中,或者由已存在于 db 中的证书链进行签名。对于 WHQL 认证驱动,Microsoft 的交叉签名证书会自动被大多数 Windows 系统的 db 数据库信任。
3.4 安全启动验证决策逻辑
当 UEFI 固件需要验证一个启动组件时,会按照以下优先级顺序进行决策:
- 检查 dbx: 如果组件的签名或哈希存在于 dbx 中,直接拒绝执行。
- 检查 db: 如果组件的签名或哈希存在于 db 中,允许执行。
- 检查证书链: 如果组件由 db 中证书链签发的证书签名,允许执行。
- 检查 Setup Mode: 如果系统处于 Setup Mode(自定义模式),允许执行任何未签名组件。
- 默认拒绝: 如果以上条件均不满足,拒绝执行并报安全违规。
| 验证结果 |
系统行为 |
用户可见提示 |
| 签名匹配 db |
允许执行 |
无 |
| 签名匹配 dbx |
拒绝执行,启动中止 |
安全违规:无法验证签名 |
| 签名不在 db/dbx |
拒绝执行,启动中止 |
安全违规:未签名或签名无效 |
| 系统处于 Setup Mode |
允许执行(无验证) |
无(但系统不安全) |
3.5 安全启动与驱动签名的关系
对于 Windows 驱动开发者而言,安全启动直接影响驱动在目标系统上的加载行为:
- 内核模式驱动: 在启用安全启动的 Windows 系统上,所有内核模式驱动必须经过数字签名,且签名证书必须链接到 Microsoft 根证书或位于本地 db 中。
- 启动驱动(Boot Driver): 在启动过程中加载的驱动(如文件系统驱动、磁盘驱动)必须使用 /ac 参数进行交叉签名,或通过 WHQL 认证获得 Microsoft 签名。
- 驱动测试: 在开发阶段,可以通过禁用安全启动或启用测试签名模式(Bcdedit -set TESTSIGNING ON)来加载未签名驱动,但生产环境必须关闭此模式。
调试建议: 当驱动在启用安全启动的系统上加载失败时,应首先检查:
1. 驱动是否已正确签名(使用 signtool 验证)。
2. 签名证书链是否完整且受信任。
3. 驱动是否被添加到 dbx 撤销列表(检查 Windows Update 历史)。
4. 系统是否处于 Secure Boot 启用状态(msinfo32 查看)。
3.6 安全启动状态与模式
UEFI 安全启动支持三种运行模式,不同模式下验证策略有所不同:
| 模式 |
描述 |
签名验证 |
典型场景 |
| User Mode |
标准安全启动模式 |
强制验证所有启动组件 |
生产环境、企业部署 |
| Setup Mode |
自定义模式,允许修改密钥 |
不强制验证 |
OEM 出厂配置、密钥管理 |
| Custom Mode |
用户自定义密钥模式 |
使用用户提供的密钥验证 |
Linux 发行版、自定义系统 |
在驱动开发和调试过程中,理解安全启动的信任链和密钥体系至关重要。只有通过 WHQL 认证或正确签名的驱动,才能在启用安全启动的生产环境中被系统信任和加载。