处理器MMIO陈旧数据漏洞

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

数据传播器

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

填充缓冲区陈旧数据传播器(FBSDP)

在某些非一致性写入时,陈旧数据可能会从填充缓冲区(FB)传播到un-core的非一致性部分。填充缓冲区传播本身不会使陈旧数据在架构上可见。陈旧数据必须传播到可以读取或采样它的位置。

边带陈旧数据传播器(SSDP)

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

主陈旧数据传播器(PSDP)

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

漏洞

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

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

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

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

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

它与共享缓冲区数据采样(SBDS)类似,不同之处在于数据直接读入架构上软件可见的状态。它仅限于客户端(包括Intel Xeon服务器E3)un-core实现。

受影响的处理器

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

以下是受影响的英特尔处理器列表[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指令将作为MD_CLEAR操作的一部分覆盖CPU填充缓冲区

值。未枚举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操作。这在系统软件认为有必要时(例如,当性能更关键,或者不受信任的软件没有MMIO访问时)可能有助于减少FB_CLEAR的性能影响。请注意,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状态转换期间的控制寄存器写入可以将数据从填充缓冲区传播到un-core缓冲区。在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状态未知

参考资料