Retbleed 是针对 Intel 和 AMD CPU 推测执行机制的新攻击

苏黎世联邦理工学院的一组研究人员发现了一种针对 CPU 中间接转换的推测执行机制的新攻击,该攻击使得从内核内存中提取信息或从虚拟机组织对主机系统的攻击成为可能。 这些漏洞的代号为 Retbleed(CVE-2022-29900、CVE-2022-29901),本质上与 Spectre-v2 攻击非常接近。 区别在于处理“ret”(返回)指令时对任意代码的推测执行的组织,该指令从堆栈中获取要跳转的地址,而不是使用“jmp”指令进行间接跳转,从堆栈中加载地址存储器或CPU寄存器。

攻击者可以为不正确的转换预测创建条件,并组织有针对性的推测性转换到程序执行逻辑未提供的代码块。 最终,处理器将确定分支预测不合理,并将操作回滚到其原始状态,但推测执行期间处理的数据最终将出现在高速缓存和微架构缓冲区中。 如果错误执行的块访问内存,则其推测执行将导致从内存读取的数据存放在共享缓存中。

为了确定推测操作后缓存中剩余的数据,攻击者可以使用旁路技术来确定残留数据,例如分析缓存和未缓存数据的访问时间的变化。 为了有目的地从另一个特权级别的区域(例如,从内核内存)提取信息,使用了“gadget”——内核中存在的命令序列,适合根据可能受以下因素影响的外部条件从内存中推测性地读取数据:攻击者。

为了防止使用条件和间接跳转指令的经典 Spectre 类攻击,大多数操作系统使用“retpoline”技术,该技术基于用“ret”指令替换间接跳转操作,对此处理器使用单独的堆栈状态预测单元.不使用分支预测块。 当 retpoline 在 2018 年推出时,人们认为类似 Spectre 的地址操作对于使用“ret”指令的推测分支来说并不实用。

开发 Retbleed 攻击方法的研究人员证明了使用“ret”指令创建微架构条件来启动推测转换的可能性,并发布了现成的工具来识别适合利用 Linux 内核中的漏洞的指令序列(小工具),这些条件在其中表现出来。

在研究过程中,我们准备了一个有效的漏洞利用程序,允许在具有 Intel CPU 的系统上以每秒 219 字节的速度和 98% 的准确度从用户空间中的非特权进程的内核内存中提取任意数据。 在 AMD 处理器上,该漏洞利用的效率要高得多,泄漏率为每秒 3.9 KB。 作为一个实际示例,我们展示了如何使用建议的漏洞来确定 /etc/shadow 文件的内容。 在采用 Intel CPU 的系统上,确定 root 用户密码哈希值的攻击在 28 分钟内完成,而在采用 AMD CPU 的系统上则需要 6 分钟。

6 年第三季度之前发布的第 8-3 代英特尔处理器(包括 Skylake)以及 2019 年第二季度之前发布的基于 Zen 1、Zen 1+ 和 Zen 2 微架构的 AMD 处理器已确认受到攻击。 在 AMD Zen2021 和 Intel Alder Lake 等较新的处理器型号以及 ARM 处理器中,现有的保护机制可以阻止该问题。 例如,使用 IBRS(间接分支限制推测)指令有助于防止攻击。

已经针对 Linux 内核和 Xen 虚拟机管理程序准备了一系列更改,这将阻止旧 CPU 上的软件问题。 拟议的 Linux 内核补丁更改了 68 个文件,添加了 1783 行,删除了 387 行。 不幸的是,这种保护会导致巨大的开销成本 - 在 AMD 和 Intel 处理器上进行的测试中,性能估计下降了 14% 到 39%。 更可取的是使用基于 IBRS 指令的保护,该指令在新一代 Intel CPU 中可用,并从 Linux 内核 4.19 开始支持。

在 Intel 处理器上,由于返回堆栈缓冲区中的下限(下溢)发生溢出时出现的一项功能,可以执行推测性间接跳转的地址替换。 当这种情况发生时,“ret”指令开始应用类似于正常间接跳转所使用的地址选择逻辑。 Linux 内核中有一千多个地方为启动这种回流创造了条件,并且可以通过系统调用访问。

在 AMD 处理器上,“ret”指令的推测执行是在不参考堆栈特定缓冲区(返回地址堆栈)的情况下执行的,并且分支预测单元不会将“ret”指令视为控制返回,而是将其视为间接分支,并相应地使用该数据来预测间接转换。 在这些条件下,几乎任何可通过系统调用实现的“ret”操作都可以被利用。

此外,AMD CPU 中还发现了与虚拟分支的实现相关的另一个问题(CVE-2022-23825,分支类型混乱)——即使没有必要的分支指令,分支预测的条件也可能发生,从而影响分支预测缓冲区没有指令“ret”。 此功能使保护的实现显着复杂化,并且需要更主动地清理分支预测缓冲区。 为内核添加全面保护预计会使开销增加 209%。

来源: opennet.ru

添加评论