2018年5月15日,ESET披露了其捕獲的PDF文檔樣本中的兩枚0-day漏洞。其中CVE-2018-4990為Adobe PDF閱讀器的代碼執行漏洞,而CVE-2018-8120則是Windows操作系統Win32k的內核提權漏洞,在獲取代碼執行權限后通過內核提權漏洞繞過Adobe PDF閱讀器的沙盒保護,實現任意代碼執行。
360威脅情報中心在2018年5月25日已經發布了《CVE-2018-4990 Adobe Reader 代碼執行漏洞利用分析》(詳見參考資料[1]),而其中的內核提權漏洞雖然已經有公開的漏洞利用代碼,但僅僅是針對Windows 32位環境下的利用。由于大部分用戶機器已經是64位操作系統,所以泄露的利用代碼危害有限。而在近日,有安全研究人員在GitHub上上傳了針對Windows 7 64位環境下CVE-2018-8120的漏洞利用代碼,經驗證分析該漏洞利用代碼真實可用,考慮到漏洞相關的技術細節和驗證程序已經公開,所以此漏洞接下來極有可能被利用來執行大規模的攻擊。
漏洞分析
在本文中我們試圖通過公開的針對Windows 7 64位環境的內核提權POC對漏洞原理和利用過程進行詳細分析,并記錄整個分析過程。如有分析不當之處敬請諒解。
分析環境:分析和調試的過程將在 Windows 7 x64 為基礎的環境中進行
樣本來源:https://github.com/unamer/CVE-2018-8120
補丁比較
通過分析安全公告補丁程序可以知道,本次漏洞主要修復了系統中的win32k.sys內核模塊文件,我們將64位Windows 7中的win32k.sys文件與未打補丁的文件進行對比,發現本次針對 win32k.sys 的NtUserSetImeInfoEx函數做了以下修補:

可以明顯看到,補丁后的函數代碼在函數中增加了對窗口站對象tagWINDOWSTATION的成員域spklList的值是否為0的校驗,如果值為0則函數直接返回:
修補前的代碼:

修補后的代碼:

漏洞細節
根據以上對win32k.sys補丁前后改動的代碼對比可知,漏洞發生在函數NtUserSetImeInfoEx中。NtUserSetImeInfoEx 是操作系統提供的接口函數,用于將用戶進程定義的輸入法擴展信息對象設置在與當前進程關聯的窗口站中。
窗口站
窗口站是和當前進程和會話(session)相關聯的一個內核對象,它包含剪貼板(clipboard)、原子表、一個或多個桌面(desktop)對象等。窗口站 tagWINDOWSTATION 結構體的定義如下:

NtUserSetImeInfoEx執行過程分析
知道了補丁代碼修復的部分,我們來看下漏洞函數NtUserSetImeInfoEx的具體實現,此函數只有一個tagIMEINFOEX類型的參數:

整理后的漏洞函數執行過程分析如下:
l 函數先獲取當前的窗口站rpwinsta,并從rpwinsta指向的窗口站對象中獲取spklList成員

spklList 是指向關聯的鍵盤布局 tagKL 對象鏈表首節點的指針。鍵盤布局 tagKL 結構體的定義如下:

l 然后函數從首節點開始遍歷鍵盤布局對象鏈表,直到節點對象的pklNext成員指回到首節點對象為止。函數判斷每個被遍歷的節點對象的hkl成員是否與參數 ime_info_ex 指向的源輸入法擴展信息對象的hkl成員相等

l 接下來函數判斷目標鍵盤布局對象的piiex成員是否為空,且成員變量 fLoadFlag 值是否為 FALSE。如果是,則把參數 ime_info_ex 的數據拷貝到目標鍵盤布局對象的piiex成員中

函數的實現過程比較簡單,在這里我們可以清楚的看到分析過程的第2步中導致漏洞產生的原因:
在遍歷鍵盤布局對象鏈表 spklList 的時候并沒有判斷 spklList 地址是否為 NULL,假設此時 spklList 為空的話,接下來對 spklList 訪問的時候將觸發訪問異常,導致系統 BSOD 的發生。
POC驗證
我們使用PowerShell腳本來測試驗證該漏洞,以下PowerShell腳本使用CreateWindowStation創建了一個窗口站,并調用函數 SetProcessWindowStation 將創建的窗口站與當前進程關聯起來,然后打印出窗口站的HANDLE,最后調用 NtUserSetImeInfoEx 函數觸發漏洞
|