当前位置: 首页 > news >正文

走进虚拟机逃逸技术之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复现

走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现 技术分享 技术分享 起初&#xff0c;为了学习虚拟机逃逸相关技术&#xff0c;也为了搞懂硬件虚拟化。于是请教了某巨佬后告诉我一本书&#xff0c;看完之后为了验证我理解到的硬件虚拟化及虚拟化逃逸原理是否正确&am…...

leetcode118. 杨辉三角,老题又做

leetcode118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1…...

进程(一)(22)

1.进程是什么 进程是程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度。正在运行的程序叫进程。 并发&#xff1a;同一时刻可以同时完成多个任务。 进程: 是操作系统对正在运行的程序的抽象。进程不仅包括程序的代码&#xff0c;还包括程序的执行状态、内存…...

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑&#xff0c;提示如下&#xff0c;但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件&#xff1b; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…...

WPS关闭后,进程依然在后台运行的解决办法

问题 wps启动后 在启动wps后&#xff0c;什么都不做&#xff0c;打开进程管理器&#xff0c;发现居然运行了3个wps进程&#xff1a; win10只会显示wps进程&#xff1a; win11显示比较准确&#xff1a; 关闭后 在关闭wps&#xff0c;再去任务管理器查看&#xff0c;发现在…...

SQL每日一练-0816

今日SQL题&#xff1a;计算每个项目的年度收入增长率 难度系数&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额&#xff0c;并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…...

直方图均衡化

概念 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法&#xff0c;通过拉伸像素强度分布范围来增强图像对比度。 原理 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布)&#xff0c;从而令强度值分布会在整个范围内…...

Golang | Leetcode Golang题解之第342题4的幂

题目&#xff1a; 题解&#xff1a; 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数据库基本操作&#xff1a; [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相关源伴随失效。 报错&#xff1a; 解决方案&#xff1a;将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部&#xff0c;博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…...

【Docker】Docker Compose(容器编排)

一、什么是 Docker Compose docker-compose 是 Docker 官方的开源项目&#xff0c;使用 python 编写&#xff0c;实现上调用了 Docker 服务的 API 进行容器管理及编排&#xff0c;其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念&…...

嵌入式初学-C语言-二九

C语言编译步骤 预处理编译汇编链接 什么是预处理 预处理就是在源文件&#xff08;如.c文件&#xff09;编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理程序自动完成&#xff0c;当源文件在编译时&#xff0c;编译器会自动调用预处理指令的解析…...

0x03 ShowDoc 文件上传漏洞(CNVD-2020-26585)复现

参考&#xff1a;ShowDoc文件上传漏洞&#xff08;CNVD-2020-26585&#xff09;_showdoc漏洞-CSDN博客 一、fofa 搜索使用该工具的网站 网络空间测绘&#xff0c;网络空间安全搜索引擎&#xff0c;网络空间搜索引擎&#xff0c;安全态势感知 - FOFA网络空间测绘系统 "S…...

【大模型从入门到精通34】开源库框架LangChain 利用LangChain构建聊天机器人1

这里写目录标题 利用LangChain构建聊天机器人介绍介绍对话型聊天机器人构建环境环境变量和平台设置 加载文档和创建向量存储高级检索技术对话上下文和记忆纳入聊天历史会话缓冲内存 构建对话检索链环境设置与API密钥配置选择合适的语言模型版本Q&A系统设置 利用LangChain构…...

魔法糖果工厂

LYA 是一家魔法糖果工厂的新任管理员。工厂生产的魔法糖果有七种颜色&#xff0c;分别用字母 a、b、c、d、e、f、g 表示。这些糖果被排列在一条传送带上&#xff0c;准备进行包装。为了提高效率&#xff0c;工厂引进了一台智能包装机器人。这个机器人可以按照预设的指令序列来包…...

NVM安装管理node.js版本(简单易懂)

