# VNC拒绝服务漏洞(CVE-2015-5239)分析

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-09-21T10:12:00Z
Canonical: https://wepostx.com/topics/1060

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

---

作者：LR、noirfate

# 0x00 前言

Qemu是一款处理器模拟软件，可以提供用户模式模拟和系统模式模拟。当处于用户模式模拟状态时，将使用动态翻译技术，允许一个cpu构建的进程在另一个cpu上执行。
VNC [ Virtual Network Computing ]是一款优秀的远程控制工具软件。由于Qemu内置vnc功能模块，所以可通过vnc客户端对远程Qemu虚拟机进行远程访问。
360安全团队的 连一汉 在阅读Qemu-VNC源码过程中，发现了功能模块中的一个远程拒绝服务，漏洞危险等级为中，漏洞编号CVE-2015-5239。
相关信息见 https://access.redhat.com/security/cve/CVE-2015-5239

# 0x01 VNC通讯协议介绍：

VNC采用RFB通信协议。RFB ("remote 帧缓存 ") 是一个远程图形用户的简单协议。通过这个协议，用户可以远程模拟鼠标点击、键盘按键以及文本复制/剪切等功能。本文所讲述漏洞就是在文本复制/剪切时触发的。详细协议格式如下图：

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

举例说明：
下面这段数据是真实发送的用于文本复制/剪切的报文。

```text
06 00 00 00 00 00 00 06 74 65 73 74 21 21 06 ：表示协议类型message-type 00 00 00 ：用于填充padding 00 00 00 06 ：待剪切数据的长度length 74 65 73 74 21 21：待剪切数据内容text
```
协议格式相对简单，就不再进一步描述。

# 0x02 漏洞分析：

QEMU在通过vnc读取报文中存储的剪切板中的数据时，由于其未对报文中用于描述数据长度的字段进行严格限制，进而导致其出现逻辑错误进入死循环。下面就是程序处理的主体逻辑：

```text
a) 读取报文中用于描述待读取数据长度的字段 b) 判断这个字段是否超过整个报文的长度。 c) 如果为否，则进行数据复制；如果为是，则跳出循环
```
实现代码如下(ui/vnc.c)：

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

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

从上述代码中可以发现：由于len的初始值为1，所以protocol_client_msg()的返回值为8。Input.offset的值始终为14大于8，所以此时不会跳出循环。在进入下次循环时8将作为protocol_client_msg()的参数len传入，用于读取报文长度字段的值。但是，如果此时读取的报文中的长度字段为0xFFFFFFF9则protocol_client_msg()的返回值又将为1，下次循环时len的值也就又恢复为初始值1。这样，程序又进入开始时的状态，再次调用protocol_client_msg()并且返回值为8。然后又将8传入protocol_client_msg()，读取报文中的长度字段0xFFFFFFF9，返回值又为1，循环往复。由于在这段循环过程中客户端连接标志vs->csock始终未被更改，程序也将无法跳出循环，从而进入死循环状态。Vnc拒绝服务也就由此产生。

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

# 0x03 漏洞危害：

攻击者利用该漏洞可以导致虚拟机拒绝服务，并且保持对cpu的高占用率，继而会影响宿主机以及其他虚拟机的正常执行。 我们在测试环境中对该漏洞进行测试，触发前后的截图如下。可以看到，在漏洞触发后qemu-kvm无法远程访问，并占有极高的CPU使用率，严重影响其它程序的运行。 漏洞触发前CPU的状态:

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

漏洞触发后CPU的状态：

# 0x04 修补方案：

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

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

具体见：http://git.qemu.org/?p=qemu.git;a=commit;h=f9a70e79391f6d7c2a912d785239ee8effc1922d 该补丁中，开发人员对关键数据dlen的大小进行严格的大小判断，确保数据长度值不能超过1MB。这样就完美修复此漏洞。在这里建议所有使用qemu的厂商采用该补丁，防止攻击者利用CVE-2015-5239漏洞对厂商和用户攻击造成损失。 建议厂商安排安全修复。

## Replies
