在 Azure 中防御推理执行旁道漏洞的指南

注意

本文引用了 CentOS,这是一个处于生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。

本文提供的指导适用于新的一类硅基微体系结构和推理执行旁道漏洞,它们影响许多新式处理器和操作系统。 其中包括 Intel、AMD 和 ARM。 有关这些硅基漏洞的具体详细信息,可参阅以下安全公告和 CVE:

发现这些 CPU 漏洞后,想要了解其详情的客户向我们提出了多个问题。

Azure 已在我们的所有云服务中部署了缓解措施。 运行 Azure 并将客户工作负荷相互隔离的基础结构是受保护的。 这意味着使用同一基础结构的潜在攻击者无法使用这些漏洞攻击你的应用程序。

Azure 尽可能使用内存保留维护,这样可以尽量降低对客户的影响并且不需要重启。 Azure 会在对主机进行系统级更新时继续利用这些方法,对客户进行保护。

若要详细了解如何将安全性集成到 Azure 的各个方面,请访问 Azure 安全文档站点。

注意

自本文档首次发布以来,已发现此漏洞类型的多个变体。 Azure 会继续不遗余力地为客户提供保护和指导。 我们会继续发布更多的修复程序,同时也会更新此页面。

正在 VM 中运行不受信任的代码的客户需要通过阅读下面的信息来了解有关所有漏洞的更多指南,从而采取措施来免受这些漏洞的影响。

其他客户应从“深度防御”角度评估这些漏洞,并考虑其所选配置的安全性和性能影响。

使操作系统保持最新

虽然无需 OS 更新即可将你在 Azure 上运行的应用程序与其他 Azure 客户隔离,但使软件保持最新始终是最佳做法。 Windows 最新安全更新中包含了针对这些漏洞的缓解措施。 类似地,Linux 发行版发布了多个修补这些漏洞的更新。 建议执行下面的操作来更新操作系统:

产品/服务 建议的操作
Azure 云服务 启用自动更新,或确保运行最新的来宾 OS。
Azure Linux 虚拟机 安装操作系统提供商的更新。 有关详细信息,请查看本文档后面部分的 Linux
Azure Windows 虚拟机 安装最新的安全汇总。
其他 Azure PaaS 服务 使用这些服务的客户不需要执行任何操作。 Azure 会自动使你的操作系统版本保持最新。

附加指南(如果运行的是不受信任的代码)

那些允许不受信任的用户执行任意代码的客户可能会希望在其 Azure 虚拟机或云服务中实施一些额外的安全功能。 这些功能可防范多个推理执行漏洞所描述的进程内泄露矢量。

建议实施额外安全功能的示例方案:

  • 允许不信任的代码在 VM 中运行。
    • 例如,允许某一客户上传你随后要在应用程序内执行的二进制文件或脚本。
  • 允许不信任的用户使用权限低的帐户登录到 VM。
    • 例如,允许权限低的用户使用远程桌面或 SSH 登录到某个 VM。
  • 允许不受信任的用户访问通过嵌套虚拟化实现的虚拟机。
    • 例如,你控制 Hyper-V 主机,但却将 VM 分配给不受信任的用户。

所实施方案不涉及不受信任代码的客户不需启用这些额外安全功能。

启用额外安全性

如果运行的是不受信任的代码,可以在 VM 或云服务中启用更多的安全功能。 与此同时,请确保操作系统是最新版本,以便可以在 VM 或云服务内启用安全功能

Windows

目标操作系统必须为最新才能启用这些额外安全功能。 虽然许多缓解措施是默认启用的,但此处所述的额外功能必须手动启用,并且可能会造成性能影响。

选项 1

步骤 1:按照 KB4072698 中的说明,验证是否已使用 SpeculationControl PowerShell 模块启用保护。

注意

如果以前下载过此模块,则需安装最新版本。

若要验证针对这些漏洞启用的保护,请参阅了解 Get-SpeculationControlSettings PowerShell 脚本输出

如果未启用保护,请联系 Azure 支持部门,以对你的 Azure VM 启用额外的控制。

步骤 2:若要启用内核虚拟地址隐藏 (KVAS) 和分支目标注入 (BTI) OS 支持,请按照 KB4072698 中的说明,使用 Session Manager 注册表项启用保护。 必须重启。

步骤 3:对于使用嵌套虚拟化的部署(仅 D3 和 E3):这些说明在用作 Hyper-V 主机的 VM 中应用。

  1. 按照 KB4072698 中的说明,使用 MinVmVersionForCpuBasedMitigations 注册表项启用保护。
  2. 可以按照此处的说明将虚拟机监控程序计划程序类型设置为 Core

方法 2

在 VM 上禁用超线程功能 - 在超线程 VM 上运行不受信任的代码的客户可能会选择禁用超线程功能或转换到非超线程的 VM 大小。 有关超线程 VM 大小(其中 vCPU 与核心的比率为 2:1)的列表,请参阅此文档。 若要从 VM 中使用 Windows 命令行检查 VM 是否启用了超线程功能,请参考下面的脚本。

键入 wmic 以进入交互式界面。 然后键入以下命令来查看 VM 上的物理和逻辑处理器数量。

CPU Get NumberOfCores,NumberOfLogicalProcessors /Format:List

如果逻辑处理器数量大于物理处理器(核心)数量,则超线程功能已启用。 如果运行的是超线程 VM,请联系 Azure 支持部门以禁用超线程功能。 在超线程功能已禁用后,支持人员将要求完全重启 VM。 请参阅核心计数以了解 VM 核心计数减少的原因。

选项 3

对于 CVE-2022-23816CVE-2022-21123(AMD CPU 分支类型混淆),请同时遵循上述的“选项 1”和“选项 2”。

Linux

在其中启用额外安全功能集要求目标操作系统已彻底更新。 某些缓解措施会默认启用。 以下部分介绍的功能是默认关闭的,以及/或者是依赖于硬件支持(微代码)的。 启用这些功能可能造成性能影响。 如需进一步的说明,请参阅操作系统提供商的文档

步骤 1:在 VM 上禁用超线程功能 - 在超线程 VM 上运行不受信任的代码的客户将需要禁用超线程功能或转换到非超线程VM。 有关超线程 VM 大小(其中 vCPU 与核心的比率为 2:1)的列表,请参阅此文档。 若要检查是否正在运行超线程 VM,请在 Linux VM 中运行 lscpu 命令。

如果 Thread(s) per core = 2,则已启用超线程功能。

如果 Thread(s) per core = 1,则已禁用超线程功能。

启用了超线程功能的 VM 的输出示例:

CPU Architecture:      x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1

如果运行的是超线程 VM,请联系 Azure 支持部门以禁用超线程功能。 在超线程功能已禁用后,支持人员将要求完全重启 VM。 请参阅核心计数以了解 VM 核心计数减少的原因。

步骤 2:要缓解下面的任何基于 CPU 的内存漏洞,请参阅操作系统提供商的文档:

核心计数

创建超线程 VM 时,Azure 会为每个核心分配 2 个线程,这些线程称为 vCPU。 禁用超线程功能时,Azure 会删除一个线程并向上显示单线程核心(物理核心)。 vCPU 与 CPU 的比率为 2:1,因此禁用超线程功能后,VM 中的 CPU 计数将似乎减少了一半。 例如,D8_v3 VM 是在 8 个 vCPU(每个核心 2 个线程 x 4 个核心)上运行的超线程 VM。 禁用超线程功能后,CPU 将减至 4 个物理核心(每个核心 1 个线程)。

后续步骤

若要详细了解如何将安全性集成到 Azure 的各个方面,请参阅 Azure 安全文档