0x00 前言


云计算目前已成为一种被大多数互联网公司接受的服务模式,它提供了定制化的硬件资源,应用,以及服务。作为实现云计算构想的最重要的技术基石,虚拟化系统提供了硬件资源的量化分配和灵活调度,保证云业务的顺利实施。因此,云业务的健康发展,离不开虚拟化系统的稳定运行。

360 Marvel Team将陆续公开一系列独立发现的针对虚拟化软件高危0day漏洞的分析文章,揭开虚拟化攻击技术的神秘面纱。在9月29日的360 ISC 2015大会上,该团队安全研究员唐青昊,将进行关于《云虚拟化系统的漏洞挖掘技术》议题的演讲,在该议题中将分享漏洞挖掘的核心技术。

本文为该系列的第二篇文章,将详细分析CVE-2015-5279 qemu网卡堆溢出漏洞的相关知识。关于第一篇文章针对CVE-2015-6815漏洞的分析,详见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 平台,都能正常工作。

图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相关适配器模块,再通过宿主机的物理网卡向外发送数据。而接收数据则是相反的过程。

图2. rtl8029网卡实物照

0x02 漏洞原理分析


第一部分中简要分析了kvm, qemu,以及关于ne2000网卡模块这些了解漏洞原理的基础知识,我们再来分析CVE-2015-5279漏洞的具体产生原因。

该漏洞发生在ne2000网卡模块的接收数据包的过程,相关代码截图如下。这部分代码取自qemu-2.4.0/hw/net/ne2000.c文件中的ne2000_receive函数。ne2000_receive函数是虚拟机接收外部数据包的关键函数,其大致流程为:

  1. 判断网卡是否处于工作状态,数据缓冲区是否处于满的状态;
  2. 通过检测是否是否处于混杂模式,mac地址是否匹配,是否为广播地址,从而判断是否接收此数据包;
  3. 如缓冲区较小,则对其进行扩展;
  4. 进入数据包处理过程(如下图代码所示):处理数据包头部;写数据包内容;
  5. 结束收包过程(如下图代码所示)。

图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是可被操控的,因此可以在正确的缓冲区之外写入数据包内容。要实现这种利用方式,还需控制收包流程中的第一步,即判断缓冲区边界的过程。相关代码截图如下。

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

0x03 漏洞危害


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

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

0x04 漏洞修复方案


360 Marvel Team在发现该漏洞之后,第一时间通知了qemu官方安全团队进行修复。 在经历了长达25天的紧张修复之后,官方团队于9月15日公开了该漏洞的详细信息,详见https://access.redhat.com/security/cve/CVE-2015-5279,该链接也包含了对360 Marvel Team成员的致谢信息。

补丁地址:https://lists.gnu.org/archive/html/qemu-devel/2015-09/msg03984.html

官方提供了对该漏洞的补丁,其中在ne2000_receive函数中增加了对索引边界的检查,防止了缓冲区溢出的危险。建议使用qemu的厂商尽快采用该补丁,以免黑客利用该漏洞对业务造成影响。

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