一、前言 1.1 简介 NVM&#xff08;Node Version Manager&#xff09;是 node.js 的版本管理器&#xff0c;用 shell 脚本切换机器中不同版本的 nodejs。 Nodejs为什么需要多个版本&#xff1f; 有经验的开发者可能遇到过&#xff0c;某个依赖包明确nodejs是某个版本&#…...

第1章-04-Chrome及Chrome Driver安装及测试

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年CSDN全站百大博主。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&am…...

【Linux】SSH 隧道转发场景搭建

ssh建立隧道转发 A设备&#xff1a;没有公网IP地址的本地设备&#xff0c;如本地内网服务器&#xff08;需要能通公网&#xff09; B设备&#xff1a;有公网IP地址的服务器&#xff0c;可以是云服务器 C设备&#xff1a;终端设备&#xff0c;想通过公网服务器B访问到设备A 要…...

前后端部署-服务器linux中安装数据库Mysql8

一、登录Xshell7 && 开放Mysql 3306端口&#xff0c; Redis 6379 端口 二、手动部署MySQL数据库 1.运行以下命令&#xff0c;更新YUM源。 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 2.运行以下命令&#xff0c;安装My…...

如何使用jd-gui对springboot源码进行分析

背景&#xff1a; 最近在学习springboot的过滤器和拦截器&#xff0c;想了解一下过滤器和拦截器是怎么匹配URL的&#xff0c;在网上搜了半天都搜不到针对源码的&#xff0c;网上大部分内容都是说怎么配置过滤器和拦截器&#xff0c;怎么使用&#xff0c;并没有对源码进行分析的…...

原来ChatGPT是这么评价《黑神话:悟空》的啊?

《黑神话&#xff1a;悟空》一经上线便迅速吸引了全球的目光&#xff0c;成为了今日微博热搜榜上的焦点话题。作为中国首款现象级的中国3A大作&#xff0c;它的发布无疑引发了广泛的关注与讨论。 《黑神话&#xff1a;悟空》&#xff0c;这款3A国产游戏大作&#xff0c;由国内游…...

C语言第17篇

1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示&#xff1a;extern adj.外来的 register n.登记表&#xff0c;v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…...

Springboot+vue实现webScoket

需求 因为在做的项目中&#xff0c;有多个网站登录同一个用户&#xff0c;故想在某一个页面登录或者退出的时候&#xff0c;对其他页面进行相同的操作 跨域&#xff0c;跨页面&#xff0c;跨项目&#xff0c;跨标签页&#xff0c;https 因为一开始不像麻烦后端&#xff0c;所以…...

CSS知识点详解:display+float

display&#xff1a;浮动 1.block&#xff1a;使元素呈现为块级元素&#xff0c;可设置宽高 display: block; 特点&#xff1a;使元素呈现为块级元素&#xff0c;即该元素会以新行开始&#xff0c;占据整行的宽度&#xff0c;即使其宽度未满。 例子&#xff1a; 2.inline&a…...

ant design pro v6 如何做好角色管理

先上图&#xff1a; 整个角色管理是如何做的吗&#xff1f; 首先你要处理后端&#xff0c;要先把角色存到用户那。 这是用户管理部分的内容&#xff1a; 可以看到一个用户是有多个角色的。 看到没有&#xff0c;存的是数组 数组的是一个 role 对象 role 对象是这样&#xf…...

C++ 设计模式(3. 抽象工厂模式)

抽象工厂模式也是一种创建型设计模式&#xff0c;提供了一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类【引用自大话设计模式第15章】基本结构 抽象工厂模式包含多个抽象产品接口&#xff0c;多个具体产品类&#xff0c;一个抽象工厂接口和多个具体…...

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP&#xff08;Hypertext Preprocessor&#xff09;超文本预处理器是一种开源的通用脚本语…...

补 0 输出。

题目描述 输入一个整数&#xff0c;请在整数前面补 00 补足 88 位后输出。 输入描述 输入一行包含一个整数 nn。 输出描述 输出补00后的整数。 输入输出样例 示例1 输入 2021输出 00002021示例2 输入 202110输出 00202110 import os import sys# 请在此输入您的代码 si…...