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 支持原子内存事务,这些事务要么提交(成功),要么中止。在中止期间,在事务区域内发生的操作会被回滚。异步中止发生在其他选项中,当不同的线程访问也用于事务区域内的缓存行时,如果该访问可能导致数据竞争。
在未完成的异步中止之后,某些推测执行的加载可能会从这些内部缓冲区读取数据并将其传递给依赖的操作。然后可以通过缓存侧信道攻击来推断该值。
由于缓冲区可能在超线程之间共享,因此可以进行跨超线程攻击。
恶意行为者的受害者不需要使用 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 受影响且微代码可用,则内核默认启用缓解措施。
可以在启动时通过内核命令行选项控制缓解措施。请参阅 内核命令行上的缓解控制。
虚拟化缓解¶
先前通过禁用 TSX 来缓解 TAA 的主机具有 TAA 微代码的受影响系统,无论虚拟机的状态如何,都不易受攻击。
在所有其他情况下,如果主机没有 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=” 参数在支持 TSX 控制的 CPU 上控制 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。这个新的 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
通过 VERW 缓解 MDS 和 TAA
1
1
0
MDS 已修复,如果启用了 TSX,TAA 仍然容易受到攻击,因为 MD_CLEAR 没有意义,并且不能保证 VERW 会清除缓冲区
1
X
1
MDS 已修复,可以通过 VERW 或 TSX_CTRL_MSR 缓解 TAA
缓解选择指南¶
1. 可信的用户空间和访客¶
如果所有用户空间应用程序都来自受信任的来源,并且不执行从外部提供的不可信代码,则可以禁用缓解措施。这同样适用于具有受信任访客的虚拟化环境。
2. 不可信的用户空间和访客¶
如果系统上有不可信的应用程序或访客,则启用 TSX 可能会允许恶意行为者从主机或从同一物理内核上运行的其他进程中泄露数据。
如果微代码可用并且主机上禁用了 TSX,则即使虚拟机没有显式启用缓解措施,也可以在虚拟化环境中防止攻击。
默认缓解措施¶
对于易受攻击的处理器,内核的默认操作是:
部署 TSX 禁用缓解措施(tsx_async_abort=full tsx=off)。