TAA - TSX 异步中止

TAA 是一种硬件漏洞,它允许非特权推测性访问通过在 Intel TSX 事务区域内使用异步中止,访问各种 CPU 内部缓冲区中可用的数据。

受影响的处理器

此漏洞仅影响支持 Intel 事务同步扩展 (TSX) 的 Intel 处理器,当 IA32_ARCH_CAPABILITIES MSR 中的 TAA_NO 位(第 8 位)为 0 时。在 IA32_ARCH_CAPABILITIES MSR 中 MDS_NO 位(第 5 位)为 0 的处理器上,现有的 MDS 缓解措施也对 TAA 有效。

处理器是否受影响可以通过 sysfs 中的 TAA 漏洞文件读取。请参阅 TAA 系统信息

问题

执行存储、加载或 L1 重新填充操作时,处理器将数据写入临时微架构结构(缓冲区)。这些缓冲区中的数据可以作为优化转发到加载操作。

Intel TSX 是 x86 指令集架构的扩展,它增加了硬件事务内存支持,以提高多线程软件的性能。TSX 允许处理器通过动态避免不必要的同步来暴露和利用应用程序中隐藏的并发性。

TSX 支持原子内存事务,这些事务要么提交(成功)要么中止。中止期间,事务区域内发生的操作会被回滚。异步中止会在其他情况下发生,例如当不同线程访问事务区域内也使用的缓存行时,如果该访问可能导致数据竞争。

在未完成的异步中止之后,某些推测性执行的加载可能会立即从这些内部缓冲区读取数据并将其传递给依赖操作。然后这可以用于通过缓存侧信道攻击推断值。

由于缓冲区可能在超线程 (Hyper-Threads) 之间共享,因此跨超线程攻击是可能的。

恶意行为的受害者不需要使用 TSX。只有攻击者需要启动 TSX 事务并引发异步中止,这反过来可能泄露存储在缓冲区中的数据。

更详细的技术信息可在 TAA 特定的 x86 架构部分中找到:Documentation/arch/x86/tsx_async_abort.rst

攻击场景

针对 TAA 漏洞的攻击可以由在主机或访客上运行的非特权应用程序实施。

与 MDS 类似,攻击者无法控制可能泄露的内存地址。只有受害者负责将数据带到 CPU。因此,恶意行为者必须尽可能多地采样数据,然后对其进行后处理,以尝试从中推断出任何有用的信息。

潜在攻击者只能读取数据。此外,使用此技术没有直接的权限升级。

TAA 系统信息

Linux 内核提供了一个 sysfs 接口,用于枚举已缓解系统的当前 TAA 状态。相关的 sysfs 文件是

/sys/devices/system/cpu/vulnerabilities/tsx_async_abort

此文件中的可能值为

‘易受攻击’

CPU 受此漏洞影响,并且微代码和内核缓解措施未应用。

‘易受攻击:尝试清除 CPU 缓冲区,无微代码’

处理器易受攻击,但微代码未更新。缓解措施以尽力而为的方式启用。

如果处理器易受攻击,但通过 CPUID 未宣布基于微代码的缓解机制的可用性,则内核会选择尽力而为的缓解模式。此模式调用缓解指令,但不保证它们会清除 CPU 缓冲区。

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

‘缓解:清除 CPU 缓冲区’

微代码已更新以清除缓冲区。TSX 仍然启用。

‘缓解:TSX 已禁用’

TSX 已禁用。

‘不受影响’

CPU 不受此问题影响。

缓解机制

内核检测受影响的 CPU 和所需的微代码是否存在。如果 CPU 受影响且微代码可用,则内核默认启用缓解措施。

缓解措施可以在启动时通过内核命令行选项控制。请参阅 内核命令行上的缓解控制

虚拟化缓解

主机具有 TAA 微代码且此前通过禁用 TSX 已缓解 TAA 的受影响系统,无论 VM 的状态如何,都不会受到攻击。

在所有其他情况下,如果主机没有 TAA 微代码或内核未缓解,则系统可能易受攻击。

内核命令行上的缓解控制

内核命令行允许在启动时通过选项“tsx_async_abort=”控制 TAA 缓解措施。此选项的有效参数为

off

此选项在受影响的平台上禁用 TAA 缓解措施。如果系统启用了 TSX(请参阅下一个参数)并且 CPU 受影响,则系统易受攻击。

