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

news2024/10/2 6:32:00

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图书管理系统详细设计

需求概述 按照需求分析文档中的规格要求&#xff0c;使用条形码扫描器进书、借书、还书&#xff0c;使得信息传递准确、流畅。同时&#xff0c;系统最大限度地实现易安装&#xff0c;易维护性&#xff0c;易操作性&#xff0c;运行稳定&#xff0c;安全可靠。 软件结构 系统由…

如何让虚拟机识别到宿主机的USB设备

我的实验环境&#xff1a; Windows宿主机VirtualBox虚拟化软件一个Linux虚机一个8G的USB磁盘 首先要让虚拟机能看到宿主机的USB设备&#xff0c;这是在VirtualBox中设置的。 选中虚机&#xff0c;右键选择“设置”菜单&#xff0c;再单击“USB设备”&#xff1a; 选中“启用…

Python | Leetcode Python题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution:def canMeasureWater(self, x: int, y: int, z: int) -> bool:if x y < z:return Falseif x 0 or y 0:return z 0 or x y zreturn z % math.gcd(x, y) 0

Alembic:python中数据库迁移的瑞士军刀

Alembic 简介 Alembic 是由 SQLAlchemy 的创始人 Mike Bayer 设计的一个数据库迁移工具。它不仅支持自动迁移脚本生成&#xff0c;还允许开发者手动编辑迁移脚本来满足特定的需求。Alembic 通过提供一个环境来跟踪数据库模式的变更历史&#xff0c;确保数据库的版本与应用代码…

推荐一个完全自由的目录设计网站

引言 如果我们能通过网站出一本书&#xff0c;这将是一件很酷的事。 事实上&#xff0c;我们通过网站发布知识&#xff0c;最常见的是写博客。 这二者有什么区别呢&#xff1f; 书本的知识内容有很强的逻辑性、系统性。而博客是随心所欲的&#xff0c;一时灵感来了就写一篇…

关闭Chrome快捷键

chrome是没办法改变快捷键以及屏蔽快捷键的&#xff0c;需要安装插件&#xff1a;shortkey 保证插件是开启的 不用做其他设置所有快捷键已被关闭

OAPT:用于双JPEG伪影去除的偏移感知分区的Transformer

OAPT: Offset-Aware Partition Transformer for Double JPEG Artifacts Removal https://github.com/QMoQ/OAPT 2408.11480 (arxiv.org) 基于深度学习的方法在去除单个JPEG伪影任务中表现出了显著的性能。然而&#xff0c;现有方法在处理双重JPEG图像时往往会退化&#xff0c…

127-隧道搭建穿透上线FRPNPSNgrok

使用了几种工具将会一一介绍 ngrokru 项目地址&#xff1a;Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 这个网站现在要实名认证&#xff08;还得花2元解锁&#xff09; 用这种在线的网站怎么说呢&#xff0c;真不如自己买个云服务器用下面的frp&#xff0c;毕竟流量…

Python3:多行文本内容转换为标准的cURL请求参数值

背景 在最近的工作中&#xff0c;经常需要处理一些接口请求的参数&#xff0c;参数来源形式很多&#xff0c;可能是Excel、知识库文档等&#xff0c;有些数据形式比较复杂&#xff0c;比如多行或者包含很多不同的字符&#xff0c;示例如下&#xff1a; **客服质检分析指引** …

多个程序监听不同网卡的相同端口、相同网卡不同IP的相同端口

1 概述 一个主机上的多个程序监听同一个端口&#xff0c;是否一定存在冲突&#xff1f;如果是多网卡、单网卡多IP的情景下&#xff0c;多个程序是可以独立监听的。 2 多个程序监听不同网卡的相同端口 3 多个程序监听同一个网卡不同IP的相同端口 4 小结 多个程序监听同一个网…

生成式人工智能会导致人工智能崩溃吗

况可能很快就会发生变化。 从定义上讲&#xff0c;LLM 需要大量数据&#xff0c;而且所使用的数据集越来越大。根据缩放定律[2]&#xff0c;要提高性能&#xff0c;必须同时增加参数数量和训练标记数量&#xff08;后者被认为是最重要的因素&#xff09;。 这些数据集包含人类产…

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

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

ZMQ请求应答模型

案例一 这个案例的出处是ZMQ的官网。请求段发送Hello&#xff0c;应答端回复World。 ZMQ Request(client) #include <string> #include <iostream> #include <zmq.hpp>using namespace std; using namespace zmq; // 使用 zmq 命名空间int main() {// ini…

知识竞赛答题设备及答题方式有哪些

根据我们多年的知识竞赛承办经验&#xff0c;我来谈谈在知识竞赛中常用的答题设备和答题方式。 一、常用答题设备 1.电脑 如果电脑资源充足&#xff0c;可以用笔记本电脑进行答题&#xff0c;笔记本电脑可以采取有线或无线方式进行连网&#xff0c;可以根据情况选择连网方案&…

PyTorch专栏介绍

专栏导读 深度学习作为人工智能领域的重要分支&#xff0c;其应用范围广泛&#xff0c;从图像识别到自然语言处理&#xff0c;再到强化学习等。PyTorch作为当前流行的深度学习框架之一&#xff0c;以其动态计算图和易用性受到了广大开发者的青睐。本专栏将带领读者从零开始&am…

kubeadm搭建生产环境高可用集群

前言 搞了好多天&#xff08;今天是20240819&#xff09;&#xff0c;中途遇到各种各样的问题&#xff0c;总算是可以用了 我这里用的vmware开了5台服务器做学习实践 K8S因为直接使用的 pkgs.k8s.io 仓库&#xff0c;所以直接拉取的最新release版&#xff08;v1.31&#xff09…

结构开发笔记(五):solidworks软件(四):绘制36x36方块摄像头基座

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141422131 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【hot100篇-python刷题记录】【盛最多水的容器】

R6-双指针篇 印象题 双指针法&#xff0c;num1在0处&#xff0c;num2在n-1处&#xff0c;相对移动收缩。 核心&#xff1a; 每次单步移动短板&#xff0c;因为长板收缩面积肯定变小。 面积&#xff1a;短板决定 class Solution:def maxArea(self, height: List[int]) ->…

【嵌入式软件】stm32内部flash读写

1.简介 控制系统采用STM32F429IGT6,STM32F429IGT6 的 FALSH 容量为 1024K 字节。 STM32F429 的闪存模块组织如下表所示。 STM32F429xx 的闪存模块由:主存储器、系统存储器、OTP 区域和选项字节等 4 部分组 成。 1)主存储器,该部分用来存放代码和数据常数(如 con…

PHP开发过程中常见问题快速解决

1.PHP解决文件名不合法,无法创建 文件名称不能含有 /\:*?"<>|符号&#xff0c;直接替换关键词就OK了 $search array(*,$,\\,/,"",",*,?,:,<,>,|, ,[,],【,】,(,),&#xff08;,&#xff09;); $name"1:.php"; $new_namestr_repla…