V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zsmjcnm
V2EX  ›  问与答

KVM 虚拟化新型漏洞 CVE-2015-6815 技术分析

  •  1
     
  •   zsmjcnm · 2015-09-14 12:59:44 +08:00 · 2172 次点击
    这是一个创建于 3360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    0x00 前言

    云计算业务目前已经触及到多个行业,无论是云存储,云音乐等生活中随处可见的业务,就连银行金融,支付信息等服务也都和云紧密相关。作为云服务的基础,虚拟化系统扮演着非常重要的角色,因为在云生态中主机的硬件多是由虚拟化系统模拟出来的。虚拟化系统中的安全漏洞将严重影响云业务的安全。

    360 虚拟化安全团队( MarvelTeam )近日发现了多个虚拟化软件安全漏洞,使用 kvm 和 xen 作为虚拟化平台的公司业务都将会受这批漏洞影响。该漏洞一旦被攻击者恶意利用,可以造成三种类型的安全风险: 1 )虚拟机宕机,影响业务; 2 )系统资源被强制占用,宿主机及所有虚拟机拒绝服务; 3 )虚拟机逃逸,攻击者在宿主机中执行任意代码。

    我们将陆续公开系列针对虚拟化软件高危 0day 漏洞的分析文章,揭开宿主机攻击技术的神秘面纱。本文将首先分析 KVM 虚拟化新型漏洞 CVE-2015-6815 。

    在 9 月 29 日的 ISC 2015 大会上, 360 虚拟化安全团队( MarvelTeam )安全研究员唐青昊,将进行《云虚拟化系统的漏洞挖掘技术》的议题演讲,进一步分享漏洞挖掘的核心技术。

    0x01 关于 QEMU 和 KVM

    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 版本来完成。

    0x02 QEMU 网卡设备简介

    QEMU 支持多种网卡设备,可以通过如下的命令去列举所支持的网卡设备类型,一共有 8 种,基本可以满足大多数操作系统的需求。

    图 2.qemu 支持的虚拟网卡设备

    此次漏洞出现在 e1000 网卡设备中,该网卡的基本功能等同于 Intel rc82540EM 硬件网卡,支持 TSO 技术,网络数据传输效率极高。

    0x03 漏洞分析

    CVE-2015-6815 是 qemu 软件的虚拟网卡设备存在的一处逻辑漏洞,攻击者可通过构造恶意的数据流触发该漏洞。 我们分析网卡在处理恶意数据流时执行的逻辑:

    a )网卡驱动向网卡设备发送指令,通知网卡设备执行数据发送操作; b ) set_tctl (E1000State *s, int index, uint32_t val )

    当网卡设备判断已经设置相关寄存器,即开始进行发包操作,进入 set_tctl 函数中进行相关处理,函数原型如下:

    c ) start_xmit (E1000State *s )

    start_xmit 函数首先检查(s->reg[TCTL]&E1000_TCTL_EN ),若等于 0 ,表示没开启发送功能,将直接退出。否则判断是否存在有效的描述符,有的话则依次取出描述符交给 process_tx_desc 处理。

    d )存在漏洞的函数源码如下:


    图 3.存在漏洞的函数代码

    根据注释,可以清晰地看到,该函数的主要目的是按照 3 种类型来处理网卡数据描述符表中的单个描述符,分别是 context descriptor , data descriptor , legacy descriptor ,这三种类型代表了不同的数据内容:描述信息,数据,遗留信息,网卡通过判断处于何种类型,设置 s->tx 的状态位,然后根据 tp->tse 和 tp->cptst 来确定是否要调用 xmit_seg 函数以及怎样填充 buf,由于函数对驱动传进来描述符的内容没有检测,可设置成任意值。 xmit_seg 函数根据 s->tx 中各字段的信息来填充 s->data,最后调用 qemu_send_packet 函数发送 s->data,qemu_send_packet (nc, buf, size )。

    在该函数的执行过程中,攻击者通过恶意的数据流,可以控制该函数中的 tp->hdr_len 和 tp->mss 数据的值,而 msh = tp->hdr_len + tp->mss 。在进入 do...while 循环之后, tp->size 值为 0 ,而 bytes 和 msh 的值可以控制,通过迫使代码逻辑进入第一个 if 循环,可将 bytes 设置为 msh 的值,即 bytes 也可以被控制。之后, bytes 可以一直保持值不变,直至进入 while 的条件判断语句,此时如果 bytes 为 0 ,则 do...while 进入死循环的逻辑。

    0x04 漏洞危害

    攻击者利用该漏洞可以导致虚拟机拒绝服务,并且保持对 cpu 的高占用率,继而会影响宿主机以及其他虚拟机的正常执行。

    我们在测试环境中对该漏洞进行测试,触发前后的截图如下。可以看到,在漏洞触发后宿主机的空闲 cpu 百分比一直锁定为为 0%。

    图 4.触发漏洞前

    图 5.触发漏洞后

    0x05 漏洞修补方案

    360 虚拟化安全团队( MarvelTeam )在发现了该漏洞之后,第一时间通知 QEMU 软件官方团队进行修复。官方在 20 天的紧张修复之后,在 9 月 5 日完成对该漏洞的修复补丁。详细信息见 https://access.redhat.com/security/cve/CVE-2015-6815 ,该网页也包含了 360 虚拟化安全团队的致谢。

    官方对该漏洞的修补方法如下:

    图 6.官方提供的漏洞补丁

    在该补丁中,开发人员加入了对漏洞关键数据 – bytes 树值的判断,如为 0 ,则退出循环,完美修复漏洞。建议所有使用 qemu 的厂商采用该补丁,防止攻击者对在虚拟机中利用 CVE-2015-6815 漏洞。

    https://community.qingcloud.com/topic/99/kvm%E8%99%9A%E6%8B%9F%E5%8C%96%E6%96%B0%E5%9E%8B%E6%BC%8F%E6%B4%9Ecve-2015-6815%E6%8A%80%E6%9C%AF%E5%88%86%E6%9E%90

    drivel
        1
    drivel  
       2015-09-14 15:30:59 +08:00
    给你补充一个 TL; DR

    就是一个 KVM 虚拟出来 e1000 网卡上导致的无限循环问题,这种漏洞几乎没什么安全隐患
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5810 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.