歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Windows Error Reporting 0day漏洞分析(CVE-2019-0863)

來源:本站整理 作者:佚名 時間:2019-07-03 TAG: 我要投稿


 
0x00 前言
2018年12月,名為“SandboxEscaper”的一名黑客公開了Windows Error Reporting(WER,Windows錯誤報告)組件中的一個0day漏洞。深入分析這個漏洞后,我發現了另一個0day漏洞,該漏洞可以用來提升至系統權限。根據微軟的安全公告,攻擊者一直在實際環境中利用該漏洞發起攻擊,攻擊活動直到2019年5月份微軟推出安全補丁才暫告一段落。
本文將與大家分享這個漏洞的具體原理。
 
0x01 WER工作原理
Windows Error Reporting工具是基于事件的一種反饋架構,用來收集Windows能夠探測到的硬件以及軟件方面的問題,向微軟提交相關信息,并且可以為用戶提供可用的解決方案。
比如,如果Windows出現系統崩潰,那么就會生成錯誤報告,存放到WER報告隊列目錄中(C:\ProgramData\Microsoft\Windows\WER\ReportQueue),隊列中每個報告都有自己的子目錄以及唯一對應的Report.werINI文件(其中帶有相關元數據)。為了能讓所有進程都能報告錯誤信息,所有用戶都具備ReportQueue目錄的寫入權限,如下圖所示:

圖1. Windows Error Reporting隊列目錄
報告生成后,會被發送到微軟以便后續分析。這種交互行為可以通過多種方式來觸發,其中一種方式就是利用名為Windows Error Reporting\QueueReporting的計劃任務。從安全角度來看,這個任務比較有趣,主要有以下幾個因素:
該任務以SYSTEM權限運行,可參考任務對應的Security Options選項
該任務可按需觸發
該任務會以固定的命令行參數來運行一個專用的程序:wermgr.exe -upload

圖2. Windows Error Reporting計劃任務
wermgr.exe在執行后,會與掛起的報告文件以及目錄交互。程序會讀取并解析相關文件,將這些文件拷貝到其他目錄,有時候甚至會刪除文件。現在我們已經具有一個較高權限的組件,該組件能夠訪問任何用戶都具備寫入權限的文件。如果程序在邏輯實現過程中不夠嚴謹,那么這種操作將引入一些非常嚴重的安全問題。
 
0x02 濫用文件系統鏈接
Windows支持不同類型的文件系統鏈接,我們可以利用這些鏈接將文件以及目錄指向其他文件及目錄。一旦鏈接被系統掃描以及重新解析,就會將用戶重定向到目標路徑。從安全角度來看,這里最大的風險在于濫用硬鏈接(hard links)以及掛載點(mount point),因為用戶可以將這些組件鏈接到本來不具備寫入權限的目標文件或者目錄。
舉個例子,比如不具備kernel32.dll寫入權限的用戶可以創建c:\temp\Dir\x.dll以及C:\Windows\System32\kernel32.dll之間的硬鏈接。具備重定向到較高權限組件的能力一直都是黑客追求的目標,這樣就能讀取、寫入甚至刪除敏感的關鍵文件。

圖3. 硬鏈接至用戶不具備寫入權限的文件
 
0x03 漏洞分析
簡而言之,攻擊者可以利用WER來修改文件權限,利用前文提到的文件系統鏈接方式,將報告目錄中的文件鏈接至主機上的其他目標文件,以獲取對其他任意文件的讀取、寫入、編輯以及刪除權限。
更具體一點,整體漏洞利用場景如下:
wermger.exe逐一解析報告目錄中的所有文件,將這些文件提交給微軟
當wermger.exe檢測到損壞的Report.wer INI文件,就會刪除該文件。然而wermger.exe首先會修改該文件的DACL屬性,以便刪除該文件
wermger.exe在讀取文件DACL屬性以及添加刪除權限之間存在較小的一個時間窗口,攻擊者利用的正是這個時間窗口。如果攻擊者創建這類文件與系統上其他任意文件的一個鏈接,那么在讀取DACL之后,wermgr.exe會錯誤地修改其他文件的安全描述符。這是非常糟糕的場景。
具體利用原理可分為以下幾步。
步驟1:
wermgr.exe -upload執行的第一個操作就是調用wermgr!DoCoreUpload函數,該函數會列出ReportQueue下的所有子目錄,讀取錯誤報告并將報告提交給微軟:
int64 DoCoreUpload(/* ... */) {
    /* ... */
    Ret = WerpSubmitReportFromStore(ReportPath, /* ... */);
    if (Ret >= 0) {
        /* Report successfully uploaded */
    } else {
        if (Ret == ERROR_FILE_CORRUPT) {
            DeleteCorruptedReportFromStore(ReportPath);
        }
    }
}
步驟2:
當wermgr.exe遇到損壞的Report.wer INI文件時,會修改文件的DACL,以便后續執行刪除操作。更具體的細節為:
首先,wermgr!DeleteCorruptedReportFromStore會列出報告子目錄下的所有文件;
其次,wermgr!PreparePathForDeletion會修改每個文件的權限。這里正是核心bug所在的位置,因為該函數會使用kernel32!GetFileSecurity來讀取文件的安全描述符,然后調用kernel32!SetFileSecurity將刪除描述符應用于該文件。
int64 PreparePathForDeletion(wchar_t* FileName) {
    PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
    DWORD BytesRead = 0;
    PDACL Dacl = NULL;
    /* ... */

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