走进虚拟机逃逸技术之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中不会打印信息,而长度6、10、12、16则可正常
显示。这有两种可能: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复现
走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现 技术分享 技术分享 起初,为了学习虚拟机逃逸相关技术,也为了搞懂硬件虚拟化。于是请教了某巨佬后告诉我一本书,看完之后为了验证我理解到的硬件虚拟化及虚拟化逃逸原理是否正确&am…...
leetcode118. 杨辉三角,老题又做
leetcode118. 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1…...
进程(一)(22)
1.进程是什么 进程是程序执行的过程,会去分配内存资源,cpu的调度。正在运行的程序叫进程。 并发:同一时刻可以同时完成多个任务。 进程: 是操作系统对正在运行的程序的抽象。进程不仅包括程序的代码,还包括程序的执行状态、内存…...
Excel“取消工作表保护”忘记密码并恢复原始密码
文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑,提示如下,但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件; 2、依次点击菜单栏上的视图—宏----录制宏…...
WPS关闭后,进程依然在后台运行的解决办法
问题 wps启动后 在启动wps后,什么都不做,打开进程管理器,发现居然运行了3个wps进程: win10只会显示wps进程: win11显示比较准确: 关闭后 在关闭wps,再去任务管理器查看,发现在…...
SQL每日一练-0816
今日SQL题:计算每个项目的年度收入增长率 难度系数:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额,并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…...
直方图均衡化
概念 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,通过拉伸像素强度分布范围来增强图像对比度。 原理 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布),从而令强度值分布会在整个范围内…...
Golang | Leetcode Golang题解之第342题4的幂
题目: 题解: func isPowerOfFour(n int) bool {return n > 0 && n&(n-1) 0 && n%3 1 }...
数学建模学习(116):全面解析梯度下降算法及其在机器学习中的应用与优化
文章目录 1.梯度下降简介1.1 梯度下降的数学原理1.2 学习率的选择2 梯度下降变体3.梯度下降优化器3.1 动量法(Momentum)3.2 AdaGrad3.3 RMSprop3.4 Adam3.5 Python 使用不同优化器训练线性回归模型4.案例:使用梯度下降优化加利福尼亚房价预测模型4.1. 数据准备4.2. 模型训练…...
[mysql][sql]mysql查询表大小
select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量(MB), truncate(index_length/1024/1024, 2) as 索引容量(MB) from information_schema.tables where 11 and table_schemadb001 order by table_ro…...
8.16 mysql主从数据库(5.7版本)与python的交互及mycat
mysql数据库基本操作: [rootm ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 解压压缩包 [rootm ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64 mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootm ~]# cp -r mysql-5.7.44-lin…...
项目问题 | CentOS 7停止维护导致yum失效的解决办法
目录 centos停止维护意味着yum相关源伴随失效。 报错: 解决方案:将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部,博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…...
【Docker】Docker Compose(容器编排)
一、什么是 Docker Compose docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念&…...
嵌入式初学-C语言-二九
C语言编译步骤 预处理编译汇编链接 什么是预处理 预处理就是在源文件(如.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动完成,当源文件在编译时,编译器会自动调用预处理指令的解析…...
0x03 ShowDoc 文件上传漏洞(CNVD-2020-26585)复现
参考:ShowDoc文件上传漏洞(CNVD-2020-26585)_showdoc漏洞-CSDN博客 一、fofa 搜索使用该工具的网站 网络空间测绘,网络空间安全搜索引擎,网络空间搜索引擎,安全态势感知 - FOFA网络空间测绘系统 "S…...
【大模型从入门到精通34】开源库框架LangChain 利用LangChain构建聊天机器人1
这里写目录标题 利用LangChain构建聊天机器人介绍介绍对话型聊天机器人构建环境环境变量和平台设置 加载文档和创建向量存储高级检索技术对话上下文和记忆纳入聊天历史会话缓冲内存 构建对话检索链环境设置与API密钥配置选择合适的语言模型版本Q&A系统设置 利用LangChain构…...
魔法糖果工厂
LYA 是一家魔法糖果工厂的新任管理员。工厂生产的魔法糖果有七种颜色,分别用字母 a、b、c、d、e、f、g 表示。这些糖果被排列在一条传送带上,准备进行包装。为了提高效率,工厂引进了一台智能包装机器人。这个机器人可以按照预设的指令序列来包…...
NVM安装管理node.js版本(简单易懂)
一、前言 1.1 简介 NVM(Node Version Manager)是 node.js 的版本管理器,用 shell 脚本切换机器中不同版本的 nodejs。 Nodejs为什么需要多个版本? 有经验的开发者可能遇到过,某个依赖包明确nodejs是某个版本&#…...
第1章-04-Chrome及Chrome Driver安装及测试
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师&am…...
【Linux】SSH 隧道转发场景搭建
ssh建立隧道转发 A设备:没有公网IP地址的本地设备,如本地内网服务器(需要能通公网) B设备:有公网IP地址的服务器,可以是云服务器 C设备:终端设备,想通过公网服务器B访问到设备A 要…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
