UEFI Secure Boot开发实战 - 第1节
1.1 什么是 Secure Boot
Secure Boot(安全启动)是 UEFI 规范中定义的一项安全机制,旨在确保平台在启动过程中只执行经过数字签名的可信代码。它从固件层面构建了一条从硬件复位到操作系统加载的信任链,防止恶意软件、Rootkit 或未经授权的引导程序在系统启动阶段注入。
核心思想: 在启动的每个阶段,只有持有有效数字签名的代码才能被执行,签名验证失败则拒绝启动。
信任链模型
Secure Boot 的信任链从平台固件内置的初始公钥(PK)开始,逐级验证后续组件的签名:
- 平台密钥(PK): 由平台所有者持有,用于建立对密钥交换密钥(KEK)的信任。
- 密钥交换密钥(KEK): 用于签署签名数据库(db)和禁止签名数据库(dbx)的更新。
- 签名数据库(db): 存储被允许执行的签名或证书。
- 禁止签名数据库(dbx): 存储被明确禁止执行的签名或证书。
1.2 UEFI 安全启动的起源与目的
起源背景
在传统 BIOS 时代,启动过程没有任何签名验证机制。恶意软件可以在操作系统加载之前注入引导扇区或修改 Option ROM,从而完全控制系统。2011 年,微软为 Windows 8 的硬件认证引入了 Secure Boot 要求,推动了 UEFI 安全启动的广泛采用。
设计目的
| 目的 | 说明 |
|---|---|
| 防止 Bootkit 攻击 | 阻止恶意软件在操作系统启动前获得控制权 |
| 确保系统完整性 | 保证只有经过签名的可信固件和引导程序可以运行 |
| 支持多操作系统 | 通过 db 数据库允许合法操作系统和引导程序加入信任链 |
| 提供平台所有权 | 平台所有者可以通过 PK 控制哪些代码可以执行 |
关键里程碑: UEFI 2.3.1 规范正式引入 Secure Boot,Windows 8 认证要求所有 x86 设备默认启用 Secure Boot。
1.3 与传统 BIOS 启动的区别
传统 BIOS 启动和 UEFI Secure Boot 启动在架构、安全性和扩展性上存在本质差异:
| 对比维度 | 传统 BIOS 启动 | UEFI Secure Boot 启动 |
|---|---|---|
| 启动方式 | 读取 MBR 引导扇区,执行引导代码 | 读取 ESP 分区中的 EFI 应用程序,通过签名验证 |
| 安全性 | 无签名验证,易受 Bootkit 攻击 | 基于 PKI 的数字签名验证,构建信任链 |
| 磁盘分区 | MBR 分区表,最大支持 2TB | GPT 分区表,支持 2TB 以上磁盘 |
| 引导代码 | 16 位实模式代码,512 字节限制 | 32/64 位保护模式代码,无大小限制 |
| 驱动加载 | Option ROM 无签名验证 | UEFI 驱动需签名验证 |
| 网络启动 | PXE 无安全机制 | UEFI HTTP Boot 支持签名验证 |
1.4 Secure Boot 的三种模式
UEFI 规范定义了 Secure Boot 的三种运行模式,以适应不同的部署场景:
| 模式 | 描述 | 典型场景 |
|---|---|---|
| 用户模式 | Secure Boot 完全启用,PK 已设置,所有启动组件必须通过签名验证 | 生产环境、企业部署 |
| 设置模式 | Secure Boot 处于可配置状态,PK 未设置,允许更新密钥数据库 | OEM 制造、系统初始化 |
| 自定义模式 | 允许用户手动管理 PK、KEK、db、dbx 数据库 | 开发调试、自定义操作系统 |
注意: 在用户模式下,如果 PK 丢失或损坏,系统将无法更新 Secure Boot 配置,可能导致无法启动非签名操作系统。建议在修改 PK 前备份原始密钥。
1.5 本章小结
- Secure Boot 是 UEFI 规范中的安全启动机制,通过数字签名验证构建信任链
- 起源于应对传统 BIOS 无安全验证的 Bootkit 攻击威胁
- 核心组件包括 PK、KEK、db、dbx 四个密钥数据库
- 与传统 BIOS 相比,UEFI Secure Boot 在安全性、分区支持、驱动验证等方面有本质提升
- 支持用户模式、设置模式、自定义模式三种运行状态