Windows RDP服务高危漏洞分析(CVE-2019-0708)

发布时间 2019-05-29
漏洞背景


2019年5月14日微软官方发布紧急安全补丁,修复了Windows远程桌面服务的远程代码执行高危漏洞CVE-2019-0708(CNVD-2019-14264、CNNVD-201905-434),该漏洞影响了某些旧版本的Windows系统。由于该漏洞无需身份验证且无需用户交互,所以这个漏洞可以通过网络蠕虫的方式被利用,利用此漏洞的恶意软件可以从被感染的计算机传播到网络中其他易受攻击的计算机,传播方式与2017年WannaCry恶意软件的传播方式类似。


漏洞影响版本


Windows 7
Windows XP
Windows 2003
Windows Server 2008
Windows Server 2008 R2


RDP协议简介


RDP是微软终端服务应用的协议,服务端基于Windows操作系统,Windows从NT开始提供终端服务。RDP协议基于T.128(T.120协议族)提供多通道通信,并进行了拓展。



RDP协议的连接流程可以分为10个不同的阶段。这里我们关注通道连接相关的几个阶段。


(1)ConnectionInitiation(连接初始化)


客户端通过向服务器发送Class 0 X.224 ConnectionRequest PDU启动连接请求。服务器使用Class 0 X.224 Connection Confirm PDU进行响应。之后,客户端和服务器之间发送的所有后续数据都被包裹在X.224数据协议数据单元(PDU)中。


(2) BasicSettings Exchange(交换基本设置)


通过使用MCS Connect Initial PDU和MCS Connect Response PDU在客户端和服务器之间交换基本设置。GCC的全称是 Generic Conference Control,GCC 作为 T.124 的标准协议,用于连续传输大量数据时,将数据整理分块传输。


(3)Channel Connection (虚拟通道连接)


客户端通过发送multiple MCS Channel Join Request PDUs加入用户信道,输入/输出通道及所有的静态虚拟通道(IO和静态虚拟通道ID信息在GCC数据包中)。服务器通过MCS Channel Join Confirm PDU回复每个通道。


补丁分析


通过补丁包分析,我们发现补丁前后差异在于termdd.sys文件的IcaBindVirtualChannels及IcaReBindVirtualChannels,增加了对MS_T120协议通道的判定。如果是通道协议名为MS_T120,则设定IcaBindChannel的第三个参数为31。



服务端在初始化阶段,会创建MS_T120, Index为31的通道。在收到MCS Connect Initial数据封包后进行通道创建和绑定操作。


在IcaBindVirtualChannels函数中进行绑定时,IcaFindChannelByName函数只根据通道名进行通道查找。当通道名为MS_T120(不区分大小写)时,会找到系统内部通道MS_T120的通道并与之绑定,绑定后,通道索引会即被更改为新的通道索引。


漏洞原理分析


我们在客户端MCS Connect Initial数据封包中,增加一个名为MS_T120的通道。



接下来,我们释放这个Channel。我们向MS_T120通道发送构造的数据,但由于这个通道已经被绑定到内置的MS_T120通道,所以数据最终会派发到相应的处理函数rdpwsx!MCSProtData中,然后调用MCSChannelClose函数关闭通道。



此后,我们向系统的MS_T120通道发送数据,再次引用被关闭的通道,从而导致UAF漏洞。





解决方案


目前启明星辰已经发布了对应的产品级解决方案,相关链接为:https://www.venustech.com.cn/article/1/9148.html 。


对于Windows 7及Windows Server 2008的用户,及时安装Windows发布的安全更新。


对于Windows 2003及Windows XP的用户,及时更新系统版本。


临时危害减轻措施:开启网络身份验证(NLA)。请注意如果攻击者拥有合法的网络身份,依然可以绕过该身份验证,利用漏洞攻击目标主机。