处理器 MMIO 过期数据漏洞

处理器 MMIO 过期数据漏洞是一类可以暴露数据的内存映射 I/O (MMIO) 漏洞。暴露数据的操作序列范围从简单到非常复杂。由于大多数漏洞都需要攻击者访问 MMIO,因此许多环境不受影响。使用虚拟化(其中向不受信任的客户机提供 MMIO 访问权限)的系统环境可能需要缓解措施。这些漏洞不是瞬态执行攻击。但是,这些漏洞可能会将过期数据传播到核心填充缓冲区中,随后可以通过未缓解的瞬态执行攻击推断出这些数据。这些漏洞的缓解措施包括微代码更新和软件更改的组合,具体取决于平台和使用模型。其中一些缓解措施类似于用于缓解微架构数据采样 (MDS) 或用于缓解特殊寄存器缓冲区数据采样 (SRBDS) 的措施。

数据传播器

传播器是将过期数据从一个微架构缓冲区或寄存器复制或移动到另一个缓冲区的操作。处理器 MMIO 过期数据漏洞是可能导致将过期数据直接读取到体系结构上、软件可见状态或从缓冲区或寄存器中采样的操作。

填充缓冲区过期数据传播器 (FBSDP)

过期数据可能会在某些非一致性写入时从填充缓冲区 (FB) 传播到非一致性非核心部分。填充缓冲区传播本身不会使过期数据在体系结构上可见。必须将过期数据传播到可以读取或采样的位置。

边带过期数据传播器 (SSDP)

边带过期数据传播器 (SSDP) 仅限于客户端(包括 Intel Xeon 服务器 E3)非核心实现。边带响应缓冲区由所有客户端核心共享。对于转到边带目的地的非一致性读取,非核心逻辑会将 64 字节的数据返回到核心,其中包括来自事务缓冲区和边带响应缓冲区的请求数据和未请求的过期数据。因此,来自边带响应和事务缓冲区的过期数据现在可能驻留在核心填充缓冲区中。

主过期数据传播器 (PSDP)

主过期数据传播器 (PSDP) 仅限于客户端(包括 Intel Xeon 服务器 E3)非核心实现。与边带响应缓冲区类似,主响应缓冲区由所有客户端核心共享。对于某些处理器,MMIO 主读取会将 64 字节的数据返回到核心填充缓冲区,其中包括请求的数据和未请求的过期数据。这与边带过期数据传播器类似。

漏洞

设备寄存器部分写入 (DRPW) (CVE-2022-21166)

某些端点 MMIO 寄存器错误地处理小于寄存器大小的写入。不是中止写入或仅复制正确的字节子集(例如,对于 2 字节写入,复制 2 字节),而是可以将比写入事务指定的更多的字节写入寄存器。在受 FBSDP 影响的处理器上,这可能会暴露创建写入事务的核心的填充缓冲区中的过期数据。

共享缓冲区数据采样 (SBDS) (CVE-2022-21125)

在传播器可能已在非核心周围移动数据并将过期数据复制到客户端核心填充缓冲区之后,受 MFBDS 影响的处理器可能会从填充缓冲区泄漏数据。它仅限于客户端(包括 Intel Xeon 服务器 E3)非核心实现。

共享缓冲区数据读取 (SBDR) (CVE-2022-21123)

它与共享缓冲区数据采样 (SBDS) 类似,只是将数据直接读取到体系结构上软件可见的状态。它仅限于客户端(包括 Intel Xeon 服务器 E3)非核心实现。

受影响的处理器

并非所有 CPU 都受到所有变体的影响。例如,服务器市场的大多数处理器(不包括 Intel Xeon E3 处理器)仅受设备寄存器部分写入 (DRPW) 的影响。

以下是受影响的 Intel 处理器列表 [1]

通用名称

系列_型号

步进

HASWELL_X

06_3FH

2,4

SKYLAKE_L

06_4EH

3

BROADWELL_X

06_4FH

全部

SKYLAKE_X

06_55H

3,4,6,7,11

BROADWELL_D

06_56H

3,4,5

SKYLAKE

06_5EH

3

ICELAKE_X

06_6AH

4,5,6

ICELAKE_D

06_6CH

1

ICELAKE_L

06_7EH

5

ATOM_TREMONT_D

06_86H

全部

LAKEFIELD

06_8AH

1

KABYLAKE_L

06_8EH

9 至 12

ATOM_TREMONT

06_96H

1

ATOM_TREMONT_L

06_9CH

0

KABYLAKE

06_9EH

9 至 13

COMETLAKE

06_A5H

2,3,5

COMETLAKE_L

06_A6H

0,1

ROCKETLAKE

06_A7H

1

如果 CPU 在受影响的处理器列表中,但不受某个变体的影响,则会在 MSR IA32_ARCH_CAPABILITIES 中通过新位来指示。如稍后部分所述,所有变体的缓解措施基本相同,即通过 VERW 指令清除 CPU 填充缓冲区。

MSR 中的新位

较新的处理器和现有受影响处理器上的微代码更新在 IA32_ARCH_CAPABILITIES MSR 中添加了新位。这些位可用于枚举处理器 MMIO 过期数据漏洞的特定变体和缓解能力。

MSR IA32_ARCH_CAPABILITIES

位 13 - SBDR_SSDP_NO - 设置后,处理器不受以下任一情况的影响

共享缓冲区数据读取 (SBDR) 漏洞或边带过期数据传播器 (SSDP)。

位 14 - FBSDP_NO - 设置后,处理器不受填充缓冲区的影响

过期数据传播器 (FBSDP)。

位 15 - PSDP_NO - 设置后,处理器不受主过期数据的影响

传播器 (PSDP)。

