跳转到主要内容

安全启动

本文约需 2 分钟阅读

安全启动是指在从计算机通电到操作系统启动完成的各个阶段,验证所执行的代码是否拥有正规签名,从而阻止被篡改的软件运行的机制。它作为 UEFI (Unified Extensible Firmware Interface) 固件的功能实现,被定位为针对Rootkit和引导工具包等在操作系统启动前潜伏的恶意软件的根本性防御手段。

与 UEFI 固件的关系

安全启动是内置于 UEFI 规范 (2.3.1 及以后版本) 的功能。传统 BIOS 没有代码签名验证机制,写入引导扇区的任意代码会被无条件执行。为了解决这一问题,UEFI 将公钥密码基础设施引入了启动过程。固件本身成为「信任根 (Root of Trust)」,并对此后的所有组件进行链式验证。

启动链的验证流程

安全启动通过 4 种密钥数据库来管理签名的信任关系。

PK
Platform Key
最高层级的信任根
KEK
Key Exchange Key
更新 db/dbx 的权限
db
允许列表
受信任的签名密钥
dbx
拒绝列表
已吊销的签名与哈希

PK 是由硬件厂商设置的最高层级密钥,通常只存在一个。 KEK 由操作系统厂商 (如 Microsoft) 持有,拥有更新 db 与 dbx 的权限。启动时,UEFI 会将引导加载程序的签名与 db 进行比对,并确认其不包含在 dbx 中,然后才允许执行。

启动过程的验证步骤

通电
UEFI 初始化
签名验证
引导加载程序
签名验证
操作系统内核
签名验证
驱动程序
操作系统启动完成

针对引导工具包与 Rootkit 的防御

引导工具包是一种极其危险的恶意软件,它在操作系统启动前就常驻于内存,能够绕过操作系统的所有安全机制。 2020 年发现的「FinSpy 引导工具包」和 2022 年的「BlackLotus」,被认为是利用 MBR 或 UEFI 漏洞绕过安全启动的真实案例。如果启用了安全启动,未签名的代码会在启动链的最初阶段就被拒绝,因此绝大多数引导工具包都无法执行。从端点安全的角度来看,安全启动也是最基础的防御层。

与 TPM 的协同 - Measured Boot

与安全启动专注于「签名验证」不同,与 TPM 协同工作的 Measured Boot 进行的是「启动过程的测量与记录」。

项目安全启动Measured Boot (TPM)
目的阻止未签名代码的执行记录启动状态并供外部验证
行为验证失败时停止启动将各阶段的哈希记录到 PCR
验证时机启动时实时进行启动后进行远程认证

在 Measured Boot 中,启动过程各阶段 (固件、引导加载程序、内核、驱动程序) 的哈希值会依次记录到 TPM 的 PCR (Platform Configuration Register) 中。通过由外部服务器验证这些记录的「远程认证」,可以跨网络证明终端未被篡改。

Linux 上的安全启动支持

Linux 内核的安全启动支持,因其结构上依赖于 Microsoft 的签名密钥,长期以来一直是争论的焦点。主要发行版采用通过获得了 Microsoft UEFI 签名的「shim」引导加载程序来启动的方式。这是一种 shim 验证 GRUB2、GRUB2 再验证内核的多级结构。由于内核模块的签名验证也会被启用,因此在使用未签名的第三方驱动 (如 NVIDIA 的专有驱动) 时,需要注册 MOK (Machine Owner Key)。

网上常能看到「只要禁用安全启动就能运行」的建议,但这是一种从根本上放弃安全性的做法。 MOK 的注册步骤几分钟即可完成,因此在保持安全启动启用的前提下进行处理才是正确的方法。

加密技术的基础,在加密基础的文章中有详细讲解;与物理安全的关联,则在物理安全的文章中有详细说明。也请一并参阅勒索软件防护生物识别认证的风险UEFI 安全相关书籍 (Amazon)上也可以找到。

相关术语

这篇文章对您有帮助吗?

XHatena