背景概述
近日,深信服安全團隊追蹤一則Windows 10 condrv.sys存在記憶體損壞漏洞的資訊,漏洞等級為高危。該漏洞是由於Windows 10中condrv裝置不正確的設定導致異常。
攻擊者可利用該漏洞,透過在瀏覽器的位址列中開啟特定路徑或構造惡意快捷方式進行釣魚攻擊,最終導致Windows 10藍色畫面崩潰。
該漏洞當前暫無官方解決方案,深信服EDR輕補丁功能第一時間支援免疫該漏洞,EDR使用者可升級至V3.2.33版本,開啟輕補丁漏洞免疫功能進行一鍵防護。
漏洞分析
除錯檢視漏洞堆疊:
從堆疊可以看出當開啟此路徑的時候,進入核心的物件管理器依次解析物件目錄,直到解析到\device\condrv發現這是個裝置物件,且裝置物件型別是有ParseProcedure例程的。
故呼叫裝置物件的ParseProcedure,即函式IopPraseDevice。函式內部在處理完請求時嘗試去關閉這個檔案物件,如下圖:
關閉檔案物件就會對相應的驅動傳送IRP_MJ_CLEANUP IRP,驅動為condrv.sys。
藍色畫面的直接原因如下:
即從IRP中獲取檔案物件FILE_OBJECT,然後獲取FILE_OBJECT的FCB即FsContext成員。但此時FsContext為NULL,所以就導致了空指標引用的問題。
根因分析
我們可以認為這個檔案物件是“非法”的, 那麼可能從建立初始化的時候就可能出現問題。
對核心有了解的應該知道,如果要引用裝置物件那麼必然會對裝置物件所在的驅動傳送IRP_MJ_CREATE。我們找到condrv.sys 使用IDA載入,檢視反彙編如下:
它會迴圈比較檔名是不是預定義的幾個,如果是,則呼叫預定義的建立回撥函式,如下:
Poc裡面開啟的是kernlcontect所以IRP_MJ_CREATE最終會呼叫函式CdCreateKernelConnection, 檢視該函式如下:
第一個判斷是如果先前模式是usermode則返回0xc000022,即拒絕訪問;也就是設計之初核心是不允許使用者直接使用這個符號連結的。
但是問題出就出在這個直接返回拒絕,因為這是在處理IRP。它沒有設定IRP的狀態碼以及呼叫IoCompleteRequest結束IRP。導致當IRP返回時,其IoStatus.Status為0。(0表示成功)
而在函式IopPraseDevice中是以IoStatus.Status為準,所以IopPraseDevice 錯誤的認為IoCalldriver是成功的,進而引發後續錯誤地關閉檔案物件從而導致藍色畫面。手動測試修改IoStatus.Status為失敗值,藍色畫面消失。
總結
透過詳細的根因分析可以得到漏洞的成因,是由於condrv的驅動開發人員在處理IRP例程的時候,沒有正確處理IRP,對失敗情況忘記設定狀態碼,從而導致系統崩潰。
影響範圍
目前受影響的作業系統版本:Windows 10
官方解決方案
產品當前官方暫未釋出受影響版本的對應補丁,建議受影響的使用者及時關注更新官方的安全補丁(及時更新升級到最新版本)。連結如下:
https://www.microsoft.com/zh-cn/software-download/windows10
產品解決方案
目前深信服EDR輕補丁已支援防護該漏洞,無需重啟,一鍵防護: