间接目标选择 (ITS)

ITS 是某些支持增强型 IBRS 且在 Alder Lake 之前发布的 Intel CPU 中的一个漏洞。ITS 可能允许攻击者控制位于缓存行下半部分的间接分支和 RET 的预测。

ITS 被分配了 CVE-2024-28956,CVSS 评分为 4.7 (中等)。

影响范围

  • eIBRS 客户机/宿主机隔离:KVM/内核中的间接分支仍可能被预测为与客户机中分支对应的非预期目标。

  • 模式内 BTI:内核内训练,例如通过 cBPF 或其他原生小工具。

  • 间接分支预测屏障 (IBPB):在 IBPB 之后,间接分支仍可能被预测为与 IBPB 之前执行的直接分支对应的目标。这通过 IPU 2025.1 微代码修复,该微代码应可通过发行版更新获取。另外,微代码可从 Intel 的 GitHub 仓库获取 [1]

受影响的 CPU

以下是受 ITS 影响的 CPU 列表 [2] [3]

通用名称

家族_型号

eIBRS 客户机/宿主机隔离

模式内 BTI

SKYLAKE_X (步进 >= 6)

06_55H

受影响

受影响

ICELAKE_X

06_6AH

不受影响

受影响

ICELAKE_D

06_6CH

不受影响

受影响

ICELAKE_L

06_7EH

不受影响

受影响

TIGERLAKE_L

06_8CH

不受影响

受影响

TIGERLAKE

06_8DH

不受影响

受影响

KABYLAKE_L (步进 >= 12)

06_8EH

受影响

受影响

KABYLAKE (步进 >= 13)

06_9EH

受影响

受影响

COMETLAKE

06_A5H

受影响

受影响

COMETLAKE_L

06_A6H

受影响

受影响

ROCKETLAKE

06_A7H

不受影响

受影响

  • 所有受影响的 CPU 都枚举了增强型 IBRS 功能。

  • IBPB 隔离在所有受 ITS 影响的 CPU 上都受影响,需要微代码更新进行缓解。

  • 所有受影响的 CPU 都未枚举 BHI_CTRL,该功能在 Golden Cove(Alder Lake 和 Sapphire Rapids)中引入。这有助于客户机确定宿主机的受影响状态。

  • Intel Atom CPU 不受 ITS 影响。

缓解措施

由于只有指令的最后一个字节位于缓存行下半部分的间接分支和 RET 容易受到 ITS 的攻击,因此缓解措施的基本思想是不允许间接分支出现在缓存行的下半部分。

这通过依赖内核和编译器中现有的 retpoline 支持来实现。易受 ITS 攻击的 retpoline 站点在运行时被打上补丁,指向新添加的 ITS 安全的 thunks。这些安全 thunks 包含位于缓存行下半部分的间接分支。并非所有 retpoline 站点都被打上补丁为 thunks,如果 retpoline 站点被评估为 ITS 安全,它将被替换为内联间接分支。

动态 thunks

从一个动态分配的安全 thunks 池中,每个易受攻击的站点都被一个新 thunk 替换,以便它们获得唯一的地址。这可以提高分支预测的准确性。此外,它也是一种针对别名的深度防御措施。

请注意,为简化起见,eBPF 程序中的间接分支始终被替换为跳转到 __x86_indirect_its_thunk_array 中的静态 thunk。如果需要,将来可以更改为使用动态 thunks。

所有易受攻击的 RET 都被替换为静态 thunk,它们不使用动态 thunks。这是因为 RET 的预测主要来自 RSB,不依赖于源地址。RSB 下溢的 RET 可能会从动态 thunks 中受益。但是,RET 数量显著多于间接分支,并且唯一源地址带来的任何好处都可能被增加的 icache 占用和 iTLB 压力所抵消。

Retpoline

Retpoline 序列也缓解了 ITS 不安全的间接分支。因此,当启用 retpoline 时,ITS 缓解措施只将 RET 重新定位到安全 thunks。除非用户请求 RSB 填充缓解。

RSB 填充

通过调用深度跟踪进行 RSB 填充是 Retbleed RSB 下溢攻击的一种缓解措施。它也缓解了易受 ITS 攻击的 RET。

客户机中的缓解措施

所有客户机默认部署 ITS 缓解措施,无论客户机的 eIBRS 枚举和家族/型号如何。这是因为 eIBRS 功能可能对客户机隐藏。唯一的例外是当客户机枚举 BHI_DIS_S 时,这表示客户机正在不受影响的宿主机上运行。

为防止客户机在不受影响的平台上不必要地部署缓解措施,Intel 在 MSR IA32_ARCH_CAPABILITIES 中定义了 ITS_NO 位 (62)。当客户机看到此位被设置时,它不应枚举 ITS 错误。请注意,此位不由任何硬件设置,但旨在供 VMM 根据宿主机的受影响状态进行合成以供客户机使用。

缓解选项

ITS 缓解措施可以通过“indirect_target_selection”内核参数控制。可用选项有:

on

(默认) 部署“对齐分支/返回 thunks”缓解措施。如果 spectre_v2 缓解措施启用 retpoline,对齐 thunks 仅针对受影响的 RET 指令部署。Retpoline 缓解间接分支。

off

禁用 ITS 缓解措施。

vmexit

如果 CPU 受 ITS 客户机/宿主机隔离部分影响,则等同于“=on”。否则,不部署缓解措施。此选项在宿主机用户空间不在威胁模型中,且仅考虑从客户机到宿主机的攻击时很有用。

stuff

当 retpoline 也部署时,部署 RSB 填充缓解措施。否则,部署默认缓解措施。当启用 retpoline 缓解措施时,通过调用深度跟踪进行的 RSB 填充也缓解 ITS。

force

强制 ITS 错误并部署默认缓解措施。

Sysfs 报告

显示 ITS 缓解状态的 sysfs 文件是

/sys/devices/system/cpu/vulnerabilities/indirect_target_selection

请注意,此文件中不报告微代码缓解状态。

此文件中的可能值是:

不受影响

处理器不受漏洞影响。

易受攻击

系统易受攻击,未应用缓解措施。

易受攻击,KVM:不受影响

系统易受模式内 BTI 攻击,但不受 eIBRS 客户机/宿主机隔离影响。

缓解措施:对齐分支/返回 thunks

已启用缓解措施,受影响的间接分支和 RET 被重新定位到安全 thunks。

缓解措施:Retpolines,填充 RSB

已使用 retpoline 和 RSB 填充启用缓解措施。

参考文献