FineArt News

Windows 10 CIG 避免應用程式被注入

Code Integrity Guard (CIG) 程式碼完整性保護機制,簡單的說,是禁止程式載入未被授權的動態連結程式庫 (DLL) 和二進位檔案。

CIG 是從Windows 10和Windows Server 2016開始導入的一項程式碼保護機制,Microsoft的Edge瀏覽器即支援CIG,除此之外,一般的軟體公司也可以在自己的應用程式當中加入CIG機制。支援CIG的應用程式只能載入Microsoft和Windows Store簽署的動態連結程式庫 (DLL) 和二進位檔案,如此,就可以防止應用程式被注入駭客的程式碼。

雖然CIG提供了強有力的保證,應用程式載入的DLL,必須有合法的簽章,但駭客入侵的管道很多,手段千變萬化,CIG也不是萬能的,有很多種手段可以讓CIG也無法防護,所以Windows又有如AGC等方案,讓Windows Kernel通過強制手段,來防止應用程式在記憶體中直接被創建或是修改記憶體中的程式。

 

CIG 原理

駭客的程式碼如何注入應用程式

要瞭解CIG之前,就必須先瞭解駭客的程式碼,如何注入到應用程式中,下面例子,我們考慮由MyApp.EXE對WinWord.EXE進行注入MyHook.DLL,之後再進行API Hook。

這中間有一些問題要克服,首先是兩個程式都在不同記憶體空間,我們可以想像好像在不同的世界,因此要如何入侵另一個世界,就是首要的課題,通常可以簡單的使用Windows提供的DLL Hook,如:Mouse Hook、Keyboard Hook、CBT Hook…等達成;或是使用一些較高級的技術,例如:CreateProcess、CreateThread…等多種手法強迫將Hook程式(例如:MyHook.DLL)”注入”到其他程式的記憶體空間。

其次是,注入成功後,必須在被注入的程式中,找到宿主關鍵的API,並對這些API進行替換,有關這一系列的動作,可以參考精品科技之前發佈的一些文章。使用一個例子做說明:”MyAPP.EXE希望攔截 Office 的開檔動作”:

  • 見下圖❶,首先必須使用”注入”手段,分別一一入侵WINWORD.EXE及EXCEL.EXE等Office程式,在成功入侵後,會將MyHook.DLL放入被入侵程式的記憶體空間。
  • 見下圖❷,再進一步找出每個程式的"OpenFile” API,最後進行API的替代,完成API Hook。

CIG 破壞載入的流程

之前已提到過,CIG 會要求載入的動態連結程式庫 (DLL) 和二進位檔案,必須擁有Microsoft和Windows Store簽署的簽章,如果MyHook.DLL未被Microsoft簽署過,則無法被WINWORD.EXE及EXCEL.EXE等Office程式載入。

換句話說,在駭客注入應用程式的過程中,在上圖(1)的部份,就被打斷,所以駭客程式就無法載入MyHook.DLL。

 

Edge v.s. CIG

CIG原本是Windows Device Guard的一部分,後來變成Edge瀏覽器防止漏洞利用的重要功能,如前文所提,主要是阻止不受歡迎的代碼注入Edge

從 EdgeHTML 13 開始,Microsoft Edge 通過CIG阻止駭客將 DLL 注入瀏覽器,用來保護用戶的瀏覽不受駭客影響,只有通過Microsoft簽名或WHQL簽名的DLL將才能被允許載入Edge。 所以我們可以知道,最初,CIG僅應用於驅動程序驗證,後來它也作為Edge漏洞預防機制的一部分,之後CIG的應用就不止驅動程序,並擴大到用戶模式程式。

應用在Edge的好處是它阻止了不需要的軟體載入,例如廣告軟體、惡意軟體,這些軟體都會將程式代碼注入Edge,之後即可以重新導向網址或竊取信息。如果沒有CIG,隨意的讓其他程式遠端注入Edge,會導致Edge的不穩定,並且可能使瀏覽器崩潰,此外還可能被竊取信息。

在最新的 Windows 10 版本中,除了Edge外,如:svchost和dllhost等都被CIG保護。