我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

EDK II PXE 驱动 RCE,先于 Secure Boot 执行(CVE-2026-97631)

服务器 PXE 网络启动期间,一个超大 ICMP 错误消息即可破坏内存并在操作系统加载前执行攻击者代码。请立即隔离 PXE 网络。

TL;DR

  • 当机器通过 IPv4 或 IPv6 进行 PXE 网络启动时,未经身份验证的网络攻击者可以发送一个超大的 ICMP 错误消息,破坏 UEFI 启动环境中的内存。这种破坏会在操作系统加载之前执行攻击者选定的字节。TianoCore 于 2026 年 10 月 22 日发布了通告 GHSA-99cj-7hg9-mp4m。
  • 暴露面是任何进行网络启动的 EDK II 固件,前提是攻击者在启动窗口内能访问其 PXE 监听器。影响发生在 Secure Boot 或度量启动验证或度量任何操作系统组件之前,因此这些防御不起作用。
  • TianoCore CVE 记录将其评为严重,CVSS v4.0 9.5。CISA 的 ADP 于 2026 年 10 月 30 日将利用状态记录为无,11 月 1 日核实的 KEV 数据中也没有此 CVE。所引来源未提供公开概念验证;这些情况不能排除未披露的利用。
  • 通告未列出修复版本。请将 PXE 和置备网络与不可信流量隔离,禁用不必要的网络启动,并向服务器供应商确认其固件是否包含修复。

我受影响吗?

以下条件全部成立时,您处于暴露状态:

  • 机器固件包含存在漏洞的 EDK II PXE Base Code 驱动或其派生版本。
  • PXE 网络启动已启用,且机器通过 IPv4 或 IPv6 从网络启动或尝试启动。
  • 攻击者能在该启动窗口期间向机器的 IP 地址发送单播 ICMP 错误消息,网络距离不限。

仅从本地磁盘启动的机器不受影响。漏洞位于网络启动路径本身。

固件 受影响 修复
EDK II 根据通告,截至 2026-09-14 的 master 之前的所有修订;Ars Technica 称该缺陷已有 16 年历史 修复于 2026 年 10 月 15 日合入 master;没有任何已发布标签包含它
Debian 13 trixie 的 edk2(OVMF) 2025.02-8+deb13u1 无;追踪页面列为漏洞且未修复
Debian 12 bookworm 的 edk2(OVMF) 2022.11-6+deb12u2 无;追踪页面列为漏洞且未修复
Debian unstable(forky、sid)的 edk2 2026.08+ds-2 无;追踪页面列为未修复
服务器供应商固件 确认是否包含存在漏洞的 EDK II PXE 驱动 向供应商确认是否包含 10 月 15 日的修复

上述 Debian 软件包仍存在漏洞;供应商固件须逐一确认。请识别固件,再检查是否进行网络启动:

# Firmware vendor and version string, to ask the vendor about EDK II content
dmidecode -s bios-vendor
dmidecode -s bios-version

PXE 启动在固件中配置,请逐台服务器或通过置备工具盘点。向系统制造商确认已安装固件是否包含存在漏洞的驱动及其修复。

如何修复?

通告未列出修复版本。在供应商确认修复固件之前,请降低暴露风险:

  1. 将 PXE 和置备 VLAN 与不可信网络隔离,以限制网络启动期间恶意 ICMP 消息的投递。
  2. 在每台不需要网络启动的机器上禁用 PXE 和网络启动,从而彻底移除存在漏洞的监听器。
  3. 向服务器供应商询问其固件计划,并在更新发布时应用。根据 Ars Technica 引用的 Eclypsium 评估,该修复只需基本的代码改动和一次固件更新,无需密钥吊销或证书管理。

局限很明显。隔离只能减少谁能接触到正在启动的机器;它不修复驱动。禁用网络启动只在从不使用它的机器上消除暴露。在修复后的固件映像运行之前,网络层以下没有任何东西能阻止这次溢出本身。

根本原因是什么?

PXE 驱动把收到的每个 ICMP 错误消息复制进一个固定大小的字段,而且边界检查失效。随后这个循环把目标指针推进到该字段之外。

