【内有彩蛋】以 Windows 为例初步理解 Secure Boot、Trusted Boot、Measured Boot 和 TPM
TPM 的概念
可信平台模块 (Trusted Platform Module, TPM) 是一种提供基本的安全相关函数的芯片,主要涉及加密密钥。 TPM 安装在计算机的主板上,它使用硬件总线与系统的其他部分通信。
装有 TPM 的计算机可以创建加密密钥并对密钥进行加密,以便只能由 TPM 解密。此过程通常称为包装 (wrapping) 或绑定 (binding) 密钥,可帮助保护密钥免受泄露。 每个 TPM 都有一个主包装密钥 (master wrapping key),称为存储根密钥 (storage root key, SRK),存于 TPM 内。在 TPM 中创建的存储根密钥或背书密钥 (endorsement key, EK) 的私钥永远不会向任何其他组件、软件、进程或用户公开。
可以指定由 TPM 创建的加密密钥是否可以迁移。如果指定密钥可以迁移,则密钥的公钥、私钥可以向其他组件、软件、进程或用户公开。 如果指定密钥不可迁移,则密钥的私钥部分永远不会在 TPM 外部公开。
包含 TPM 的计算机还可以创建一个密钥,该密钥包装并绑定到特定的平台度量值。只有当当前平台度量值和创建密钥时相同时,才能解开此类密钥。此过程称为“将密钥密封 (seal) 到 TPM”。解密密钥称为解封 (unseal)。TPM 还可以密封和解封在 TPM 外部生成的数据。使用此被密封的密钥和软件(如 BitLocker 驱动器加密)可以锁定数据,直到满足特定的硬件或软件条件。
使用 TPM 时,密钥对的私钥与操作系统控制的内存分开。密钥可以密封到 TPM,还能保证在密钥解封并释放以供使用之前的系统状态(系统可信度)。TPM 使用自己的内部固件和逻辑线路来处理指令。因此不依赖于操作系统,也不会暴露在操作系统或软件的漏洞之中。
TPM 是一个低速芯片,不会用来加解密大量的数据。通常只是用来加解密少量数据(如密钥)。例如整个硬盘数据加密,并不是直接用 TPM 加密,而是用一个 key 去软件加密,而这个 key 是用TPM再加密保护起来。如果要解密硬盘数据,只能先用这个 TPM 芯片解密得到初始的 key,才能解密硬盘数据。
TPM 2.0 反暴力破解
TPM 2.0 具有明确定义的反暴力破解行为。
对于包含 TPM 2.0 的计算机,Windows 将 TPM 配置为在 32 次授权失败后锁定,并每隔 10 分钟忘记 1 次授权失败。这意味着用户可以快速试错 32 次。TPM 每次都会记录认证值是否正确。这无意中导致 TPM 在 32 次尝试失败后进入锁定状态。
在未来 10 分钟内尝试使用有密码的密钥不会返回成功或失败,相反,响应指示 TPM 已锁定。10 分钟后,将忘记 1 次授权失败,TPM 记住的授权失败数降至 31,因此 TPM 将解除锁定状态,恢复正常操作。使用正确的密码时,如果在接下来的 10 分钟内未发生授权失败,则可以正常使用密钥。如果 320 分钟内没有授权失败,则 TPM 会忘记所有授权失败,并且允许再次发生 32 次失败的尝试。
Windows 8 认证不要求 TPM 2.0 在系统完全关闭电源或系统休眠时忘记授权失败。Windows 要求在系统正常运行、处于睡眠模式或处于关机外的低功耗状态时忘记授权失败。如果具有 TPM 2.0 的 Windows 系统被锁定,则保持开机 10 分钟,TPM 解锁一次。
向 TPM 发送重置锁定命令并提供 TPM 所有者密码,可以立即完全重置 TPM 2.0 的反暴力破解保护。默认情况下,Windows 会自动预配 TPM 2.0,并存储 TPM 所有者密码供系统管理员使用。
TPM 2.0 允许无需密码创建某些密钥。锁定 TPM 时,这些密钥仍然可用。例如,具有默认的“仅 TPM”配置的 BitLocker 能够使用 TPM 中的密钥启动 Windows,即使 TPM 已锁定。
默认值背后的合理性
最初,BitLocker 允许用 4 到 20 个字符作为 PIN,Windows Hello 具有自己的 PIN 进行登录,可以是 4 到 127 个字符。BitLocker 和 Windows Hello 都使用 TPM 来防止 PIN 暴力攻击。
Windows 10 1607 及更早期版本使用的词典攻击防护参数。字典攻击防护参数提供了一种平衡安全需求和可用性的方法。例如,当 BitLocker 与 TPM + PIN 配置一起使用时,PIN 尝试的数量会随时间推移而受限。 此示例中的 TPM 2.0 可以配置为仅允许 32 个不受限的 PIN 尝试,然后每两小时只再进行一次尝试。这每年最多仅能进行约 4415 次尝试。如果 PIN 为 4 位数字,则可以在两年内尝试所有 9999 个可能的 PIN 组合。
从 Windows 10 1703 开始,BitLocker PIN 的最小长度增加到 6 个字符,以更好地与其他利用 TPM 2.0 的 Windows 特性保持一致,包括 Windows Hello。 增加 PIN 长度大幅增加了暴力攻击试错次数。因此,每次尝试之间的锁定时间缩短,使合法用户能在类似安全性下更快地在失败后重试。
Rootkit
Rootkit 是一种复杂而危险的恶意软件。它们使用与 OS 相同的权限在内核模式下运行。由于 Rootkit 具有与 OS 相同的权限,并且在操作系统之前启动,因此它们可以完全隐藏自己和其他应用程序。通常,Rootkit 是整套恶意软件的一部分,可以绕过本地登录、记录密码和按键、传输私有文件以及捕获加密数据。
不同类型的 Rootkit 在启动过程的不同阶段中进行加载:
- 固件 Rootkit
- 覆盖电脑的 BIOS 或其他硬件的固件,以便 Rootkit 可以在 Windows 之前启动。
- Bootkit
- 替换系统的 Bootloader 程序,以便在操作系统之前加载 Bootkit。
- 内核 Rootkit
- 替换操作系统内核的一部分,以便 Rootkit 可以在 OS 加载时自动启动。
- 驱动程序 Rootkit
- 伪装成与硬件通信的一个受信任的驱动程序。
Secure Boot 的概念
Secure Boot (安全启动) 是一个行业标准,用以确保设备启动过程中只运行 OEM 信任的固件/软件。启动电脑时,固件会检查每一部分启动程序的签名,包括 UEFI 固件驱动程序(Option ROM)、EFI 程序和操作系统。如果签名有效则能继续启动,固件才将控制权交给操作系统。
OEM 厂商可以使用固件开发商提供的指令创建 Secure Boot 密钥并存储在固件中。当你添加 UEFI 驱动程序时,你也同样需要确保它们被签名并包含在 Secure Boot 数据库中。
UEFI 签名数据库是可以进行更新/添加的,预置了 Windows 和一些其他常用系统的签名公钥。数据库的存储应和操作系统隔离,防止被篡改。
上电后固件会使用签名公钥来验证所有启动过程中的程序,直到验证完 Windows Boot Manager。
为了防止恶意软件滥用这些选项,用户必须手动配置 UEFI 固件来信任未认证的 Bootloader 或关闭 Secure Boot。软件无法更改 Secure Boot 设置。
Secure Boot 的默认状态具有很广的信任范围,这可能导致客户信任他们可能不需要的启动组件。 由于 Microsoft 第三方 UEFI CA 证书为所有 Linux 分发版的 Bootloader 签了名,因此信任 UEFI 数据库中的 Microsoft 第三方 UEFI CA 签名会增加系统的攻击面。打算仅信任和启动某个 Linux 发行版的用户不得不信任所有发行版,这比他们所需的要多得多。任一 Bootloader 中的漏洞将会暴露整个系统,并使用户面临来自从未打算使用的 Bootloader 被攻击的风险。例如 GRUB 启动加载程序 或影响启动组件的固件级 Rootkit。安全核心计算机 要求默认启用 Secure Boot 并将其配置为不信任 Microsoft 第三方 UEFI CA 签名,为客户提供可能最安全的电脑配置。
签名数据库和密钥
签名(信任锚)数据库
在部署电脑之前,OEM 需在该电脑上存储 Secure Boot 数据库。 这包括签名数据库 (db)、吊销的签名数据库 (dbx) 和密钥注册密钥 (Key Enrollment Key, KEK) 数据库。 在制造时,这些数据库存储在固件的非易失性 RAM (NV-RAM) 中。
签名数据库 (db) 和吊销的签名数据库 (dbx) 将列出 UEFI 应用程序、操作系统加载程序(例如 Microsoft Operating System Loader 或 Boot Manager)以及可在设备上加载的 UEFI 驱动程序的签名者或哈希值。吊销的列表包含不再受信任且不可加载的项。如果哈希值在两个数据库中都存在,则吊销的签名数据库 (dbx) 优先。
密钥注册密钥数据库 (KEK) 是单独的签名密钥数据库,可用于更新签名数据库和吊销的签名数据库。 Microsoft 要求在 KEK 数据库中包含一个特定密钥,以便 Microsoft 将来可向签名数据库添加新的操作系统,或者向吊销的签名数据库添加已知有问题的 images 信息。
信任根 root of trust
添加完上述数据库并完成最终的固件验证和测试后,OEM 将锁定固件以避免对其进行编辑(除非使用正确密钥进行签名的更新,或者由实际用户使用固件菜单更新),随后生成一个平台密钥 (Platform Key, PK)。PK 可用于对 KEK 的更新进行签名或关闭 Secure Boot。
平台秘钥是 Secure Boot 的基石,此密钥的持有人能够修改平台上存在的任何其他信任锚(Trust Anchor)列表(即上述三个数据库)。通常 PK 由设备制造商拥有,但如果一个公司需要完全掌控公司内的具有 Secure Boot 的 PC 时,也可以持有 PK,从而方便企业 IT 管理。
Secure Boot 还允许授权实体将特定映像的哈希值识别为可信(或不可信)。这个授权实体是指 PK 或 KEK 的拥有者。这样可以避免对某一签名识别为可信(或不可信)导致影响范围过大的问题。
Secure Boot 启动 Windows 的流程
- 电脑开机后,根据 PK 检查每个签名数据库。
- 若固件不可信,UEFI 固件必须启动 OEM 指定的恢复程序来还原为可信固件。
- 若 Windows Boot Manager 有问题,固件会尝试启动 Windows Boot Manager 的一个备份副本。如果仍然失败,固件必须启动 OEM 指定的修复程序。
- Windows Boot Manager 运行后,若驱动或 NTOS 内核有问题,将会加载 Windows 恢复环境 (Windows RE) 来修复驱动程序或系统内核。
- Windows 启动反恶意软件。
- Windows 加载其他内核驱动程序并初始化用户模式进程。
Secure Boot 启动非微软系统
所有基于 x86 的 Windows 认证电脑都必须满足与安全启动相关的几个要求:
- 默认必须启用 Secure Boot。
- 必须信任 Microsoft 的证书 (从而也信任任何 Microsoft 签名的 Bootloader) 。
- 必须允许用户配置 Secure Boot 以便信任其他 Bootloader。
- 必须允许用户彻底禁用 Secure Boot。
这些要求有助于保护你免受 Rootkit 的保护,同时允许你运行任何所需的 OS。 你可以使用以下三个选项来运行非 Microsoft 操作系统:
- 使用受认证的 Bootloader。 由于所有经过认证的 Windows 电脑都必须信任 Microsoft 的证书,因此 Microsoft 提供了一项服务来分析和签名任何非 Microsoft 启动加载程序,以便所有经过认证的 Windows 电脑都能信任它。 事实上,已经有了能够加载 Linux 的开源 Bootloader。 若想获取证书请访问 https://partner.microsoft.com/dashboard。
- 配置 Secure Boot 信任你的 Bootloader。 所有经过 Windows 认证的电脑都允许通过向 UEFI 数据库添加签名来信任未经认证的 Bootloader,从而允许你运行任何操作系统,包括自制操作系统。
- 关闭安全启动。 所有经过认证的 Windows 电脑都允许关闭安全启动,以便可以运行任何软件。 但是,此操作无法保护你免受 Bootkit 的攻击。
Trusted Boot 的概念
Trusted Boot(受信任启动)简单来说就是 Windows 先检查启动过程的每个组件的完整性,然后再加载组件。
Trusted Boot 将在 Secure Boot 结束的时候接管。Bootloader 将先验证 Windows 内核的数字签名,然后再加载它。而 Windows 内核将验证 Windows 启动过程的每一个其他组件,包括启动驱动程序、启动文件和 ELAM(Early Launch Anti-Malware,早期启动的反病毒软件)。如果有文件被修改,则 Bootloader 会检测到问题并拒绝加载损坏的组件。通常,Windows 可以自动修复损坏的组件,还原 Windows 的完整性并允许电脑正常启动。
Measured Boot 的概念
Measured Boot(度量启动)简单来说就是固件记录启动过程,Windows 可以将其发送到可客观评估电脑运行状况的受信任服务器。
若有一台组织内的计算机被 Rootkit 感染,管理员需要对此之情。企业反恶意软件应用可以向 IT 部门报告恶意软件感染,但这不适用于会自我隐藏的 Rootkit。 换句话说,不能信任客户端告诉你它是否正常。
因此,即使正在运行反恶意软件,感染了 Rootkit 的电脑看上去仍然正常。 受感染的电脑会继续连接到企业网络,使 Rootkit 能够访问大量机密数据,并可能允许 Rootkit 在整个内部网络中传播。
Measured Boot 需要搭配 TPM 使用。它允许网络上的受信任的服务器验证 Windows 启动过程的完整性。Measured Boot 过程如下:
- UEFI 固件在 TPM 中存储固件、Bootloader、启动驱动程序以及在反病毒软件启动之前加载的所有程序的哈希值。
- 在启动过程结束时,Windows 将启动远程认证客户端。受信任的认证服务器会向客户端发送一个唯一密钥。
- TPM 使用此唯一密钥对 UEFI 记录的日志进行数字签名。
- 客户端向服务器发送此日志,其中可能包含其他安全信息。
根据实现和配置,服务器现在可以确定客户端是否正常运行。它可以向客户端授予访问有限隔离网络或完整网络的权限。
下图说明了 Measured Boot 和远程证明的过程。
Windows 包含支持 Measured Boot 的 API,但你需要非 Microsoft 的工具来实现远程认证客户端和受信任的认证服务器来使用它。例如 Microsoft Research 中的以下工具:
Measured Boot 使用 UEFI、TPM 和 Windows 的功能,让你能够自信地评估客户端电脑在网络中的可信度。
总结
Secure Boot、Trusted Boot 和 Measured Boot 可创建一个从根本上抵御 Bootkit 和 Rootkit 的架构。在 Windows 中,这些功能有可能消除你的网络中的内核级恶意程序。
下图给出了整个启动和验证的流程。
不使用 Secure Boot/TPM 时启用 BitLocker 加密系统盘的测试
经过测试,通过组策略允许没有 TPM 时启动系统盘 BitLocker,此时开启 BitLocker,需要选择解锁方式,仅有”插入 U 盘“和”输入密码“。也即在没有 TPM 提供密钥时只能通过这两种方式提供密钥。选择输入密码,则会在启动后出现 Bootloader 让输入密码解锁。
BitLocker 文档中明确说明,没有 TPM 无法使用 BitLocker 提供的预启动系统完整性验证。
此外,经测试,没有 Secure Boot 但有 TPM 仍可以直接开启系统盘 BitLocker 加密,且能自动解密,无需手动输入密码。可见系统盘 BitLocker 加密功能不依赖于 Secure Boot。
没有启用 Secure Boot 意味着 BootLoader 可能是不可信的,所以可以自己做一个钓鱼 BootLoader 来骗机主的密钥。
一点额外的说明
公钥是不需要保密的,所以 Secure Boot 的公钥只要能固化在固件里防篡改就行,启动时就有能公钥去验证 Bootloader,不需要存在 TPM 中。防篡改的要求之一就是上述的仅能由用户或持有正确密钥的程序来更新签名数据库和吊销的签名数据库。
UEFI 的密码可以存在 TPM 中,以便清除 CMOS 也不能被随意修改设置(导入新的 Secure Boot 公钥)。
文末吐槽:微软抽象中文大赏
Microsoft Learn 里的文档是真的不能看中文,要么语言不通,要么有问题,甚至有可能直接给出截然相反的意思。当然也有可能是微软对中文有自己独到的理解,岂是我等凡人能懂的。
以下是参考文献中的一部分微软抽象中文大赏(附原文)
参考文献
- Secure boot | Microsoft Learn
- Secure the Windows boot process - Windows security | Microsoft Learn
- TPM芯片的工作原理是什么?