走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现

2024-08-23 03:52

本文主要是介绍走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现

  • 技术分享

技术分享

起初,为了学习虚拟机逃逸相关技术,也为了搞懂硬件虚拟化。于是请教了某巨佬后告诉我一本书,看完之后为了验证我理解到的硬件虚拟化及虚拟化逃逸原理是否正确,于是便有了此次实验,继而有了本文。
在看完书后,网上看到了HITB 2023大会上的一个虚拟机逃逸的议题,名字是:“Escaping From VMware Workstation Through The Disk Controller - Wenxu Yin”,有兴趣的可以自行搜索。看完视频后就觉得这个漏洞值得一试,理由是:
1 从视频内容上看,这个漏洞相当得简单直接,用来学习虚拟机逃逸是个绝佳得案例
2 视频内容可以看出,这个漏洞相当稳定好用,毕竟现场演示用的是真机实际环境直接演示,连个视频都不录,所以肯定是个稳定好用的漏洞。
基于这两条信息,就想要复现一下这个漏洞,于是有了下面的事情。
我看书学到的就是,虚拟机逃逸的本质其实就是,虚拟机软件(vmware)对non-root模式下CPU发出的IO指令的接管和处理,也就是none-root模式下发出的IO中断请求,通过VMCB结构中的信息退出到root模式来管理,而接管了guest发出的IO请求后,hypervisor(虚拟机软件)通过VMCB拿到并处理这个请求,而虚拟机软件逃逸漏洞,其实就是发生在这个处理请求时,虚拟机软件中的BUG导致。此为漏洞原理本质。
按照视频中的配置安装vmware和guest操作系统,宿主机就直接用我日常用的电脑,卸载了最新版的vmware,然后搜索到17.0.0-20800274版的vmware安装,guest操作系统使用ubuntu 22.04。
首先,我们来到视频中所说的检查函数:
在这里插入图片描述

代码一目了然,CDB_Info就是第三个参数a3,这个结构
偏移0x30的地方就是传进来的_MSG_SCSI_IO_REQUEST的
CDB数据,只有0x10大小,偏移0x28处就是CDBlength,
是一个byte,而在随后的33行,根据CDB数据的第一个字节
右移5位作为下标,数组就是1409D9238处,数组各元素为
可用的CDB长度,这个就不截图了,视频中有。其中第4个元素
(下标3)为0x40,我们只要将CDB数据第一个字节(OPcode)设置为 3<<5 = 0x60即可。接下来代码进行了一个判断,判断传递进来的_MSG_SCSI_IO_REQUEST结构中的CDBlength是否和通过
数组中下标元素得到的长度相等。首先CDB数据整个
有16个byte,根据相关CDB文档,只要是16个字节以内,
则不会产生越界溢出,故我们需要将CDBlength设置为0x40 or 0x41,如何做到这一点?此为问题1,且先按下不表。
回头看视频中,我们看到调用溢出函数的上层返
回地址为14072CC67,对应调用:

在这里插入图片描述

其中第21行的间接调用导致进入了目标函数,而在call前的第16行
中,判断了a1 + 8的指针偏移0x18的地方是否为空,不为空后续
则调用这个地方的函数地址。而实际调试时:

在这里插入图片描述

可看到偏移0x18的地方根本就是0,根本就不可能进入目标函数。根据上图第16行的间接可知,必然有一条路径是把目标函数放到
偏移0x18的地方的,并且a1+8的地方很可能是个函数表之类的结
构,于是查看目标函数的交叉引用:

在这里插入图片描述

其中0x140BC4D38处的引用有一次对该结构的引用:

在这里插入图片描述

继续引用之,来到sub_14080DDD0函数:

在这里插入图片描述

看来是在这里会根据前面的各种情况对a1+8赋予各种不同的函数
表指针,所以我们的工作就是让流程走到这个函数,于是交叉引
用之,来到函数sub_14072D170:

在这里插入图片描述

在这里就很明白了,sub_14072D170会根据第二个参数来决定
a1使用哪张函数表。调用sub_14072D170的有两处,不废话只
说有用的一处(另一处一看就没用),来到上层:

在这里插入图片描述