网络启动期间,NetworkPkg/UefiPxeBcDxe 中的 PXE Base Code 驱动为 ICMP 错误消息保持一个打开的接收请求。它把每个消息复制进其模式结构中的固定字段 EFI_PXE_BASE_CODE_ICMP_ERROR,即 Mode.IcmpError:一个 8 字节的 ICMP 头部联合体,后跟一个 494 字节的数据数组。

该字段在 MdePkg/Include/Protocol/PxeBaseCode.h 中定义:

typedef struct {
  UINT8     Type;
  UINT8     Code;
  UINT16    Checksum;
  union {
    UINT32    reserved;
    UINT32    Mtu;
    UINT32    Pointer;
    struct {
      UINT16    Identifier;
      UINT16    Sequence;
    } Echo;
  } u;
  UINT8    Data[494];
} EFI_PXE_BASE_CODE_ICMP_ERROR;

修复之前,PxeBcSupport.c 中的复制循环在 IPv4 和 IPv6 处理器中都像这样处理接收消息的分片:

  CopiedLen = 0;
  IcmpError = (UINT8 *)&Mode->IcmpError;

  for (Index = 0; Index < RxData->FragmentCount; Index++) {
    CopiedLen += RxData->FragmentTable[Index].FragmentLength;
    if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) {
      CopyMem (
        IcmpError,
        RxData->FragmentTable[Index].FragmentBuffer,
        RxData->FragmentTable[Index].FragmentLength
        );
    } else {
      CopyMem (
        IcmpError,
        RxData->FragmentTable[Index].FragmentBuffer,
        CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)
        );
    }

    IcmpError += CopiedLen;
  }

两个缺陷使边界检查失效。累计长度超过字段后,else 分支复制的是超出长度,而非剩余容量。根据分片布局,该写入可能超出目标字段。

这个循环还以 CopiedLen(累计总和)而不是当前分片的长度推进 IcmpError,因此写入游标随每个分片越走越远。接收路径上没有任何环节限制消息长度。因此,单个超大的 ICMP 错误消息就能把攻击者控制的字节写过 Mode.IcmpError,进入驱动的相邻数据。

如何被利用?

根据通告,攻击是启动窗口期间的一个单播数据包:

  1. 机器进入 IPv4 或 IPv6 的 PXE 启动,驱动对 ICMP 错误消息的接收请求生效。
  2. 攻击者向机器的 IP 地址发送一个单播 ICMP 错误消息,比 IcmpError 字段更大并携带选定的字节。只要数据包能到达正在启动的客户端,任何网络距离都可以。
  3. 接收路径把该消息交给 IPv4 的 PxeBcIcmpErrorDpcHandle 或 IPv6 的 PxeBcIcmp6ErrorDpcHandle,复制循环把数据写过字段,进入相邻内存。
  4. 被破坏的状态产生两种结果之一:确定性的启动挂起,或者(对于了解目标固件构建的攻击者)执行攻击者提供的字节,如下所述。

CISA 的 ADP 于 2026 年 10 月 30 日将利用状态记录为无,11 月 1 日核实的 KEV 数据中也没有此 CVE。所引来源未提供公开概念验证;这些情况不能排除未披露的利用。

攻击是如何流动的?

网络启动期间投递的一个超大 ICMP 错误,就足以破坏操作系统之前的环境。

