GDS - 收集数据采样¶
收集数据采样是一种硬件漏洞,它允许非特权用户推测性地访问以前存储在向量寄存器中的数据。
问题¶
当收集指令从内存执行加载时,不同的数据元素会合并到目标向量寄存器中。但是,当瞬时执行的收集指令遇到错误时,来自架构或内部向量寄存器的陈旧数据可能会瞬时转发到目标向量寄存器。这将允许恶意攻击者使用典型的侧信道技术(如缓存定时攻击)推断陈旧数据。GDS 是一种纯粹基于采样的攻击。
攻击者使用收集指令来推断陈旧的向量寄存器数据。受害者不需要做任何特别的事情,只需要使用向量寄存器即可。受害者不需要使用收集指令来变得容易受到攻击。
由于缓冲区在超线程之间共享,因此可以进行跨超线程攻击。
攻击场景¶
在没有缓解措施的情况下,GDS 几乎可以推断所有权限边界的陈旧数据
非 enclave 可以推断 SGX enclave 数据 用户空间可以推断内核数据 访客可以推断主机的数据 访客可以从其他访客推断访客的数据 用户可以从其他用户推断数据
因此,确保在较低特权上下文(如访客)和在 SGX enclave 外部运行时保持缓解措施启用非常重要。
硬件强制执行 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 默认缓解措施¶
更新后的微代码将默认启用缓解措施。内核的默认操作是保持缓解措施启用。