微软发明的一种行业范围标准,旨在保护 Windows 和后来的 Linux 设备免受固件感染,在其存在的 14 年中,有 13 年很容易被绕过。这一发现是由安全公司 ESET 的研究人员在识别了 11 个固件映像(至少一个是 2013 年的)后发现的,这些固件映像已知存在缺陷,但无论如何仍由该软件公司签名。
这些映像称为垫片,其发明目的是为了将安全启动扩展到 Linux 设备和实用软件。使用一种简单到新手黑客都可以执行的技术,这些旧的、被遗忘的垫片可以用来完全规避嵌入到设备主板的 UEFI(统一可扩展固件接口)中的保护。这一失误是微软负责监督填充程序签名的结果,一旦发现其中存在漏洞,就未能撤销公开可用的镜像。
该威胁同样扩展到 Windows 和 Linux 用户,因为该填充程序可以安装在运行这两种操作系统的设备上。从那里,攻击者可以破坏强制的数字签名固件链,以安装恶意固件,该固件在启动过程的早期加载,并在重新安装操作系统或更换硬盘后仍然存在。
ESET 研究员 Martin Smolár 周二写道:“让这些旧垫片变得危险的并不是一个新的漏洞。” “绕过 UEFI 安全启动不需要新的漏洞。攻击者不需要复杂的利用原语,只需一份旧的、仍然受信任但未撤销的 shim 二进制文件的副本以及对 UEFI shim 工作原理的基本了解。这足以绕过 UEFI 安全启动这样的基本安全功能。”
安全启动于 2012 年推出,旨在削弱 Bootkit(此类恶意固件的术语)的威胁。如果没有安全启动,只要对设备进行短暂的物理访问(即使设备已关闭),攻击者就可以安装类似于俄罗斯国家黑客在 2018 年使用的 LoJax、2020 年发现的 MosaicRegressor、2022 年发现的 CosmicStrand 和 2023 年发现的 BlackLotus 的启动工具包。还有一些其他野外启动工具包以 ESpecter、FinSpy 和 MoonBounce 等名称进行跟踪。
大多数(但并非全部)Bootkit 恶意软件要求攻击者对目标设备进行物理访问。此类访问是安全启动明确需要防范的威胁模型之一。
CERT 编译的所有 11 个垫片的列表显示,其中一些垫片已被 Redhat、OpenSuse 和 Oracle 等 Linux 发行商使用。其他的是第三方软件的一部分,例如芬兰 PC-Doctor 的入学考试委员会。其中许多是在某些保护措施(包括 SBAT 和 MOK 拒绝名单)存在之前建立的。其他人的代码或他们授权的第二阶段二进制文件中包含累积的错误。
Microsoft 用于 Windows 的数字签名 UEFI 引导加载程序是 Windows 计算机上唯一的信任锚。对于在启动过程中加载的组件,证书必须显式签署启动过程中执行的所有其他代码。
垫片的工作方式不同。它们是次要信任锚,由 Microsoft 使用其其他 UEFI 证书之一进行签名。从那里,嵌入到垫片中的属于主板或软件制造商的证书将授权随后加载的所有软件。
当在垫片中发现漏洞时,微软会撤销它们。就 11 个垫片而言,该公司未能做到这一点,有时甚至长达十多年。在 ESET 引起 CERT 和 Microsoft 的注意后,该公司最终在 6 月份定期发布的每月补丁中撤销了它们。
微软尚未解释这一失误是如何发生的以及为何发生。一个可能的原因是安全启动的工作方式非常复杂。 Windows 启动管理器和 UEFI 垫片都会加载两个数据库。 db 数据库列出了所有允许的签名证书和 Authenticode 哈希值。 dbx 包含不再受信任的证书和哈希值。对于要加载的组件,必须通过 db 对其进行授权,并且不能在 dbx 中撤销。
鉴于启动期间执行的 Linux 组件数量较多,不可能在这些数据库中列出每个组件,因为 dbx 仅分配了 32kb 的空间。因此微软采取了其他撤销方法,特别是SBAT(安全启动高级目标)和安全启动安全版本号(SVN)。
“简而言之,dbx 撤销二进制文件,SBAT 和 Microsoft 的 Secure Boot SVN 撤销版本,”Smolár 解释道。 “当在支持这些基于版本的撤销机制之一的 UEFI 应用程序中发现漏洞时,真正需要排除的是每一个构建(包括损坏的构建),并且可以通过版本号捕获比通过一长串哈希值更容易捕获的漏洞。”
UEFI 加载程序中的每个组件都携带由验证二进制文件本身的同一证书签名的元数据。此元数据为组件命名并为其分配代号,每次发布新的安全修复程序时该代号都会递增。
UEFI 中的仅引导变量存储每个组件允许的最小可接受代号。变量号是由垫片而不是固件强制执行的。
填充程序还嵌入了策略,因此执行不完全依赖于外部变量。这允许通过称为 SbatLevel 的机制纳入新策略。
研究人员写道:“每次启动时,垫片都会首先根据策略验证自己的 SBAT 元数据,这样过时的垫片就可以拒绝自身,然后对其加载的每个二进制文件应用相同的测试,拒绝任何代数低于策略要求的最小值的任何内容。”
该过程的复杂性还不止于此。结果是垫片嵌入了供应商管理的内置垫片证书,该证书授权随后加载的所有引导加载程序和实用程序。想要更全面描述的读者可以查阅周二帖子的这一部分。
使该过程进一步复杂化的是,即使上个月末签署填充程序的 Microsoft 证书到期,也不足以撤销 ESET 识别的证书。
ESET 识别的填充程序授权已知易受各种攻击的辅助组件。例如,Oracle shim 签署了一个容易受到 CVE-2015-5381 攻击的二进制文件。 Smolár 表示,利用该漏洞所需的技能很低。其他易受攻击的 shim 无法支持保护,例如 MOK 拒绝列表强制执行和 SBAT 强制执行,这两种保护措施均在受影响的 shim 发布后生效。还有其他已识别的垫片在其自己的代码中包含漏洞。
为了简洁起见,本文省略了周二报告中包含的许多其他细节。
如前所述,这些易受攻击的填充程序可用于 Windows 和 Linux 计算机,尽管在默认状态下可能不适用于 Windows 11 安全核心 PC。任何安装了微软六月更新批次的Windows用户都不再容易受到攻击。 Linux 用户应检查 Linux 供应商固件服务或咨询其经销商。使用 uefi-dbx-audit 脚本可以获取吊销状态。
十多年来,攻击者一直有办法通过数字黑客脚本绕过安全启动,但这并不是对微软与硬件制造商合作提出的机制的认可。如前所述,造成这场灾难的一个关键因素是其复杂性。
“这是对整个安全启动模型的严厉谴责,”固件安全专家、runZero 首席执行官兼创始人、长期批评安全启动的 HD Moore 在接受采访时表示。他的抱怨包括微软是整个 UEFI 平台事实上的信任根、保护措施无法充分扩展,以及即使在顶级证书过期后组件也无法启动。
“最终结果是大量未知的(除了微软之外的所有人)签名的东西绕过了安全启动——其中一些可以用来启动其他东西——并且两者都存在正常的安全漏洞和其他错误,这意味着它们可以用来启动几乎任何东西,”摩尔补充道。 “整个生态系统有些破损,需要重新启动。”
丹·古丁的照片