flowchart LR A["PXE 启动期间
网络上的攻击者"] --> B["一个单播 ICMP 错误,
比字段更大,
携带选定的字节"] B --> C["接收处理器
PxeBcIcmpErrorDpcHandle
或其 IPv6 变体"] C --> D["复制循环写过
Mode.IcmpError
(缺少边界检查)"] D --> E["DXE 阶段的
内存破坏"] E --> F["启动挂起,或 CoreSignalEvent
分发伪造事件执行,
OS 加载前的 ring 0"]

攻击者能做什么?

通告描述了两种结果,都无需身份验证且发生在操作系统之前:

  • 确定性的启动挂起。驱动私有数据的破坏会在下一个 ICMP 错误时在 DXE 核心内引发 CPU 异常,于是机器无法从网络启动。这使操作系统置备和恢复无法进行。
  • 启动环境中的任意代码执行。了解目标固件构建的攻击者可以在同一数据包中放置一个伪造事件,让 CoreSignalEvent() 在 DXE 阶段分发攻击者提供的字节。代码在 ring 0 中运行,此时任何操作系统安全控制都不存在,而且早于 Secure Boot 或度量启动验证或度量任何操作系统组件。

通告要求在 PXE 启动窗口内投递 ICMP 错误,并未将攻击者限定在本地网络。实际可达性取决于路由、防火墙和置备网络的隔离。

为什么修复有效?

修复提交 64c7b0c9e7a43a9ef6d70943d36aaf5eaef507ec 用按分片的边界重写了两个复制循环。IPv4 处理器现在如下:

  for (Index = 0, IcmpError = (UINT8 *)&Mode->IcmpError, CopiedLen = 0;
       (Index < RxData->FragmentCount) &&
       (CopiedLen < sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR));
       Index++, IcmpError += FragmentLen, CopiedLen += FragmentLen)
  {
    FragmentLen = MIN (
                    RxData->FragmentTable[Index].FragmentLength,
                    (UINT32)(sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR) - CopiedLen)
                    );
    CopyMem (IcmpError, RxData->FragmentTable[Index].FragmentBuffer, FragmentLen);
  }

每次迭代最多复制字段中剩余的空间。它按同一分片长度推进游标,并在字段填满时停止,因此任何写入都无法越过 Mode.IcmpError 的末端。

IPv6 处理器得到了相同的改动,合并的拉取请求为两条路径添加了分片复制测试,还添加了一个在复制前清空 ICMP 错误缓冲区的提交。对于通告点名的 ICMP 接收路径,该修复是完整的。

修复于 2026 年 10 月 15 日合入 EDK II master。截至 11 月 1 日,最新标签仍为 edk2-stable202608,Debian 将上述软件包列为未修复。这些来源无法确定所有供应商固件的状态,请向供应商确认。

如何检查我是否已被入侵?

通告未公布入侵指标。由于存在漏洞的处理器在操作系统之前运行,仅凭操作系统日志无法排除利用。失败的尝试可能不会在主机上留下有用记录。

拒绝服务路径的可观测信号在置备服务器的日志中,而不是正在启动的机器里:

# PXE boot requests seen by a dnsmasq or dhcpd provisioning server
grep -h "PXEClient" /var/log/syslog | tail -20

将置备网络上无法解释的启动挂起视为线索,而非证据:正常的网络问题也会造成相同症状。如果您的威胁模型包含置备网络上的长期攻击者,请轮换这些启动映像携带的密钥。在供应商交付修复固件后,带外验证映像完整性。

时间线

  • 2026-09-24:TianoCore 预留 CVE-2026-97631。
  • 2026-09-28:AMI 在 EDK II 上公开一个点名该 CVE 并包含修复的拉取请求,据 Ars Technica,这破坏了发现者原定一月的披露计划。
  • 2026-10-15:重新制作的修复,拉取请求 13302,合入 EDK II master 分支。
  • 2026-10-22:TianoCore 发布通告 GHSA-99cj-7hg9-mp4m 和 CVE 记录。
  • 2026-10-27:Ars Technica 发布对该漏洞及披露的分析。
  • 2026-10-28:通告到达 oss-security 邮件列表。
  • 2026-10-30:CISA 的 ADP 记录无已知利用。 该 embargo 在通告发布前 24 天被打破:AMI 的公开拉取请求出现在 9 月 28 日,TianoCore 于 10 月 22 日发布。

从打破 embargo 的拉取请求到通告共 24 天
图 1:披露日期,从 9 月 28 日 AMI 的公开拉取请求到 10 月 30 日的 CISA ADP 评估。来源:GitHub、TianoCore 通告和 Ars Technica,2026 年 11 月 1 日核实

常见问题

这会影响只从本地磁盘启动的机器吗?

