# 360MarvelTeam虚拟化漏洞第二弹 － CVE-2015-5279 漏洞分析

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-09-25T04:59:00Z
Canonical: https://wepostx.com/topics/1073

> 乌云历史资料归档
>
> **原始作者：** 360安全卫士
> **原始编号：** superkieran-wooyundrops:794
> **原始发布时间：** 2015-09-25 12:59
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 前言

云计算目前已成为一种被大多数互联网公司接受的服务模式，它提供了定制化的硬件资源，应用，以及服务。作为实现云计算构想的最重要的技术基石，虚拟化系统提供了硬件资源的量化分配和灵活调度，保证云业务的顺利实施。因此，云业务的健康发展，离不开虚拟化系统的稳定运行。
360 Marvel Team将陆续公开一系列独立发现的针对虚拟化软件高危0day漏洞的分析文章，揭开虚拟化攻击技术的神秘面纱。在9月29日的360 ISC 2015大会上，该团队安全研究员唐青昊，将进行关于《云虚拟化系统的漏洞挖掘技术》议题的演讲，在该议题中将分享漏洞挖掘的核心技术。
本文为该系列的第二篇文章，将详细分析CVE-2015-5279 qemu网卡堆溢出漏洞的相关知识。关于第一篇文章针对CVE-2015-6815漏洞的分析，详见[http://www.freebuf.com/vuls/77834.html](http://www.freebuf.com/vuls/77834.html)。

# 0x01 漏洞基础知识

CVE-2015-5279是qemu虚拟化环境中rtl8029网卡设备存在一处堆溢出类型漏洞。那么什么是qemu软件？qemu软件和kvm虚拟化存在什么样的关系？rtl8029网卡是怎样的一款设备呢?下面将逐一解答这些问题。
QEMU是一款处理器模拟软件，可以提供用户模式模拟和系统模式模拟。当处于用户模式模拟状态时，将使用动态翻译技术，允许一个cpu构建的进程在另一个cpu上执行。系统模式模拟状态下，允许对整个pc系统的处理器和所使用到的相关外围设备进行模拟。qemu提供的仿真外设包括硬件Video Graphics Array (VGA) 仿真器、PS/2 鼠标和键盘、集成开发环境（IDE）硬盘和 CD-ROM 接口，以及软盘仿真。也包括对E2000 Peripheral Controller Interconnect (PCI) 网络适配器、串行端口、大量的声卡和 PCI Universal Host Controller Interface (UHCI) Universal Serial Bus (USB) 控制器（带虚拟 USB 集线器）的仿真。除了仿真标准 PC 或 ISA PC（不带 PCI 总线）外，QEMU 还可以仿真其他非 PC 硬件，如 ARM Versatile 基线板（使用 926E）和 Malta million instructions per second (MIPS) 板。对于各种其他平台，包括 Power Macintosh G3 (Blue & White) 和 Sun-4u 平台，都能正常工作。

![原文图片](/media/2016/06/b7921427426db5c36921e36c069ec891)

图1.qemu可进行模拟的外围设备
KVM是一种依赖硬件虚拟化技术（Intel VT或者AMD V）的裸机虚拟化程序，它使用 Linux 内核作为它的虚拟机管理程序。对 KVM 虚拟化的支持自 2.6.20 版开始已成为主流 Linux 内核的默认部分。KVM支持的操作系统非常广泛，包括Linux、BSD、Solaris、Windows、Haiku、ReactOS 和 AROS Research Operating System。
在 KVM 架构中，虚拟机实现为常规的 Linux 进程，由标准 Linux 调度程序进行调度。事实上，每个虚拟 CPU 显示为一个常规的 Linux 进程。这使 KVM 能够享受 Linux 内核的所有功能。设备模拟由提供了修改过的 qemu 版本来完成。
在了解了kvm和qemu的原理以及相互的关系之后，我们再来关注下rtl8029网卡设备，如下图所示。这里需要了解的是在qemu中模拟rtl8029网卡设备的模块是ne2000。ne2000模拟了rtl8029网卡收发数据包的流程，逻辑位置位于虚拟机设备驱动和宿主机qemu网络适配器模块之间，当虚拟机的用户空间发生socket send操作之后，设备驱动将封装好的数据发送到ne2000设备模拟器，然后进入qemu相关适配器模块，再通过宿主机的物理网卡向外发送数据。而接收数据则是相反的过程。

![原文图片](/media/2016/06/1eadbcaac5b8f4556be65813308bd26c)

图2. rtl8029网卡实物照

# 0x02 漏洞原理分析

第一部分中简要分析了kvm， qemu，以及关于ne2000网卡模块这些了解漏洞原理的基础知识，我们再来分析CVE-2015-5279漏洞的具体产生原因。
该漏洞发生在ne2000网卡模块的接收数据包的过程，相关代码截图如下。这部分代码取自qemu-2.4.0/hw/net/ne2000.c文件中的ne2000_receive函数。ne2000_receive函数是虚拟机接收外部数据包的关键函数，其大致流程为：

- 判断网卡是否处于工作状态，数据缓冲区是否处于满的状态；

- 通过检测是否是否处于混杂模式，mac地址是否匹配，是否为广播地址，从而判断是否接收此数据包；

- 如缓冲区较小，则对其进行扩展；

- 进入数据包处理过程（如下图代码所示）：处理数据包头部；写数据包内容；

- 结束收包过程（如下图代码所示）。

![原文图片](/media/2016/06/a34f01b04bbb6e52606a8589ce7fd007)

图3. 有缺陷的代码
在进入收包代码之前，s->curpag，s->stop，s->start是可以被黑客控制为任意数值。因此在上述函数流程的第4步中，index，avail，len这些关键的变量也可以被设置为可控的数值。利用这一特点，黑客可以创造出哪些攻击方式呢？
首先可以导致逻辑循环，即当进入while循环之后，使len不断等于0，执行”size -= len； ”这一行指令时，size永远不会减小，因此“ while (size > 0) ”的判断永远为真，进入死循环。
第二种是造成堆缓冲区的溢出，在执行“memcpy(s->mem + index, buf, len); ”这一行代码时，由于index是可被操控的，因此可以在正确的缓冲区之外写入数据包内容。要实现这种利用方式，还需控制收包流程中的第一步，即判断缓冲区边界的过程。相关代码截图如下。

![原文图片](/media/2016/06/206f305adc2b150a92a09fc4acb3c588)

图4. 需要进行关注的关键代码

# 0x03 漏洞危害

CVE-2015-5279被qemu官方安全团队定义为高危漏洞，一旦被黑客恶意利用，可以实现拒绝服务攻击，虚拟机逃逸攻击。在成功利用该漏洞之后，黑客进而可以控制宿主机以及该宿主机上的其他虚拟机，进而造成企业的敏感信息泄露，内网被渗透的可怕后果。

![原文图片](/media/2016/06/533a483ed584861a1f1f1b36d3576b12)

图5. 官方确定该漏洞为高危

# 0x04 漏洞修复方案

360 Marvel Team在发现该漏洞之后，第一时间通知了qemu官方安全团队进行修复。 在经历了长达25天的紧张修复之后，官方团队于9月15日公开了该漏洞的详细信息，详见[https://access.redhat.com/security/cve/CVE-2015-5279](https://access.redhat.com/security/cve/CVE-2015-5279)，该链接也包含了对360 Marvel Team成员的致谢信息。
补丁地址：[https://lists.gnu.org/archive/html/qemu-devel/2015-09/msg03984.html](https://lists.gnu.org/archive/html/qemu-devel/2015-09/msg03984.html)
官方提供了对该漏洞的补丁，其中在ne2000_receive函数中增加了对索引边界的检查，防止了缓冲区溢出的危险。建议使用qemu的厂商尽快采用该补丁，以免黑客利用该漏洞对业务造成影响。

![原文图片](/media/2016/06/fa4884ff4538664bffb3bb73b3762eda)

图6. 官方发布的补丁信息

## Replies
