GDS - 收集数据采样¶
收集数据采样 (Gather Data Sampling) 是一种硬件漏洞,它允许非特权推测性地访问先前存储在向量寄存器中的数据。
问题¶
当收集指令从内存执行加载时,不同的数据元素会合并到目标向量寄存器中。然而,当一个瞬态执行的收集指令遇到故障时,来自架构或内部向量寄存器的过时数据可能会被瞬态转发到目标向量寄存器。这将允许恶意攻击者使用典型的旁道技术(如缓存时序攻击)推断过时数据。GDS 是一种纯粹基于采样的攻击。
攻击者使用收集指令来推断过时的向量寄存器数据。受害者除了使用向量寄存器外,不需要做任何特殊的事情。受害者无需使用收集指令即可易受攻击。
由于缓冲区在超线程 (Hyper-Threads) 之间共享,因此跨超线程攻击是可能的。
攻击场景¶
如果没有缓解措施,GDS 几乎可以跨越所有权限边界推断过时数据。
非 enclave 可以推断 SGX enclave 数据 用户空间可以推断内核数据 客户机可以从主机推断数据 客户机可以从其他客户机推断数据 用户可以从其他用户推断数据
因此,确保在低权限上下文(如访客)以及在 SGX 安全区之外运行时,缓解措施保持启用状态非常重要。
硬件强制执行 SGX 的缓解措施。同样,VMM (虚拟机监视器) 应确保不允许访客禁用 GDS 缓解措施。如果主机出错并允许这样做,访客理论上可以禁用 GDS 缓解措施,发起攻击,然后再重新启用它。
缓解机制¶
此问题已通过微码得到缓解。微码定义了以下新位:
IA32_ARCH_CAPABILITIES[GDS_CTRL]
只读
枚举 GDS 漏洞和缓解支持。
IA32_ARCH_CAPABILITIES[GDS_NO]
只读
处理器不受漏洞影响。
IA32_MCU_OPT_CTRL[GDS_MITG_DIS]
读/写
默认禁用缓解(默认为 0)。
IA32_MCU_OPT_CTRL[GDS_MITG_LOCK]
读/写
锁定 GDS_MITG_DIS=0。对 GDS_MITG_DIS 的写入将被忽略。一旦设置,无法清除。
在没有更新微码的系统上,也可以通过禁用 AVX 来缓解 GDS。这可以通过在内核命令行上设置 `gather_data_sampling="force"` 或 `clearcpuid=avx` 来完成。
如果使用,这些选项将通过关闭 XSAVE YMM 支持来禁用 AVX 的使用。然而,处理器仍将枚举 AVX 支持。不遵循正确 AVX 枚举(即同时检查 AVX *和* XSAVE YMM 支持)的用户空间程序将会中断。
内核命令行上的缓解控制¶
可以在内核命令行上设置 `gather_data_sampling=off` 或 `mitigations=off` 来禁用缓解措施。不指定任何一个选项将默认启用缓解措施。指定 `gather_data_sampling=force` 将在可用时使用微码缓解措施,或者在微码未更新以包含缓解措施的受影响系统上禁用 AVX。
GDS 系统信息¶
内核通过 sysfs 提供漏洞状态信息。对于 GDS,可以通过以下 sysfs 文件访问:
/sys/devices/system/cpu/vulnerabilities/gather_data_sampling
此文件中可能包含的值有:
不受影响
处理器不受漏洞影响。
易受攻击
处理器易受攻击且缓解措施已禁用。
易受攻击:无微码
处理器易受攻击且微码缺少缓解措施。
缓解措施:AVX 已禁用,
无微码
处理器易受攻击且微码缺少缓解措施。AVX 已作为缓解措施禁用。
缓解措施:微码
处理器易受攻击且缓解措施正在生效。
缓解措施:微码(已锁定)
处理器易受攻击且缓解措施正在生效且无法禁用。
未知:取决于
虚拟机监控器状态
运行在受影响的虚拟访客处理器上,但无法得知主机处理器是否已缓解或易受攻击。
GDS 默认缓解措施¶
更新后的微码将默认启用缓解措施。内核的默认操作是保持缓解措施启用。