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漏洞。





解決方案


目前啟明星辰已經發布了對應的產品級解決方案,相關鏈接為:http://www.shouzhi22.com/article/1/9148.html 。


對于Windows 7及Windows Server 2008的用戶,及時安裝Windows發布的安全更新。


對于Windows 2003及Windows XP的用戶,及時更新系統版本。


臨時危害減輕措施:開啟網絡身份驗證(NLA)。請注意如果攻擊者擁有合法的網絡身份,依然可以繞過該身份驗證,利用漏洞攻擊目標主機。