位 17 - FB_CLEAR - 设置后,VERW 指令将覆盖 CPU 填充缓冲区

作为 MD_CLEAR 操作一部分的值。不枚举 MDS_NO(表示它们受 MDS 影响)但枚举对 L1D_FLUSH 和 MD_CLEAR 的支持的处理器隐式地将 FB_CLEAR 作为其 MD_CLEAR 支持的一部分进行枚举。

位 18 - FB_CLEAR_CTRL - 处理器支持读取和写入 MSR

IA32_MCU_OPT_CTRL[FB_CLEAR_DIS]。在这样的处理器上,可以设置 FB_CLEAR_DIS 位以使 VERW 指令不执行 FB_CLEAR 操作。并非所有支持 FB_CLEAR 的处理器都支持 FB_CLEAR_CTRL。

MSR IA32_MCU_OPT_CTRL

位 3 - FB_CLEAR_DIS - 设置后,VERW 指令不执行 FB_CLEAR 操作。当系统软件认为有必要时,这可能有助于减少 FB_CLEAR 的性能影响(例如,当性能更重要或不受信任的软件没有 MMIO 访问权限时)。请注意,FB_CLEAR_DIS 对枚举没有影响(例如,它不会更改 FB_CLEAR 或 MD_CLEAR 枚举),并且可能并非所有枚举 FB_CLEAR 的处理器都支持它。

缓解

与 MDS 一样,处理器 MMIO 过期数据漏洞的所有变体都具有相同的缓解策略,以强制 CPU 在攻击者可以提取秘密之前清除受影响的缓冲区。

这是通过结合微代码更新,使用原本未使用且已过时的 VERW 指令来实现的。当执行 VERW 指令时,微代码会清除受影响的 CPU 缓冲区。

内核重用 MDS 函数来调用缓冲区清除操作。

mds_clear_cpu_buffers()

在受 MDS 影响的 CPU 上,内核已经在内核/用户空间、虚拟机监控程序/客户机和 C 状态(空闲)转换时调用 CPU 缓冲区清除操作。在此类 CPU 上不需要额外的缓解措施。

对于不受 MDS 或 TAA 影响的 CPU,仅当攻击者具有 MMIO 功能时才需要缓解。因此,内核/用户空间不需要 VERW。对于虚拟化的情况,仅当具有 MMIO 功能的客户机进入 VMENTER 时才需要 VERW。

缓解点

返回用户空间

与受 MDS/TAA 影响时相同的 MDS 缓解措施,否则不需要缓解措施。

C 状态转换

CPU 在 C 状态转换期间对控制寄存器的写入可以将数据从填充缓冲区传播到非核心缓冲区。在 C 状态转换之前执行 VERW 以清除 CPU 填充缓冲区。

客户机入口点

当处理器也受 MDS/TAA 影响时,采用与 MDS 相同的缓解措施,否则仅在 MMIO 功能的客户机进入 VMENTER 时执行 VERW。在不受 MDS/TAA 影响的 CPU 上,没有 MMIO 访问权限的客户机无法利用处理器 MMIO 陈旧数据漏洞提取机密信息,因此无需为此类客户机执行 VERW。

内核命令行上的缓解控制

内核命令行允许在启动时使用选项“mmio_stale_data=”控制处理器 MMIO 陈旧数据缓解措施。此选项的有效参数为

full

如果 CPU 存在漏洞,则启用缓解措施;在退出到用户空间和进入虚拟机时清除 CPU 缓冲区。也会保护空闲转换。它不会自动禁用 SMT。

full,nosmt

与 full 相同,但在存在漏洞的 CPU 上禁用 SMT。这是完整的缓解措施。

off

完全禁用缓解措施。

如果 CPU 受影响,并且内核命令行上未提供 mmio_stale_data=off,则内核会选择适当的缓解措施。

缓解状态信息

Linux 内核提供了一个 sysfs 接口来枚举系统的当前漏洞状态:系统是否存在漏洞以及哪些缓解措施处于活动状态。相关的 sysfs 文件是

/sys/devices/system/cpu/vulnerabilities/mmio_stale_data

此文件中的可能值为

“不受影响”

处理器不存在漏洞

“存在漏洞”

处理器存在漏洞,但未启用任何缓解措施

“存在漏洞:尝试清除 CPU 缓冲区,无微代码”

处理器存在漏洞,但未更新微代码。缓解措施会尽最大努力启用。

如果处理器存在漏洞,但基于微代码的缓解机制的可用性未通过 CPUID 公告,则内核会选择尽最大努力的缓解模式。此模式会调用缓解指令,但不保证它们会清除 CPU 缓冲区。

这样做是为了解决虚拟化场景,其中主机已应用微代码更新,但虚拟机监控程序尚未更新以将 CPUID 公开给客户机。如果主机已更新微代码,则保护会生效;否则,会毫无意义地浪费一些 CPU 周期。

“缓解:清除 CPU 缓冲区”

处理器存在漏洞,并且已启用 CPU 缓冲区清除缓解措施。

“未知:没有缓解措施”

由于处理器已超出服务周期,因此处理器漏洞状态未知。不会尝试缓解。

定义:

服务周期:利用英特尔平台更新 (IPU) 流程或其他类似机制为英特尔处理器或平台提供功能和安全更新的过程。

服务更新结束 (ESU):ESU 是指英特尔将不再提供服务(例如通过 IPU 或其他类似更新流程)的日期。ESU 日期通常与季度末对齐。

如果处理器存在漏洞,则以下信息将附加到上述信息中

“SMT 存在漏洞”

SMT 已启用

“SMT 已禁用”

SMT 已禁用

“SMT 主机状态未知”

内核在虚拟机中运行,主机 SMT 状态未知

参考资料