iTLB 多重命中¶
iTLB 多重命中是一种勘误,其中当指令提取命中指令 TLB 中的多个条目时,某些处理器可能会发生机器检查错误,可能导致无法恢复的 CPU 锁定。当页面大小与物理地址或缓存类型一起更改时,可能会发生这种情况。在虚拟化系统上运行的恶意访客可以利用此勘误来执行拒绝服务攻击。
受影响的处理器¶
此勘误的变体存在于大多数 Intel Core 和 Xeon 处理器型号上。此勘误不存在于
非 Intel 处理器上
某些 Atom (Airmont, Bonnell, Goldmont, GoldmontPlus, Saltwell, Silvermont)
在 IA32_ARCH_CAPABILITIES MSR 中设置了 PSCHANGE_MC_NO 位的 Intel 处理器上。
问题¶
特权软件,包括操作系统和虚拟机管理器 (VMM),负责内存管理。内存管理中的一个关键组件是页表的控制。现代处理器使用虚拟内存,这是一种为处理器创建非常大内存的幻觉的技术。这个虚拟空间被分成给定大小的页面。页表将虚拟地址转换为物理地址。
为了减少执行虚拟到物理地址转换时的延迟,处理器包含一个称为 TLB 的结构,该结构缓存最近的转换。指令 (iTLB) 和数据 (dTLB) 有单独的 TLB。
在此勘误下,指令是从使用 iTLB 中缓存的 4 KB 转换的线性地址中提取的。特权软件修改分页结构,以便使用大页面大小(2 MB、4 MB、1 GB)和不同的物理地址或内存类型来使用相同的线性地址。在页面结构修改之后但在软件使线性地址的任何 iTLB 条目失效之前,在同一线性地址上发生的代码提取可能会导致机器检查错误,这可能会导致系统挂起或关闭。
攻击场景¶
可以从虚拟化系统中的恶意访客发起针对 iTLB 多重命中勘误的攻击。
iTLB 多重命中系统信息¶
Linux 内核提供了一个 sysfs 接口来枚举系统的当前 iTLB 多重命中状态:系统是否易受攻击以及哪些缓解措施处于活动状态。相关的 sysfs 文件是
/sys/devices/system/cpu/vulnerabilities/itlb_multihit
此文件中的可能值是
不受影响 |
处理器不易受攻击。 |
KVM:缓解:拆分大页面 |
软件更改可以缓解此问题。 |
KVM:缓解:VMX 不受支持 |
KVM 不易受攻击,因为不支持虚拟机扩展 (VMX)。 |
KVM:缓解:VMX 已禁用 |
KVM 不易受攻击,因为虚拟机扩展 (VMX) 已禁用。 |
KVM:易受攻击 |
处理器易受攻击,但未启用任何缓解措施 |
勘误的枚举¶
在 IA32_ARCH_CAPABILITIES (PSCHANGE_MC_NO) msr 中分配了一个新位,并且将在已针对此问题进行缓解的 CPU 上设置此位。
IA32_ARCH_CAPABILITIES MSR
不存在
可能易受攻击,检查型号
IA32_ARCH_CAPABILITIES[PSCHANGE_MC_NO]
“0”
可能易受攻击,检查型号
IA32_ARCH_CAPABILITIES[PSCHANGE_MC_NO]
“1”
不易受攻击
缓解机制¶
可以通过限制大页面大小的使用为不可执行页面来缓解此勘误。这将强制所有 iTLB 条目为 4K,并消除多次命中的可能性。
为了缓解漏洞,KVM 最初将所有大页面标记为不可执行。如果访客尝试在其中一个页面中执行,则该页面将分解为 4K 页面,然后将这些页面标记为可执行。
如果 EPT 已禁用或在主机上不可用,则 KVM 可以控制 TLB 刷新,并且不会发生问题情况。但是,嵌套虚拟化使用的影子 EPT 分页机制是易受攻击的,因为嵌套访客可以通过修改其自己的(非嵌套)页表来触发多次 iTLB 命中。为简单起见,KVM 将在所有影子分页模式下使大页面不可执行。
内核命令行和 KVM 上的缓解控制 - 模块参数¶
用于将大页面标记为不可执行的 KVM 管理程序缓解机制可以使用模块参数 “nx_huge_pages=” 来控制。内核命令行允许在启动时使用选项 “kvm.nx_huge_pages=” 来控制 iTLB 多重命中缓解措施。
这些选项的有效参数为
强制
启用缓解。在这种情况下,缓解措施在 Linux 内核 KVM 模块中实现不可执行的大页面。EPT 中的所有大页面都标记为不可执行。如果访客尝试在其中一个页面中执行,则该页面将分解为 4K 页面,然后将这些页面标记为可执行。
关闭
禁用缓解。
自动
仅当平台受到影响并且内核未通过 “mitigations=off” 命令行参数启动时,才启用缓解。这是默认选项。
缓解选择指南¶
1. 未使用虚拟化¶
系统受到内核的无条件保护,无需进一步操作。
2. 使用受信任访客的虚拟化¶
如果访客来自受信任的来源,则您可以假设访客不会试图恶意利用这些勘误,并且无需进一步操作。
3. 使用不受信任访客的虚拟化¶
如果访客来自不受信任的来源,则访客主机内核将需要通过内核命令行或 kvm 模块参数应用 iTLB 多重命中缓解措施。