其他分享
首页 > 其他分享> > ZombieLoad,熔断类漏洞浅析

ZombieLoad,熔断类漏洞浅析

作者:互联网

浅析ZombieLoad攻击原理

ZombieLoad简介

(参见论文:ZombieLoad: Cross-Privilege-Boundary Data Sampling)
       这是一种新的、极其强大的熔断型攻击,目标是填充/加载缓冲区逻辑(Load Buffer)。且本文证明了该攻击不会触发体系结构异常,例如页面错误。
       ZombieLoad还不仅限于本机代码执行,还可以跨虚拟化边界工作。因此,虚拟机不仅可以攻击虚拟机监控程序,还可以攻击在同级逻辑核心上运行的不同虚拟机。
       ZombieLoad是第一个也是唯一一个即使在最新的Intel Cascade Lake CPU上也会泄漏数据的攻击变体,据报道,这类CPU可以防御所有已知的Meltdown、Fallout和MDS变体。
       相关CVE:CVE-2019-11091、CVE-2018-12130、CVE-2019-11135。

背景

       在2018年初,Meltdown首次展示了如何利用瞬态指令的副作用从用户空间读取任意内核内存。这种攻击虽然可以通过加强用户和内核空间之间的隔离从而得到缓解,但Meltdown引发了一类全新的故障驱动瞬态执行攻击。研究人员证明了熔断型攻击不仅会将内核数据泄漏到用户空间,还会跨用户进程、虚拟机和SGX飞地泄漏数据。此外,泄漏不仅限于一级缓存,还可以源自其他微体系结构结构,例如寄存器文件,以及如并行工作中所示的填充缓冲区、加载端口和存储缓冲区。
       本文提出了僵尸负载(ZombieLoad)攻击,它揭示了处理器填充缓冲区逻辑中的一种新的熔断类型效应。它是一种极其强大的攻击方法,本文提出:除了在上下文切换期间刷新多个微体系结构状态外,可能只有彻底禁用超线程,才是唯一的防御方法。

ZombieLoad简介

       这是一种新的、极其强大的熔断型攻击,目标是填充缓冲区逻辑。且本文证明了该攻击不会触发体系结构异常,例如页面错误等。
       ZombieLoad还不仅限于本机代码执行,还可以跨虚拟化边界工作。因此,虚拟机不仅可以攻击虚拟机监控程序,还可以攻击在同级逻辑核心上运行的不同虚拟机。
       ZombieLoad是第一个也是唯一一个即使在最新的Intel Cascade Lake CPU上也会泄漏数据的攻击变体,据报道,这类CPU可以防御所有已知的Meltdown、Fallout和MDS变体。
       相关CVE:CVE-2019-11091、CVE-2018-12130、CVE-2019-11135。

什么是瞬态执行攻击?

       虽然瞬态指令的结果和产生的体系结构效应会被丢弃,但可测量的微体系结构副作用可能仍然存在,并且不会恢复。利用这些副作用观察敏感信息的攻击称为瞬态执行攻击。(本文定义)
       由于异常延迟处理和推测错误而执行的指令结果虽然在架构级别上未显示,但仍可能在处理器微架构状态中留下痕迹.通过隐蔽信道可将微架构状态的变化传输到架构层,进而恢复出秘密数据,这种攻击方式称为瞬态执行攻击。(微架构瞬态执行攻击与防御方法[J].软件学报,2020)

漏洞原理(推测)

       ZombieLoad是一种瞬态执行攻击,它观察内存的值,并存储在当前的cpu内核上。具体而言:ZombieLoad利用的是加载缓冲区(load buffer),即当多个逻辑cpu核映射到同一物理cpu核时,加载缓冲区会被不同进程/权限同时共享。此时,若cpu进行内存存取时,首先将取出来的值放在加载缓冲区中。然而加载操作时需要微码进行辅助进行的,在复杂的微体系结构的情况之下(例如发生故障等),加载的可能是已经过时的值,虽然该操作后续可能会被发现并且撤回,但此时却产生了瞬态执行窗口,攻击者可以将泄露的值编码到微体系结构元素中(例如缓存中),进而造成了信息泄露。虽然这种攻击无法根据攻击者指定的地址选择要泄露的值,但是却为基于数据采样的瞬态执行攻击开辟了一个新的领域,例如:与以前的熔断型攻击比较,ZombieLoad不会局限于特定的权限边界。尤其是将ZombieLoad和现有的侧信道技术结合的攻击是非常强大的。

漏洞根本原因?

       关于ZombieLoad信息泄露的根本原因,本文假设了一种情况可以自圆其说:由于每次load都与加载缓冲区中的一个条目相关联,然而当遇到一些复杂情况时(如故障处理等),就会刷新流水线上的后续指令,但是在此之前已经运行的指令仍然会完成执行。此时这种情况,为了避免更多额外的延迟,系统可能只要求部分物理地址匹配即可(否则可能会加大后续的指令堵塞),即填充缓冲区条目会换一种优化方式来匹配对应条目。此时,可能会导致填充缓冲区条目匹配错误。这类似于硬件中的释放后使用漏洞。因此,load指令从以前的加载或存储中加载到了有效的数据。
       由于关于加载缓冲区的官方文档很少,所以本文未指出此信息泄露的根本原因是什么,实际上,截止于投稿之时,作者自己也不确定根本原因究竟是什么。、

ARM Cortex-A57内核架构图
 ARM Cortex-A57内核架构图
在这里插入图片描述

github实现截图(https://github.com/IAIK/ZombieLoad


       
令逻辑核(7)不断地存储“X”(QUME)
在这里插入图片描述

普通用户可监听(信息泄露)
在这里插入图片描述

解决办法

       由于这种跨逻辑核的泄露加载和存储的值,最简单有效的措施就是完全禁用超线程,但是会对性能产生30%-40%的影响。因此,本文另外提出了一些可能可行的理论方法。
方法一:共同调度
       当前的协同调度算法不涉及防止内核与用户空间代码并发执行,这种算法只能防止用户进程之间的泄露,但无法防止内核和用户空间之间的泄露。所以内核还必须确保一个逻辑核上的内核条目也强制只有同级逻辑核才能进入内核,以此避免内核核用户空间之间的泄露。
方法二:禁用
       禁用SGX、TSX、以及不需要运行虚拟机的系统上禁用VT-x。
方法三:指令过滤。
       对于单个进程内部的攻击(如JavaScript沙盒),防止生成和执行CLFLUSH指令。以此来避免使用过时的或以及驱逐出去的值。

总结

       ZombieLoad是一种针对处理器填充缓冲区逻辑的新型熔断型攻击。它能够泄露当前或同级逻辑cpu最近加载的值。并且还可以在抗MDS和抗熔断处理器上工作。最后,作者得出结论,为了完全消除该漏洞,完全禁用超线程是非常必要的。

标签:ZombieLoad,瞬态,攻击,熔断,内核,缓冲区,浅析,加载
来源: https://blog.csdn.net/qq_43132184/article/details/120666297