这就很有意思了,这第二个参数取决于v16(结构),
而v16的唯一赋值/使用是在26行,看来应该是16行的
sub_1400F07C0根据a1+a8的数据对v16进行了设置,我无心去看
这个sub_1400F07C0内部到底怎么设置v16的,因为看到了第32行
的那串英文,很明显那是个输出调试信息的,其中就有第二个参数,
对应的输出是“type=x”,意味着v12是类型,所以这里是
根据CDROM的类型来选择不同的处理方式?于是:

在这里插入图片描述

虽然我有十足信心这里是CD的类型,但总要实践来证明。可大事
不妙,我没有物理光驱:

在这里插入图片描述

随后测试在这里下断后,手工更改sub_14072D170函数调用时第二
个参数的值:

在这里插入图片描述

失败!看来此type值还会影响其他后续操作。但是,这个失败至少
证明了一点:我们更改这第二个参数type,真的应更改了CDROM的类
型,即CDROM的类型就可以决定这第二个参数type。于是:

在这里插入图片描述

金钱的力量就是好使(虽然才48块)!接下来就是等待到货了,在
这期间我也没闲着,一直在测试问题1怎么解决。
很显然,问题1其实就等同于:如何在LINUX操作系统中,给光驱发
送控制命令CDB,具体是发送自己任意构造的控制信息
_MSG_SCSI_IO_REQUEST。此乃代码之事自然是要交给AI:

在这里插入图片描述

在跟chatGPT一顿聊天后,写出了第一版的发送自定义CDB信息给光
驱控制器。但随后只要将CDB长度改为大于16字节,就发现调试
vmware的windbg中不会打印信息,而长度6101216则可正常
显示。这有两种可能:1 是Guest中的Linux内核根本就没有把IO请
求发送给控制器--vmware,即LINUX内核中有检查, 2 是vmware对
_MSG_SCSI_IO_REQUEST结构有检查。由于视频中并未提及情况2,
故本人倾向于情况1导致。于是继续翻了一两天Linux内核代码,首
先发现的是chatGPT给我的方法是比较上层的内核函数,这个方法
只是把CDB请求加入到了底层驱动请求队列中,并非直接与IO驱动
打交道:

在这里插入图片描述

大致来说就是,文件驱动发送一个请求插入到队列里,而这个队列
中的各种块设备操作,可能涉及到各种设备磁头位置的读写,于是
采用统一的块设备驱动层来管理这些队列中的请求,一般情况下写
操作因为比较慢都是直接写的内存缓存,在一定条件下才会真正落
实写文件操作。而块设备会真正落实写文件时,才会真的跟块设备
控制器交互。于是我们的ko真正应该调用的是落实块设备交互的那
些函数--mptspi,这里虽然视频中也提到了。于是看Linux SCSI驱
动相关模块,找到mptspi相关代码部分,调用其中函数直接去控制
块设备--CDROM。终于,实现了可以发送任意篡改的
_MSG_SCSI_IO_REQUEST结构给“块设备控制器”--vmware:

在这里插入图片描述

上图中,红框的40就是该改掉的CDBlength,之后60开头的那一串
22就是CDB。至此问题1完美解决。同时(其实是稍早一点)USB光
驱也到货了:

在这里插入图片描述

插上光驱,调整为使用物理光驱,再次调试:

在这里插入图片描述

可以看到直接传进来的参数二就是0,直接就是另一个类型,于是
后续自然调用vmware_vmx+80ddd0处的函数设置a1结构,之后a1+8
处的函数表的第4个元素即+0x18处已经有了具体的某函数。之后便
是一路畅通的走到判断+18处函数并调用:

在这里插入图片描述

最后,成功触发漏洞!越界写造成crash vmware:

在这里插入图片描述

实验结束!成功获得虚拟机逃逸技术,技能树点亮+1

POC代码在这里:https://github.com/ze0r/vmware-escape-CVE-2023-20872-poc


这篇关于走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098277

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

# VMware 共享文件

VMware tools快速安装 VMware 提供了 open-vm-tools,这是 VMware 官方推荐的开源工具包,通常不需要手动安装 VMware Tools,因为大多数 Linux 发行版(包括 Ubuntu、CentOS 等)都包含了 open-vm-tools,并且已经优化以提供与 VMware 环境的兼容性和功能支持。 建议按照以下步骤安装 open-vm-tools 而不

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在