Windows DHCP Server遠端程式碼執行漏洞分析(CVE-2019-0626)
作者:啟明星辰ADLab
公眾號: ADLab
1.漏洞背景
2月12日,微軟釋出2月份月度例行安全公告,修復了多個高危漏洞,其中包括Windows DHCP Server遠端程式碼執行漏洞CVE-2019-0626。當攻擊者向DHCP伺服器傳送精心設計的資料包併成功利用後,就可以在DHCP服務中執行任意程式碼,漏洞影響範圍較大。針對此漏洞,啟明星辰ADLab第一時間對其進行了詳細分析。
2.漏洞影響版本
- Windows 7
- Windows 8.1
- Windows 10
- Windows Server 2008
- Windows Server 2012
- Windows Server 2016
- Windows Server 2019
3.協議簡介
DHCP,動態主機配置協議,前身是BOOTP協議,是一個區域網的網路協議。DHCP通常用於集中管理分配IP地址,使client動態地獲得IP地址、Gateway地址、DNS 伺服器 地址等資訊。DHCP客戶端和DHCP服務端的互動過程如下圖所示。
傳輸的DHCP協議報文需遵循以下格式:
DHCP包含許多型別的Option,每個Option由Type、Length和Data三個欄位組成。
Type取值範圍1~255,部分Type型別如下圖所示。
DHCP服務在處理Vendor Specific 型別(Type=43)的Option結構存在安全漏洞。首先看下DHCP服務程式對Option的處理過程, ProcessMessage函式負責處理收到的DHCP報文,呼叫ExtractOptions函式處理DHCP的Option欄位,傳入函式ExtractOptions的引數1(v7)為DHCP報文指標,引數 3(*(unsigned int *)(v5 + 16))
對應指標偏移位置+16的資料,即Len欄位。
……
ExtractOption函式如下所示。 v6 = (unsigned __int64)&a1[a3 - 1];
指向報文末尾位置;v10=a1+240;指向報文中Option結構。在for迴圈中處理不同型別的Option結構,當 type=43(Vendor Specific Information)
,傳入指標v10和指標v6作為引數,呼叫ParseVendorSpecific函式進行處理。
……
……
……
ParseVendorSpecific函式內部呼叫UncodeOption函式。UncodeOption函式引數a1指向option起始位置,a2指向報文的末尾位置。UncodeOption函式存在安全漏洞,下面結合POC和補丁比對進行分析。
4.漏洞分析
構造一個DHCP Discovery報文,POC如下所示,POC包含兩個 vendor_specific
型別的Option結構。 vendor_specific1
是合法的Option結構,Length取值0x0a等於Data的實際長度(0x0a), vendor_specific2
是不合法的Option結構, Length取值0x0f大於Data的實際長度(0x0a)。
(1)DHCP伺服器收到Discovery請求報文,對資料包進行處理。首先執行ExtractOptions處理Options,當處理 vendor_specific
型別的Option時,進入到ParseVendorSpecific進行處理。POC中構造一個合法的 vendor_specific1
,目的是為了繞過84~85行的校驗程式碼,使程式順利執行到ParseVendorSpecific函式。
(2)ParseVendorSpecific呼叫UncodeOption函式。
-
32~43行在do-while迴圈中計算Option結構的 Length值之和,儲存到v13,作為分配堆記憶體長度。POC中包含兩個
vendor_specific
結構,首先處理vendor_specific1,計算v13,即vendor_specific1
長度a,並且使v12指向下一個Option結構vendor_specific2
,當進入43行while條件判斷,由於vendor_specific2
長度不合法,do-while迴圈結束。 -
48行呼叫HeapAlloc分配堆記憶體,分配的記憶體大小v13=a。
-
51~58行在for迴圈中依次將
vendor_specific
結構中的Data拷貝到分配的堆記憶體中。進入第一次迴圈時,v1指向vendor_specific1
,v8指向末尾位置,滿足條件v1<v8,55行呼叫memcpy將vendor_specific1
的Data欄位拷貝到分配的堆記憶體,拷貝長度Length=a。進入第二次迴圈,v1指向vendor_specific2
,v8指向末尾位置,仍然滿足條件v1<v8,再次呼叫memcpy將vendor_specific2
的Data欄位拷貝到分配的堆記憶體,拷貝長度Length=0xf。由於分配的堆記憶體大小隻有a個位元組,而拷貝的總長度=0x0a+0x0f,從而導致堆溢位。
5.補丁比對
補丁後的版本添加了對Length欄位的有效性判斷。
6.安全建議
及時安裝安全補丁: https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0626
啟明星辰積極防禦實驗室(ADLab)
ADLab成立於1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員。截止目前,ADLab通過CVE釋出Windows、Linux、Unix等作業系統安全或軟體漏洞近400個,持續保持國際網路安全領域一流水準。實驗室研究方向涵蓋作業系統與應用系統安全研究、移動智慧終端安全研究、物聯網智慧裝置安全研究、Web安全研究、工控系統安全研究、雲安全研究。研究成果應用於產品核心技術研究、國家重點科技專案攻關、專業安全服務等。