不会。漏洞位于 PXE 驱动的网络启动路径中,从不尝试 PXE 启动的机器不会打开该接收窗口。请确认实际启动行为和固件设置,不要假定网络启动已禁用。

为什么 Secure Boot 挡不住它?

被破坏的状态和被分发的字节在 DXE 阶段运行,早于操作系统加载。Secure Boot 和度量启动在该时刻尚未验证或度量任何操作系统组件。启动后期才介入的固件安全功能根本看不到攻击者的代码。

有可安装的固件更新吗?

通告未列出修复版本。修复已于 2026 年 10 月 15 日合入 EDK II master,但截至 11 月 1 日,最新上游标签和上述 Debian 软件包尚未包含它。请确认供应商固件是否包含修复,并在更新可用时应用。

攻击者利用它需要什么?

到正在启动机器的网络可达性、一个比字段更大的单播 ICMP 错误消息,以及对目标固件构建的了解。利用需要目标特定的地址,因此每个型号、版本和配置都需要单独调优,Eclypsium 如是说。

该漏洞在现实中被利用了吗?

CISA 的 ADP 于 2026 年 10 月 30 日将利用状态记录为无,11 月 1 日核实的 KEV 数据中也没有此 CVE。所引来源未提供公开概念验证;这些情况不能排除未披露的利用。

为什么披露发生在现在?

发现者,Anthropic 的 Alex Matrosov 和 Google 的 Dan Holmes-Mitra,原定在一月进行协调披露。AMI 在 2026 年 9 月 28 日公开了一个带修复和 CVE 编号的拉取请求。此事被发现者知晓后,据 Ars Technica,TianoCore 发布了通告。

参考文献

  • 通告 GHSA-99cj-7hg9-mp4m,TianoCore,CVSS v4.0 9.5: https://github.com/tianocore/edk2/security/advisories/GHSA-99cj-7hg9-mp4m (2026 年 10 月 22 日发布,2026 年 11 月 1 日核实)
  • CVE-2026-97631 记录,TianoCore CNA: https://www.cve.org/CVERecord?id=CVE-2026-97631 (2026 年 11 月 1 日核实)
  • EDK II 修复提交 64c7b0c9e7a43a9ef6d70943d36aaf5eaef507ec: https://github.com/tianocore/edk2/commit/64c7b0c9e7a43a9ef6d70943d36aaf5eaef507ec (2026 年 11 月 1 日核实)
  • 已合并的修复拉取请求 13302: https://github.com/tianocore/edk2/pull/13302 (2026 年 10 月 15 日合并,2026 年 11 月 1 日核实)
  • AMI 打破 embargo 的拉取请求 13200: https://github.com/tianocore/edk2/pull/13200 (2026 年 9 月 28 日开启,2026 年 11 月 1 日核实)
  • Ars Technica 对该漏洞与披露的分析: https://arstechnica.com/security/2026/10/code-execution-flaw-in-uefi-firmware-threatens-most-servers-on-planet-earth/ (2026 年 10 月 27 日发布,2026 年 11 月 1 日核实)
  • oss-security 公告: https://www.openwall.com/lists/oss-security/2026/10/28/4 (2026 年 10 月 28 日发布,2026 年 11 月 1 日核实)
  • CVE-2026-97631 的 Debian 追踪页面,edk2 软件包漏洞且未修复: https://security-tracker.debian.org/tracker/CVE-2026-97631 (2026 年 11 月 1 日核实)
  • 修复提交时 MdePkg 中的 EFI_PXE_BASE_CODE_ICMP_ERROR 定义: https://github.com/tianocore/edk2/blob/64c7b0c9e7a43a9ef6d70943d36aaf5eaef507ec/MdePkg/Include/Protocol/PxeBaseCode.h (2026 年 11 月 1 日核实)
  • CISA KEV 目录,针对 CVE-2026-97631 核实的订阅源: https://www.cisa.gov/known-exploited-vulnerabilities-catalog (2026 年 11 月 1 日核实)
  • EDK II 发布版本: https://github.com/tianocore/edk2/releases