本文章,共 9 章,由于篇幅较长,公众号将分三部分发出,比心❤

1. 介绍

如今虚拟机广泛应用于个人或企业中。网络安全供应商通过使用不同的虚拟机,实现在一个可控且封闭的环境中分析恶意软件。一个问题自然而然的出现了:这些恶意软件会从虚拟机中逃逸出来并在宿主机上执行吗?

去年,安全公司CrowdStrike的Jason Geffner,已经发布了一系列QEMU漏洞,通过影响虚拟机软盘驱动代码实现让一个攻击者从虚拟机逃逸[1]到宿主机中。虽然这个漏洞已经在网络社区中引起了广泛关注——也许因为它有一个专有名称(VENOM)——但这已经不是第一次出现这种漏洞了。

2011年,Nelson Elhage[2]发布并成功利用了一个在QEMU虚拟机热插拔PCI设备的漏洞。 利用过程可参见[3]。

最近,奇虎360的刘旭和汪圣平在HITB 2016黑客大会上展示了KVM/QEMU的成功利用。他们在两种不同的网卡设备仿真模型RTL8139 和PCNET上,演示了两个漏洞(CVE-2015-5165 和CVE-2015-7504)的利用。在展示中,他们列举了在宿主机上运行代码的主要步骤,但没有提供任何漏洞利用或技术细节来再现逃逸过程。

在本文中,我们对CVE-2015-5165(一个内存泄露漏洞)和CVE-2015-7504(一个堆溢出漏洞)进行了深度分析和利用。同时利用这两个漏洞可以实现虚拟机逃逸并在目标宿主机上运行代码。我们讨论了在QEMU的网卡设备仿真上利用这两个漏洞的技术细节,并提供了继续利用QEMU未来出现的漏洞的通用技术。比如一个用来共享内存区域和共享代码的交互式bindshell。

2. KVM/QEMU 概述

KVM(Kernal-based Virtual Machine)是一个为用户空间程序提供整个虚拟化基础架构的内核模型。它允许运行多个Linux或Windows映像的虚拟机。

KVM的用户空间部分包含于处理主要设备仿真的主线QEMU(高速虚拟机)。

2.1 工作区环境

为了方便读者使用本文中示例代码,我们在这一节给出了搭建开发环境的主要步骤。

因为我们使用的漏洞已经被修补了,所以需要找到QEMU仓库的源并恢复到漏洞被修补之前。然后,我们配置QEM只支持x86_64并激活漏洞:

在我们的测试环境中,使用4.9.2版本的Gcc搭建QEMU。

剩下的,我们假设读者已经有一个Linux x86_64映像并可以执行以下命令:

我们分配2GB内存空间并创建两个网卡: RTL8139和PCNET。

我们在3.16单核x_86_64架构的Debian 7上运行QEMU。

2.2 QEMU内存配置

为用户分配的物理内存实际上是QEMU虚拟地址空间中的一个mmap映射的私有区域。需要指出的是,为用户分配物理内存时PROT_EXEC参数是不可用的。

下图说明了用户内存和主机内存是如何共存的。

虚拟软盘_虚拟软盘文件vfd怎么创建_虚拟软盘命令

此外,QEMU为BIOS和ROM分配了一个内存区域。这些映射保存在QEMU的映射文件中:

2.3 地址转换

QEMU中有两个地址转换层:

1. 从用户虚拟地址转换到用户物理地址。实验中,我们需要配置DMA(Direct Memory Access,直接内存存取)方式的网卡。例如,我们需要为传送缓冲区和接收缓冲区提供物理地址来正确配置网卡。

2. 从用户物理地址转换到QEMU虚拟地址空间。实验中,我们需要添加虚拟结构并得到它们在QEMU虚拟地址空间中的准确地址。

在x64系统中,一个虚拟地址由一个页地址(0-11位)和一个页号构成。在linux系统中,pagemap文件允许有CAP_SYS_ADMIN特权的用户空间进程发现每个虚拟页映射到哪个物理框架。为了便于在内核中记录,pagemap文件包含了每个虚拟页的一个64位的值。参考文章[5]:

虚拟软盘命令_虚拟软盘_虚拟软盘文件vfd怎么创建

为了将虚拟地址转换成物理地址,我们使用Nelson Elhage的代码[3]。下面的程序分配了一段缓冲区,用字符串“Where am I?”填充并打印其物理地址:

—[mmu.c]—

#include

#include

#include

#include

#include

#include

#include

#definePAGE_SHIFT12

#definePAGE_SIZE(1

限时特惠:本站每日持续更新海量各大内部网赚创业教程,会员可以下载全站资源点击查看详情
站长微信:11082411

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。