如何更新具有 UEFI 撤销列表文件的 dbx 变量?

如何更新具有 UEFI 撤销列表文件的 dbx 变量?

也许你已经想到了BootHole漏洞,它允许通过 GRUB2 引导加载程序绕过 EFI/UEFI SecureBoot 机制。我个人使用自己的 EFI/UEFI 密钥(包括 PK 密钥),并且 EFI/UEFI 固件内没有任何 MS 密钥。所以这个漏洞并没有真正影响我。无论如何,有一个修复程序允许用户使用以下命令更新 DBX 变量UEFI 撤销列表文件。据网站称:

这些文件用于更新安全启动禁止签名数据库 dbx。它包含在 *Data 中传递给 SetVariable() 的原始字节...与新变量值连接的 EFI_VARIABLE_AUTHENTICATION_2。用法示例:SetVariable( "dbx", EFI_IMAGE_SECURITY_DATABASE_GUID, NV+BS+RT+AT+AppendWrite, dbxUpdateDotBin_sizeInBytes, *dbxUpdateDotBin_bytes)。 dbxupdate.bin 已包含 Microsoft KEK 签名(按照 UEFI 规范指定的方式进行编码)。

所以它有 MS KEK 证书,但是机器的 EFI/UEFI 固件没有此证书的情况怎么办?在这种情况下如何使用此文件更新 DBX 变量?

答案1

这取决于机器拥有哪些 KEK 证书。

如果它有 KEK 证书拥有私钥,您可以从文件开头剥离现有签名dbxupdate_x64.bin,并使用您自己的 KEK 证书对生成的 EFI_SIGNATURE_LIST (我已经看到了.esl它的后缀)进行签名,然后您应该能够将其应用于安全引导dbx变量,例如efi-updatevar来自的命令jejb 的 efitools

基于这篇 Microsoft 支持文章链接到这个 PowerShell 脚本,程序为:

  1. 忽略文件的前 40 个字节。

  2. 文件的接下来的两个字节必须是0x30 0x82

  3. 文件的接下来两个字节是大端签名的长度。例如,如果接下来的两个字节是0x0c0xda,则签名0x0cda长度 == 3290 字节。

  4. 签名之后到文件末尾的字节是 EFI_SIGNATURE_LIST 内容。举个0x0cda例子,这意味着内容40 + 2 + 2 + 0x0cda从文件开头 == 3334 字节开始。即 40 个字节 + 2 个字节0x30 0x82+ 2 个签名长度字节 +0x0cda签名字节。

如果固件允许您直接编辑安全启动变量,而无需检查“BIOS 设置”菜单中的签名,您也许可以将其存储dbxupdate_x64.bin到您的 EFI 系统分区,然后编辑该dbx变量以将其现有内容替换为以下内容该文件的。但从技术上讲,这本身可能是一个安全漏洞:允许 BIOS 设置不受限制地更改安全启动设置可能并不是安全启动设计者的初衷。

如果固件允许您仅删除安全启动主密钥(简称 PK),您应该注意,删除 PK 会将安全启动切换到所谓的设置模式,在该模式下,可以编辑所有安全启动变量,无需签名要求直到定义了新的 PK。 (这是允许您完全控制安全启动配置所需的最低 BIOS 设置功能。)

但是,如果您没有自己的 KEK 证书,并且无法将其进入系统,则必须从硬件供应商或拥有您的硬件 KEK 的任何人那里获取等效的签名更新文件。

相关内容