MozhuCY's blog.

CVE-2015-7504 QEMU虚拟机逃逸漏洞分析

字数统计: 785阅读时长: 2 min
1970/01/01 Share

QEMU

  • QEMU是一套模拟处理器,在Linux平台上使用广泛,一般虚拟机的漏洞分为两大类,DoS和逃逸,其中逃逸的漏洞威胁最大,但是挖掘难度也很大.
  • 漏洞多出现于IO部分,因为交互需要许多长度未定的数据,所以在数据处理的代码中,往往会出现一些类似于溢出的漏洞,一般通过这些溢出,就能达到使虚拟机crash的目的

分析目的

  • 这里想要通过已经给出POC的漏洞,以及qemu开源的优势来熟悉虚拟机漏洞的成因以及原理,方便以后对于不同种类虚拟机的漏洞挖掘

环境搭建

  • 卡在这里好久,一直是VNC server running on 127.0.0.1:5900,缺少SDL库,一开始按照网上的教程apt安装了一下,但是还是会出现SDL support no,后来发现还有另一个高版本的SDL库,安装之后重新编译就搞定了.
  • 这里我才用的是Ubuntu1604作为qemu的载体,Ubuntu是通过PD搭建在我的mac上的,三层虚拟化还是有一些小问题的.
  • 先来说一般的安装步骤,因为要调试的是以前的漏洞,当前版本的qemu肯定是不行的,这里采用git clone来获取之前版本的源码,而且编译的话也方便进行调试和源码分析,而不是apt-get
  • git clone git://git.qemu-project.org/qemu.git
  • 获取源码以后,configure加上参数生成makefile文件,然后直接make && make install进行编译
  • 创建镜像,这里我直接采用了qemu提供的debian.qcow2,因为调试的是qemu,所以和qemu内的系统关系不是很大
  • 调试器这里采用CTF中比较常用的名叫pwndbg的gdb插件来进行调试(因为用习惯了233333

内核调试方法

  • 调试模式启动虚拟机加上-S选项,并且要指定一个网卡,不然的话是remote不上去的,回车以后虚拟机启动的时候会被断下来.
  • 进入ctrl + alt + 2窗口,输入gdbserver tcp::9999
  • 执行gdb,输入target remote localhost:9999开始调试,之后就是下短点看内存之类的操作了

qemu调试方法

  • gdb qemu-system-x86
  • 输入set args xx.qcow2
  • 等待启动以后,设置断点,run,就能看到源码和对应的汇编,内存了.

漏洞分析

  • 首先这一个堆溢出漏洞,漏洞点在网卡模拟的部分,这里的数据溢出可以覆盖到qemu即将调用的Handel的值,即我们可以通过这个溢出来进行逃逸
  • b pcnet_receive下断,设置main断点,运行,正常运行,c继续运行,启动好虚拟机后,将静态编译好的poc放在文件夹内,python -m SimpleHTTPserver 8090,在文件夹里起一个简单的服务器,在qemu起的虚拟机内,利用wget获取编译好的poc,然后进行调试,注意宿主机的ip默认为10.0.2.2,这里wget 10.0.2.2:8090/a.out
CATALOG
  1. 1. QEMU
  2. 2. 分析目的
  3. 3. 环境搭建
    1. 3.1. 内核调试方法
    2. 3.2. qemu调试方法
  4. 4. 漏洞分析