数字城堡的钥匙:揭秘 UEFI 安全启动的守护者与叛逆者
在每一台现代计算机的心脏地带,都存在一个沉默的守护者。当你按下电源按钮,它在万物苏醒之前第一个睁开眼睛,检查岗哨,核对口令,并决定谁有资格进入操作系统的神圣殿堂。这位守护者,就是我们今天故事的主角——UEFI 安全启动(Secure Boot)。
这不仅仅是一个技术特性,它是一座数字城堡的门禁系统。然而,这座城堡的钥匙,并非牢不可破地掌握在建造者手中。你,作为设备的主人,同样有机会成为这座城堡的君主,亲自定制规则,决定谁是朋友,谁是敌人。
本文将像一位向导,带您深入这座城堡的底层,探索它的运作机理,学习如何从一位普通居民,成长为能够掌控自己数字命运的“国王”。我们将一起揭开那些由微软(Microsoft)、戴尔(Dell)等巨头设下的默认规则,并学习如何根据我们自己的意愿,锻造属于自己的“平台密钥”(Platform Key),建立一个真正由我们自己掌控的安全体系。这趟旅程将充满挑战,但最终,您将获得对自己设备无与伦C比的控制权。
🏰 第一章:告别老旧的哨兵——从 BIOS 到 UEFI 的伟大迁徙
想象一下,在个人电脑的“石器时代”,每台机器的启动都依赖于一位年迈昏聩的哨兵,他的名字叫 BIOS(基本输入输出系统)。这位老哨兵自 1975 年以来就一直服役,他只会说一种古老的方言(16位汇编语言),记忆力也差得惊人(只能寻址 1MB 内存),并且一次只能处理一件事。在现代计算机这个拥有海量内存、多核处理器和复杂设备的繁华都市里,这位老哨兵显然已经力不从心。
注解:BIOS 的局限性
BIOS 运行在 16 位实模式下,这意味着它一次只能处理 16 位的数据,并且内存访问被限制在 1MB。这对于需要初始化数 GB 内存和多个高速设备的现代系统来说,是一个巨大的瓶颈。此外,它只能从小于 2.1TB 的硬盘分区(使用 MBR 分区表)启动,这在今天这个动辄数 TB 的存储时代显得捉襟见肘。
于是,一场革命悄然发生。英特尔(Intel)在 90 年代中期开始酝酿一个名为“可扩展固件接口”(EFI)的计划,并在 2005 年将其贡献给一个行业联盟——UEFI 论坛。自此,一个全新的、更智能、更强大的“首相”——UEFI(统一可扩展固件接口)诞生了。
与老哨兵 BIOS 不同,UEFI 是一位精通多国语言(支持 C 语言开发)、拥有超强记忆力(支持 32 位或 64 位模式,可访问全部系统内存)并且能够多线程工作的现代化管理者。它不仅启动速度更快,还带来了图形化的配置界面、网络功能,以及我们故事的核心——安全启动。
📜 UEFI 的启动乐章:一场精心编排的交响乐
UEFI 的启动过程不再是 BIOS 那样单调的独奏,而是一场分为多个乐章的交-响乐。每个乐章都有其独特的任务,环环相扣,确保系统安全、有序地唤醒。
下面是根据参考文献中图 1 重构的 UEFI 启动流程:
启动阶段 | 主要任务 |
安全(SEC)阶段 | • 初始化信任链的起点(SRTM)。<br>• 执行最基础的固件完整性检查。 |
预 EFI 初始化(PEI)阶段 | • 初始化核心信任链(CRTM)、CPU、芯片组、内存等核心硬件。<br>• 固件层面的安全启动开始介入,对早期固件模块进行验证。 |
驱动执行环境(DXE)阶段 | • 发现并初始化 I/O 总线、扩展设备(如网卡、RAID 卡、USB 设备)及其固件。<br>• 并行执行固件模块以提高启动速度。 |
启动设备选择(BDS)阶段 | • 初始化系统表、启动管理器和 UEFI 应用程序(如 UEFI Shell)。<br>• 读取可启动的 EFI 分区,准备加载操作系统。 |
引导加载程序(Bootloader)阶段 | • 执行如 Shim、GRUB 或 Windows Boot Manager 等引导程序。<br>• 软件层面的安全启动接管,验证操作系统内核。 |
操作系统内核(OS Kernel)阶段 | • 建立文件系统、加载系统模块、驱动和应用程序。<br>• 内核继续执行安全启动策略,例如验证驱动程序签名。 |
这个过程就像一场精密的接力赛,从固件到软件,每一棒都经过严格的身份验证。而这场验证的核心,正是 UEFI 安全启动。
🛡️ 第二章:皇家卫队——安全启动的“四把钥匙”
UEFI 安全启动的核心,是一套基于公钥密码学的信任链机制。它就像是城堡的皇家卫队,只允许持有“皇家通行证”的程序运行。这个通行证系统由四个关键的数据库(或称为“钥匙库”)组成,它们储存在主板的非易失性存储器中。
注解:公钥密码学
这是一种加密技术,其中密钥成对出现:一个公钥和一个私钥。公钥可以公开分发,用于验证由私钥创建的签名。私钥则由所有者秘密保管。在安全启动中,固件中存储的是公钥(证书),用于验证启动文件的数字签名,该签名由相应的私钥生成。
这四个钥匙库分别是:平台密钥(PK)、密钥交换密钥(KEK)、允许数据库(DB)和禁止数据库(DBX)。
🔑 平台密钥 (Platform Key - PK)
比喻:国王的御玺。
PK 是整个安全启动体系的最高统治者。一台设备上只能有一个 PK,通常是一个 RSA-2048 公钥证书。它的私钥是系统的“传国玉玺”,被所有者(理论上是你,但出厂时通常是设备制造商)严格保管。PK 的私钥不直接签名启动文件,而是用来签署对 KEK、DB、DBX 的变更。拥有了 PK 的控制权,就意味着你成为了这台电脑的“国王”。
🔐 密钥交换密钥 (Key Exchange Key - KEK)
比喻:重臣的印信。
KEK 是由 PK 授权的“重臣”,比如操作系统供应商(微软)和硬件制造商(戴尔、惠普)。它们持有自己的 KEK 证书,储存在固件中。这些“重臣”有权更新“允许名单”(DB)和“黑名单”(DBX),例如通过 Windows Update 推送一个更新来吊销一个已知的恶意软件签名。
✅ 允许数据库 (Allow list Database - DB)
比喻:贵宾通行证名单。
DB 包含了一系列受信任的证书或文件哈希值。任何启动文件(如引导加载程序、驱动程序),如果其签名可以被 DB 中的某个证书验证,或者其 SHA-256 哈希值与 DB 中的某个哈希匹配,就会被认为是“贵宾”,允许执行。大多数设备出厂时,DB 中都预装了微软的证书,以便能顺利启动 Windows 和一些经过微软认证的第三方软件(比如主流的 Linux 发行版引导加载程序 Shim)。
❌ 禁止数据库 (Deny list Database - DBX)
比喻:头号通缉犯名单。
DBX 是安全启动的“一票否决权”。它包含了一系列被明确禁止的证书或文件哈希值。如果一个文件的签名或哈希值出现在 DBX 中,无论它是否同时在 DB 中,都将被立即阻止执行。DBX 通常用于吊销那些被泄露的、有漏洞的或者被恶意软件滥用的签名。
👽 番外篇:MOK——来自 Linux 社区的“地方自治”
除了 UEFI 标准定义的这四把钥匙,Linux 社区还创造了一套自己的机制:机器所有者密钥(Machine Owner Key - MOK)。由于开源软件更新迭代速度快,每次都让微软签名不现实,Linux 社区便设计了 Shim。Shim 是一个由微软签名的“特使”,因此它能在大部分开启安全启动的机器上运行。Shim 运行后,会建立自己的信任体系——MOK。用户可以把自己的密钥加入 MOK,用来签名自己编译的内核或驱动。MOK 的功能类似于 DB,而 MOKX 则类似于 DBX。
下图清晰地展示了安全启动检查的优先级顺序,黑名单(DBX/MOKX)的权力至高无上。
安全启动检查优先级 (根据参考文献图 2 描述)
MOKX (禁止) ➡️ DBX (禁止) ➡️ MOK (允许) ➡️ DB (允许) ➡️ KEK (允许) ➡️ 无匹配 (禁止)
注解: MOK 和 MOKX 仅在使用了 Shim 引导加载程序后才生效,主要影响内核和驱动的加载,而在此之前的固件加载阶段不受其影响。
⚔️ 第三章:为何要定制?——在便利与威胁之间寻求掌控
大多数电脑出厂时都配置了“标准模式”的安全启动,预装了微软和设备商的密钥。这套体系在大多数情况下运行良好,但它也意味着你将信任的权力交给了这些公司。在某些场景下,这种默认的信任可能成为安全隐患,或者成为你自由使用设备的障碍。这时,“定制”就显得尤为重要。
🦠 用例一:对抗阴险的固件恶意软件
固件恶意软件,如臭名昭著的 LoJax,是网络安全领域最可怕的威胁之一。它们潜伏在操作系统的底层,即使你重装系统、甚至更换硬盘,它依然存在。
LoJax 是一个被篡改为恶意软件的防盗追踪程序。在开启了“完全启动”(Thorough Boot)模式的系统上,安全启动会检查所有固件模块。由于 LoJax 没有合法的签名,它会被 DB 拒绝,从而阻止其运行。
然而,许多消费级设备为了追求更快的开机速度,默认开启了“快速启动”(Fast Boot)。在这种模式下,系统会跳过对 PEI、DXE 等早期阶段固件模块的检查,这恰好为 LoJax 这样的恶意软件打开了方便之门。
LoJax 在不同启动模式下的命运 (根据参考文献图 3 描述)
图示说明:在 DXE 阶段,当系统以“完全启动”模式运行时,合法的存储、RAID、网卡等模块被允许执行,而恶意的 LoJax 模块和未经授权的 Shell 应用则因无法通过安全启动验证而被阻止。
另一个例子是 2016 年微软意外泄露的一个“调试版”引导加载程序。这个加载程序拥有一个被几乎所有 Windows 电脑的 DB 信任的有效签名,但它却可以绕过安全策略,加载任意未签名的代码。为了解决这个问题,厂商们不能简单地将微软的证书加入 DBX(这会导致大量正常程序失效),而是选择将这个特定调试版加载程序的 SHA-256 哈希值加入了 DBX。这样,就可以精确地“通缉”这个坏家伙,而不影响其他好人。
🕵️ 用例二:防范“家贼”——内部威胁的终极防线
想象一个场景:一个心怀不满的员工利用物理接触权限,试图从一个存有 Linux Live 系统的 U 盘启动一台公司电脑,以窃取数据或植入后门。传统的安全措施(如禁用 USB 端口)可能被绕过。
通过定制安全启动,组织可以构建一道坚固的防线。管理员可以:
- 移除微软的第三方 CA 证书:这个证书信任了大量的第三方硬件和软件,包括 Linux 的 Shim。移除它,就等于关闭了启动未知 Linux 系统的“后门”。
- 移除微软的 Windows CA 证书:这会使得所有版本的 Windows 都无法启动。
- 添加自己的“白名单”:管理员可以精确地将公司批准的 Windows 引导加载程序、Linux 内核、甚至是特定网卡和存储控制器的固件哈希值,添加到 DB 中。
经过这样一番操作,这台电脑就变成了一个“六亲不认”的专属设备。它只信任管理员指定的硬件和软件。任何未经授权的 U 盘、外接设备或网络启动尝试,都会在安全启动这一关被无情地拒绝。当然,这一切的前提是,你必须用一个强壮的管理员密码锁住你的 UEFI 配置界面,防止“内鬼”轻易地禁用或修改你的定制策略。
💾 用例三:守护沉睡的数据——与全盘加密的联动
安全启动还能与全盘加密技术(如 Windows 的 BitLocker 和 Linux 的 LUKS)完美配合,形成“双保险”。这其中的关键角色是 TPM(可信平台模块),一个主板上的安全芯片。
注解:TPM (Trusted Platform Module)
TPM 是一个硬件安全芯片,可以安全地生成和存储加密密钥。它的一个核心功能是“平台配置寄存器”(PCRs),这些寄存器会记录系统启动过程中的关键信息(如固件、引导加载程序、安全启动配置等)的哈希值。这个过程被称为“度量”。
当系统启动时,TPM 会度量安全启动的配置(PK、KEK、DB、DBX 的状态)并存入特定的 PCR 寄存器(通常是 PCR7)。BitLocker/LUKS 在加密硬盘时,可以将解密密钥与这些 PCR 的特定状态“绑定”。
这意味着,只有当启动过程完全符合预期(即安全启动配置未被篡改),TPM 才会“释放”解密密钥。如果有人试图禁用安全启动、替换密钥、或者加载恶意引导程序,PCR 的值就会改变,TPM 将拒绝提供密钥,硬盘数据将保持锁定状态,从而有效防止离线攻击。
🛠️ 第四章:夺取王权——亲手定制你的安全启动策略
现在,激动人心的时刻到了。我们将一步步学习如何从设备制造商手中“夺取王权”,安装自己的 PK,成为自己数字城堡的主人。
警告: 修改安全启动配置有风险,可能导致系统无法启动。在开始之前,请务必备份重要数据,并确保你了解如何通过重置固件或暂时禁用安全启动来恢复系统。
📜 第一步:知己知彼——备份出厂设置
在发动“政变”之前,首先要摸清“旧制度”的底细。我们需要备份当前系统中所有的安全启动变量(PK、KEK、DB、DBX)。这就像是抄录一份旧王朝的法典,以备不时之需。
在 Linux 中备份:
你可以使用 efi-readvar
工具将每个密钥库导出为 ESL(EFI 签名列表)文件。
# 安装工具 (Debian/Ubuntu)
sudo apt-get install efitools
# 备份密钥
efi-readvar -v PK -o PK.old.esl
efi-readvar -v KEK -o KEK.old.esl
efi-readvar -v db -o db.old.esl
efi-readvar -v dbx -o dbx.old.esl
在 Windows (PowerShell) 中备份:
使用管理员权限运行 PowerShell,执行以下命令:
Get-SecureBootUEFI -Name PK -OutputFilePath PK.old.esl
Get-SecureBootUEFI -Name KEK -OutputFilePath KEK.old.esl
Get-SecureBootUEFI -Name db -OutputFilePath db.old.esl
Get-SecureBootUEFI -Name dbx -OutputFilePath dbx.old.esl
通过 UEFI 配置界面备份:
许多电脑的 UEFI 设置(通常在开机时按 F2、Del 等键进入)中提供了密钥管理选项,允许你将当前的密钥库导出到 U 盘。这是最直观的方法之一。
图示说明 (根据参考文献 Image 1): 在 Dell OptiPlex 工作站的 UEFI 配置界面中,用户可以选择“Secure Boot” -> “Expert Key Management”,然后逐一选择 PK、KEK、db、dbx,并使用“Export to File”或“Save to File”功能将其备份到外部存储设备。
💍 第二步:铸造权杖——创建你自己的密钥和证书
接下来,我们要铸造自己的“御玺”和“印信”。我们将使用 OpenSSL 这个强大的工具来创建一套全新的 PK、KEK 和用于签名启动文件的 DB 密钥(我们称之为 DSK - Database Signing Key)。
# 创建平台密钥 (PK)
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=My Custom PK/" -keyout PK.key -out PK.crt -days 3650 -nodes -sha256
# 创建密钥交换密钥 (KEK)
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=My Custom KEK/" -keyout KEK.key -out KEK.crt -days 3650 -nodes -sha256
# 创建数据库签名密钥 (DSK)
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=My Custom DSK/" -keyout dsk1.key -out dsk1.crt -days 3650 -nodes -sha256
# 将证书转换为 UEFI 偏爱的 DER 格式
openssl x509 -outform der -in PK.crt -out PK.cer
openssl x509 -outform der -in KEK.crt -out KEK.cer
openssl x509 -outform der -in dsk1.crt -out dsk1.cer
现在,你拥有了三套私钥(.key
文件,必须死守的秘密)和三张公钥证书(.crt
和 .cer
文件,将要部署到固件中)。
✍️ 第三步:签署法令——签名与哈希
有了自己的签名密钥(DSK),你就可以为你信任的引导加载程序(如 GRUB)或内核进行签名。对于那些无法签名的二进制文件(如闭源的 RAID 卡固件),我们可以计算其 SHA-256 哈希值,并将其直接添加到 DB 中。
签名一个 EFI 文件 (以 Linux 的 sbsign 为例):
# 假设我们要签名一个名为 grubx64.efi 的文件
sbsign --key dsk1.key --cert dsk1.crt --output grubx64.signed.efi grubx64.efi
计算一个文件的哈希值 (以 OpenSSL 为例):
# 计算一个名为 raid_firmware.bin 的固件哈希
openssl dgst -sha256 -binary -out raid_firmware.hsh raid_firmware.bin
图示说明 (根据参考文献 Image 2): 在一些高端服务器(如 Dell PowerEdge)的 UEFI 界面中,甚至提供了直接从硬件捕获固件哈希的功能。用户可以进入“System Security”菜单,选择要信任的硬件组件(如网卡、存储控制器),系统会自动计算其固件的 SHA-256 哈希,并允许用户导出为 .hsh
文件,以便后续导入到 DB 中。
👑 第四步:加冕典礼——加载新的密钥
这是最关键的一步:将你新创建的密钥加载到固件中,完成“王权交接”。这个过程必须非常小心,顺序至关重要。通常,你需要先清空或替换 DB 和 DBX,然后是 KEK,最后,也是最神圣的一步,是安装你自己的 PK。
加载方式:
UEFI 配置界面(推荐):这是最安全、最直观的方式。进入 UEFI 设置,找到安全启动密钥管理。通常会有一个“清除所有密钥”或“恢复出厂设置”的选项。执行此操作后,系统会进入“Setup Mode”(设置模式)。在此模式下,你可以依次使用“Append from File”或“Replace from File”选项,加载你自己的 dsk1.cer
(到 DB),KEK.cer
(到 KEK),以及 PK.cer
(到 PK)。一旦 PK 被成功加载,系统将退出 Setup Mode,进入“User Mode”或“Custom Mode”,安全启动将根据你的新规则开始强制执行。
图示说明 (根据参考文献 Image 3 & 4): 在 Dell 的 UEFI 界面中,进入“Expert Key Management”后,用户会看到 PK、KEK、DB、DBX 的管理选项。可以选择“Delete”来清除现有密钥,然后使用“Replace from File”或“Append from File”,通过一个图形化的文件浏览器(通常支持 FAT32 格式的 U 盘)来选择并加载自己的 .cer
或 .hsh
文件。
命令行工具(高级):在 Linux 或 Windows 中,可以使用 efi-updatevar
或 Set-SecureBootUEFI
等工具来更新变量。这通常需要将证书和哈希打包成 ESL 文件,并且在安全启动已经激活的情况下,更新请求本身也需要被正确的密钥签名(例如,更新 DB 需要 KEK 签名,更新 KEK 需要 PK 签名)。这个过程非常复杂,容易出错,更适合自动化脚本部署。
Keytool.efi(终极武器):Keytool 是一个可启动的 EFI 应用程序。你可以把它放在 U 盘里,像启动操作系统一样启动它。它提供了一个简单的文本界面,可以用来编辑所有的安全启动变量。当其他方法都失败时(尤其是在替换 PK 时),Keytool 往往能成为你的救星。
完成这一步后,恭喜你!你已经成功加冕,成为了自己数字城堡的最高统治者。从现在起,只有经过你亲手签名或批准的软件,才能在这片领土上启动。
🔭 第五章:巩固王权——高级定制与防御
成为国王之后,你还需要一些高级手段来巩固你的统治,防范更高级的威胁。
📜 TPM:永不撒谎的宫廷史官
我们之前提到过 TPM,这位“宫廷史官”。它可以与你定制的安全启动策略协同工作,提供更深层次的防御。
TPM 的 PCR7 寄存器专门用于度量安全启动的配置。当你安装了自己的 PK、KEK、DB 后,TPM 会计算出这些配置的一个独一无二的哈希值,并记录在 PCR7 中。
你可以利用这个特性,建立一个“可信启动”环境。例如,一个“可信引导加载程序”在启动时,不仅会执行安全启动的签名检查,还会向 TPM 请求当前的 PCR7 值,并与一个预先设定的“黄金标准值”进行比较。如果值不匹配,说明有人在你不知情的情况下篡改了安全启动策略(比如偷偷添加了一个可信证书),引导加载程序可以立即中止启动并发出警报。
TPM PCR 的哈希关系 (根据参考文献图 6 描述)
这个关系是层级递进的:
- 事件 (Event):每一个启动组件(如一个 DB 证书)都是一个事件。
- 度量 (Measurement):TPM 对每个事件进行哈希计算,得到一个摘要(Digest)。
- PCR 扩展 (Extend):TPM 将新的摘要与 PCR 寄存器当前的值合并,再进行一次哈希,生成新的 PCR 值。这个过程是单向的,无法从最终的 PCR 值反推出中间的事件。
- 引用 (Quote):TPM 可以用自己的私钥对一组 PCR 值进行签名,生成一个“引用”,证明这些 PCR 值在某个时间点的真实状态,且来自这个可信的 TPM。
通过远程验证服务器定期检查设备的 TPM 引用,管理员可以持续监控大量设备固件的完整性,确保没有设备被悄无声息地攻破。
结语:权力越大,责任越大
从 BIOS 的混沌时代到 UEFI 的精密秩序,计算机的启动过程已经演变成一场复杂的安全博弈。UEFI 安全启动为我们提供了一套强大的工具,来抵御日益猖獗的固件级攻击。
然而,默认的“标准模式”是一把双刃剑。它在提供便利的同时,也让我们让渡了最终的控制权。通过本文的探索,我们了解到,定制安全启动并非遥不可及的黑客技术,而是每一位关心自己数字主权的设备所有者都应该了解和掌握的权利。
成为自己数字城堡的国王,意味着你需要承担起维护其安全的责任:定期更新固件,妥善保管你的私钥,并警惕任何试图破坏你所建立秩序的企图。这趟旅程或许复杂,但它所带来的,是对自己设备前所未有的信任和掌控感。在这个数字世界里,这无疑是最宝贵的财富之一。
参考文献列表
- National Security Agency (NSA). (2020, September). UEFI Secure Boot Customization (ver. 1.1). (本文核心参考资料)
- UEFI Forum. (2017, May). Unified Extensible Firmware Interface Specification (Version 2.7). https://uefi.org/sites/default/files/resources/UEFI_Spec_2_7.pdf
- Mendelsohn, T. (2016, August 11). Secure Boot snafu: Microsoft leaks backdoor key, firmware flung wide open. Ars Technica. https://arstechnica.com/information-technology/2016/08/microsoft-secure-boot-firmware-snafu-leaks-golden-key/
- Trusted Computing Group (TCG). (2014, January 27). TCG EFI Platform Specification For TPM Family 1.1 or 1.2. https://trustedcomputinggroup.org/wp-content/uploads/TCG_EFI_Platform_1_22_Final_-v15.pdf
- Bottomley, J. (2012, July 8). UEFI Secure Boot. James Bottomley’s random Pages. https://blog.hansenpartnership.com/uefi-secure-boot/