full

TAA 缓解已启用。如果 TSX 已启用,在受影响的系统上,它将在环转换时清除 CPU 缓冲区。在受 MDS 影响并部署 MDS 缓解措施的系统上,TAA 也得到缓解。在此类系统上指定此选项将无效。

full,nosmt

与 tsx_async_abort=full 相同,但对已启用 TSX 的易受攻击 CPU 禁用 SMT。这是完整的缓解措施。当 TSX 被禁用时,SMT 不会被禁用,因为 CPU 不易受到跨线程 TAA 攻击。

不指定此选项等同于“tsx_async_abort=full”。对于同时受 TAA 和 MDS 影响的处理器,仅指定“tsx_async_abort=off”而不附带“mds=off”将无效,因为两种漏洞使用相同的缓解措施。

内核命令行还允许在支持 TSX 控制的 CPU 上使用参数“tsx=”控制 TSX 功能。MSR_IA32_TSX_CTRL 用于控制 TSX 功能以及 CPUID 中 TSX 功能位(RTM 和 HLE)的枚举。

有效选项为

off

禁用系统上的 TSX。

请注意,此选项仅在不受 MDS 影响的较新 CPU 上生效,即具有 MSR_IA32_ARCH_CAPABILITIES.MDS_NO=1 并通过微代码更新获得新的 IA32_TSX_CTRL MSR 的 CPU。这个新的 MSR 允许可靠地停用 TSX 功能。

on

启用 TSX。

尽管所有已知的安全漏洞都有缓解措施,但 TSX 已知是几个先前与推测相关的 CVE 的加速器,因此启用它可能存在未知的安全风险。

auto

如果存在 X86_BUG_TAA,则禁用 TSX;否则,在系统上启用 TSX。

不指定此选项等同于“tsx=off”。

以下“tsx_async_abort”和“tsx”的组合是可能的。对于受影响的平台,tsx=auto 等同于 tsx=off,结果将是

tsx=on

tsx_async_abort=full

系统将使用 VERW 清除 CPU 缓冲区。在 SMT 机器上,跨线程攻击仍然可能。

tsx=on

tsx_async_abort=full,nosmt

如上所述,SMT 上的跨线程攻击已缓解。

tsx=on

tsx_async_abort=off

系统易受攻击。

tsx=off

tsx_async_abort=full

如果微代码提供了 TSX 控制 MSR,则 TSX 可能会被禁用。如果是这样,系统将不会受到攻击。

tsx=off

tsx_async_abort=full,nosmt

同上

tsx=off

tsx_async_abort=off

同上

对于未受影响的平台,“tsx=on”和“tsx_async_abort=full”不会清除 CPU 缓冲区。对于没有 TSX 控制(MSR_IA32_ARCH_CAPABILITIES.MDS_NO=0)的平台,“tsx”命令行参数无效。

对于受影响的平台,下表显示了 CPUID 位 MD_CLEAR 和 IA32_ARCH_CAPABILITIES MSR 位 MDS_NO 和 TSX_CTRL_MSR 组合的缓解状态。

MDS_NO

MD_CLEAR

TSX_CTRL_MSR

状态

0

0

0

易受攻击(需要微代码)

0

1

0

MDS 和 TAA 通过 VERW 缓解

1

1

0

MDS 已修复,如果 TSX 启用,TAA 易受攻击,因为 MD_CLEAR 没有意义且 VERW 不保证清除缓冲区

1

X

1

MDS 已修复,TAA 可以通过 VERW 或 TSX_CTRL_MSR 缓解

缓解选择指南

1. 受信任的用户空间和访客

如果所有用户空间应用程序都来自受信任的来源且不执行外部提供的不可信代码,则可以禁用缓解措施。这同样适用于具有受信任访客的虚拟化环境。

2. 不受信任的用户空间和访客

如果系统上存在不可信的应用程序或访客,启用 TSX 可能会允许恶意行为者从主机或在同一物理核心上运行的其他进程中泄露数据。

如果微代码可用且主机上禁用了 TSX,即使 VM 未明确启用缓解措施,也能在虚拟化环境中防止攻击。

默认缓解措施

内核对易受攻击处理器的默认操作是

  • 部署 TSX 禁用缓解措施 (tsx_async_abort=full tsx=off)。