攻擊防護可為應用程式提供進階防護,讓企業系統管理員與 IT 專業人員能在開發人員編譯並發佈軟體後加以套用。
本文將協助你了解漏洞防護的運作方式,無論是在政策層級還是個別緩解層級,幫助你成功建立並套用漏洞防護政策。
如何套用風險降低措施
針對每個應用程式會施加漏洞防護緩解措施。
每個計畫都有自己的登錄系統,負責控制適用哪些緩解措施。 這些設定會儲存在 MitigationOptions 登錄檔項目(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\*ImageFileName*\MitigationOptions)。 這些緩解設定會在你重新啟動程式時生效。 它們會一直有效,直到你更改並重新啟動程式。
重要事項
影像檔案執行選項只能指定檔名或路徑。 你無法指定版本號、架構或其他差異化。 針對有獨特名稱或路徑的應用程式進行緩解。 僅應在已測試過該應用程式版本與架構的裝置上套用它們。
你可以透過 XML 檔案,使用 PowerShell、群組政策或 MDM 來設定緩解措施。 當你使用 XML 檔案時,系統會幫你設定登錄檔的條目。
重置漏洞防護
重要事項
當部署 XML 檔案的群組原則或 MDM 政策不再被強制執行時,由該 XML 設定檔部署的設定不會自動移除。
要移除漏洞防護設定,請從乾淨的 Windows 10 或 Windows 11 裝置匯出 XML 設定,並部署此新 XML 檔案。 另外,Microsoft 也提供 XML 檔案作為 Windows 安全性 Baselines 的一部分,用於重置漏洞防護設定。
要使用 PowerShell 重設漏洞防護設定,請執行以下指令,從 XML 檔案套用重置政策,並將緩解設定恢復到預設:
Set-ProcessMitigation -PolicyFilePath EP-reset.xml
以下 XML 檔案為隨 Windows 安全性 基線一同發佈的 EP-reset.xml。 此檔案定義了針對常見應用程式(如 Microsoft Office、網頁瀏覽器及媒體播放器)的每個應用程式的緩解覆寫,將漏洞防護設定重設為預設值:
<?xml version="1.0" encoding="UTF-8"?>
<MitigationPolicy>
<AppConfig Executable="ONEDRIVE.EXE">
<DEP OverrideDEP="false" />
<ASLR OverrideRelocateImages="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
<ImageLoad OverrideBlockRemoteImages="false" />
</AppConfig>
<AppConfig Executable="firefox.exe">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
</AppConfig>
<AppConfig Executable="fltldr.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
<ImageLoad OverrideBlockRemoteImages="false" />
<ChildProcess OverrideChildProcess="false" />
</AppConfig>
<AppConfig Executable="GROOVE.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
<ImageLoad OverrideBlockRemoteImages="false" />
<ChildProcess OverrideChildProcess="false" />
</AppConfig>
<AppConfig Executable="Acrobat.exe">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="AcroRd32.exe">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="chrome.exe">
<DEP OverrideDEP="false" />
</AppConfig>
<AppConfig Executable="EXCEL.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="iexplore.exe">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="INFOPATH.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="java.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="javaw.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="javaws.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="LYNC.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="MSACCESS.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="MSPUB.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="OIS.EXE">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="OUTLOOK.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="plugin-container.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="POWERPNT.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="PPTVIEW.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="VISIO.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="VPREVIEW.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="WINWORD.EXE">
<DEP OverrideDEP="false" />
<ASLR ForceRelocateImages="true" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="wmplayer.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
<AppConfig Executable="wordpad.exe">
<DEP OverrideDEP="false" />
<Payload OverrideEnableExportAddressFilter="false" OverrideEnableExportAddressFilterPlus="false" OverrideEnableImportAddressFilter="false" OverrideEnableRopStackPivot="false" OverrideEnableRopCallerCheck="false" OverrideEnableRopSimExec="false" />
</AppConfig>
</MitigationPolicy>
風險降低措施參考
以下的漏洞防護緩解措施各包含說明、相容性考量及設定選項。
任意程式碼防護機制
以下章節將說明任意 Code Guard 的運作方式、其相容性影響及設定選項。
描述
任意程式碼防護可協助防止惡意攻擊者透過記憶體安全性弱點,將其選擇的程式碼載入記憶體,並能夠執行該程式碼。
任意程式碼守護可防止應用程式執行動態產生的程式碼(也就是未由例如 EXE 本身或 DLL 載入的程式碼)。 任意程式碼防護會防止將記憶體標示為可執行檔來運作。 當應用程式嘗試配置記憶體時,我們會檢查保護旗標。 (記憶體可以使用讀取、寫入和/或執行保護旗標來配置。如果配置嘗試包含執行保護旗標,則記憶體配置會失敗並返回錯誤碼 (STATUS_DYNAMIC_CODE_BLOCKED)。 同樣地,如果應用程式嘗試變更已配置且包含執行保護旗標的記憶體保護旗標,則權限變更會失敗並返回錯誤碼 (STATUS_DYNAMIC_CODE_BLOCKED)。
如果防止設定執行旗標,Windows 10 和 Windows 11 的資料執行防護功能就可以防範設定至該記憶體並執行該程式碼的指令指標。
相容性考量
任意程式碼防護會防止將任何記憶體配置為可執行檔,這表示 Just-in-Time (JIT) 編譯器等方法發生相容性問題。 例如,大多數現代瀏覽器會將 JavaScript 編譯成原生程式碼以優化效能。 為了支援此緩解措施,必須重新架構,將 JIT 編譯移出受保護的程序範圍。 其他設計以腳本或其他中介語言動態產生程式碼的應用程式,也同樣與此緩解措施不相容。
設定選項
允許執行緒退出 - 您可以設定風險降低措施,讓個別執行緒退出此保護。 開發者必須在具備此緩解措施的前提下撰寫應用程式,並呼叫 SetThreadInformation API 並將 ThreadInformation 參數設為 ThreadDynamicCodePolicy ,才能允許在此執行緒上執行動態程式碼。
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 之後,您可以在事件檢視器中檢視稽核事件,或使用 適用於端點的 Defender 中的進階搜捕來檢視這些事件。
封鎖低完整性映像
以下章節將說明區塊低完整性影像的運作方式、其相容性影響及設定選項。
描述
阻擋低完整性的映像檔可防止應用程式載入不信任的檔案,通常是因為這些檔案是從沙盒瀏覽器從網路下載的。
此緩解措施會阻止映像檔載入,若該映像有存取控制條目 (ACE) ,該條目允許存取低 IL 程序且沒有信任標籤 ACE。 它是由記憶體管理器實作,阻止檔案被映射到記憶體。 若應用程式嘗試映射低完整性的映像檔,會觸發STATUS_ACCESS_DENIED錯誤。 有關完整性層級如何運作的詳細資訊,請參閱強制完整性控制。
相容性考量
阻擋低完整性映像會阻止應用程式載入從網路下載的檔案。 如果你的應用程式工作流程需要載入已下載的映像檔,你要確保這些映像是從更高信任度的程序下載,或明確重新標註以套用此緩解措施。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
封鎖遠端映像
以下章節將說明區塊遠端影像的運作方式、相容性影響及設定選項。
描述
封鎖遠端映像可協助防止應用程式載入裝載在遠端裝置上的檔案,例如 UNC 共用。 封鎖遠端映像可協助防止將二進位檔載入被攻擊者控制之外部裝置的記憶體。
此緩解措施會在判定該圖片位於遠端裝置上時,阻止其載入。 它是由記憶體管理器實作,阻止檔案被映射到記憶體。 如果應用程式嘗試映射遠端檔案,會觸發STATUS_ACCESS_DENIED錯誤。
相容性考量
封鎖遠端映像會阻止應用程式從遠端裝置載入影像。 如果您的應用程式從遠端裝置載入檔案或外掛程式,則它將與此風險降低措施不相容。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
封鎖不信任的字型
以下章節將說明阻擋不受信任字型的運作方式、其相容性影響及設定選項。
描述
封鎖不受信任的字型可減輕字型剖析錯誤的風險,導致攻擊者能夠在裝置上執行程式碼。 只有安裝在 windows\fonts 目錄中的字型會載入 GDI 進行處理。
此風險降低措施是在 GDI 內實作,可驗證檔案的位置。 如果檔案不在系統字型目錄中,字型無法載入進行解析,呼叫也會失敗。
除了 Windows 10 1607 及更新版本和 Windows 11 中提供的內建風險降低措施之外,此風險降低措施會將字型剖析從核心移至使用者模式應用程式容器。 因此,任何基於字型解析的利用程式都會在經過沙箱化且隔離的環境中執行,從而大幅降低風險。
相容性考量
系統字型目錄外最常見的字型使用是使用 網頁字型。 現代瀏覽器如 Microsoft Edge 使用 DirectWrite 而非 GDI,且不受影響。 不過,舊版瀏覽器,例如 Internet Explorer 11 (以及新 Microsoft Edge 中的 IE 模式),可能會受到影響,尤其是使用字型字元來顯示 UI 的應用程式 (例如 Office 365)。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
程式碼完整性防護
以下章節將說明程式碼完整性守護的運作方式、相容性影響及設定選項。
描述
程式碼完整性防護可確保載入至處理序的所有二進位檔都由 Microsoft 進行數位簽章。 程式碼完整性守護包含 WHQL (Windows 硬體品質實驗室(Windows Hardware Quality Labs)) 簽名,允許 WHQL 核准的驅動程式在流程中執行。
此緩解措施是在記憶體管理員中實作的,會阻止二進位檔被對應至記憶體。 如果你嘗試載入一個沒有Microsoft簽名的二進位檔,記憶體管理器會回傳錯誤STATUS_INVALID_IMAGE_HASH。 在記憶體管理員層級封鎖,可防止由處理序載入的二進位檔和插入至處理序的二進位檔。
相容性考量
這項緩解措施特別封鎖了任何非 Microsoft 簽名的二進位檔。 因此,除非該軟體是由 Microsoft Store 發佈(並以數位方式簽署),且已選取允許載入由 Microsoft Store 簽署之映像的選項,否則它與大多數非 Microsoft 軟體不相容。
設定選項
同時允許載入由 Microsoft Store 簽署的映像 檔——由 Microsoft Store 發佈的應用程式會由 Microsoft Store 數位簽章,新增此配置後,應用程式可載入經過 Store 認證流程的二進位檔。
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
控制流量防護 (CFG)
以下章節將說明控制流程守護的運作方式、相容性影響及配置選項。
描述
控制流程防護 (CFG) 可保護間接函數呼叫,降低攻擊者使用記憶體損壞弱點的風險。 例如,攻擊者可能會利用緩衝區溢位漏洞,覆寫包含函式指標的記憶體,並將該函式指標改寫為指向其所選可執行程式碼的指標,而該程式碼也可能被注入程式中。
此緩解措施是透過在編譯時插入另一個檢查來實現的。 在每次間接函式呼叫前,會加入另一條指令,驗證目標是否為有效的呼叫目標,然後再被呼叫。 如果目標不是有效的呼叫目標,應用程式就會被終止。 因此,只有使用支援 CFG 編譯的應用程式才能從此風險降低措施中受益。
有效目標檢查由 Windows 核心執行。 載入可執行檔時,會擷取間接呼叫目標的中繼資料,並標示為有效的呼叫目標。 此外,當配置記憶體並標示為可執行檔 (例如產生的程式碼) 時,這些記憶體位置也會標示為有效的呼叫目標,以支援 JIT 編譯等機制。
相容性考量
由於應用程式必須編譯以支援 CFG,因此它們隱含地宣告其與 CFG 的相容性。 因此,大部分的應用程式應該能在啟用此風險降低措施的情況下運作。 因為這些檢查編譯成二進位檔,您可以套用的設定,只是停用 Windows 核心內的檢查。 換句話說,此緩解措施預設為啟用,但如果您之後判定確實存在相容性問題,而且該問題是應用程式開發人員在測試時未發現的,您可以將 Windows 核心設定為一律回傳「是」;這種情況應屬罕見。
設定選項
使用嚴格 CFG - 在嚴格模式中,載入至處理序的所有二進位檔必須針對控制流程防護進行編譯 (或其中沒有可執行程式碼 ,例如資源 dll),才能載入。
注意事項
控制流程防護 沒有稽核模式。 二進位檔會在啟用此風險降低措施的情況下進行編譯。
資料執行防護 (DEP)
以下章節說明資料執行預防的運作方式、相容性影響及設定選項。
描述
資料執行防止 (DEP) 防止未明確分配為可執行檔的記憶體被執行。 DEP 可協助防止攻擊者將惡意程式碼插入處理序,例如透過緩衝區溢位,然後執行該程式碼。
如果你嘗試將指令指標設定到未標記為可執行的記憶體位址,處理器會拋出一個 (一般保護違規) 異常,導致應用程式當機。
相容性考量
所有 x64、ARM 和 Arm64 執行檔預設都啟用了 DEP,且無法關閉。 由於應用程式不會在沒有 DEP 的情況下執行,因此假設相容性。
所有 x86 (32 位元) 二進位檔預設都已啟用 DEP,但每個處理序都可以停用 DEP。 一些舊有的舊有應用程式,通常是在 Windows XP SP2 之前開發的應用程式,可能不相容於 DEP。 這類應用程式通常會動態產生程式碼 (例如 JIT 編譯),或連結至較舊的程式庫 (例如舊版 ATL),以動態產生程式碼。
設定選項
啟用 ATL Thunk 模擬 - 此選項控制 ATL Thunk 模擬。 ATL 是 ActiveX 範本庫,設計成盡可能小且快速。 為了減少二進位大小,它使用一種稱為 「thunking」的技術。 Thunking 通常與 32 位元和 16 位元之間的互通有關,但 ATL 不含任何 16 位元元件。 為了節省空間,ATL 將機器碼儲存在非字對齊的記憶體中。 這會產生較小的二進位檔。 ATL 接著直接執行該程式碼。 使用 Visual Studio 7.1 或更早版本(Visual Studio 2003)編譯的 ATL 版本,不會將此記憶體標記為可執行檔。 Thunk 模擬解決了這個問題。 採用二進位擴充模型的應用程式(例如 Internet Explorer 11)需要啟用 ATL Thunk 模擬。
停用擴充點
以下章節將說明停用擴充點緩解措施的運作方式、其相容性影響及設定選項。
描述
停用擴充點緩解措施會停用應用程式的各種擴充點,這些擴充點可能用於建立持久性或提升惡意內容的權限。
這包括:
- AppInit DLL - 每當程序啟動時,系統會將指定的 DLL 載入新啟動程序的上下文,然後呼叫其入口點函式。 您可以在此找到 AppInit DLL 的詳細資訊。 有了這個緩解措施,AppInit 的 DLL 就不會被載入。 從 Windows 7 開始,AppInit DLL 需要數位簽章,如這裡所述。 此外,從 Windows 8 開始,若啟用 SecureBoot,AppInit DLL 將不會被載入,詳情如下所述。
- 舊版 IME - 輸入法編輯器 (IME) 可讓使用者輸入其字元數量超出鍵盤可表示範圍的語言文字。 協力廠商可以建立 IIM。 惡意輸入法可能會從這次輸入擷取中取得認證資訊或其他敏感資訊。 有些 IME,稱為 Legacy IME,只適用於 Windows 桌面應用程式,不適用於 UWP 應用程式。 此緩解措施也防止該舊有 IME 載入指定的 Windows 桌面應用程式。
- Windows 事件勾點 - 應用程式可以呼叫 SetWinEventHook API,註冊對正在發生事件的興趣。 已指定 DLL,且可將其注入處理序中。 此風險降低措施會強制將勾點張貼到註冊處理序,而不是透過插入的 DLL 在處理序中執行。
相容性考量
這些延伸點大多使用頻率較低,因此相容性影響通常較小,尤其是在個別應用層級。 唯一要考慮的是,如果使用者使用非 Microsoft 的 Legacy IME,這些 IME 無法與受保護的應用程式相容。
設定選項
此緩解措施沒有可供設定的選項。
注意事項
停用擴充點 沒有稽核模式。
停用 Win32k 系統呼叫
以下章節說明停用 Windows 32k 系統呼叫緩解機制的運作方式、其相容性影響及設定選項。
描述
Win32k.sys 為攻擊者提供廣泛的受攻擊面。 作為核心模式元件,它經常被用作沙盒應用程式的逃逸向量。 此緩解措施會藉由防止執行緒將自身轉換為 GUI 執行緒,來避免對 win32k.sys 的呼叫;因為一旦轉換完成,該執行緒便會取得呼叫 Win32k 函數的存取權。 執行緒在建立時不是 GUI,但在第一次呼叫 win32k.sys 時轉換,或透過 API 呼叫 IsGuiThread。
相容性考量
此風險降低措施專為專用的非 UI 處理序所設計。 例如,許多現代瀏覽器採用程序隔離並整合非使用者介面程序。 任何使用單一程序顯示圖形介面的應用程式都會受到此緩解措施的影響。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
不要允許子處理程序
以下章節將說明不允許子程序緩解的運作方式、其相容性影響,以及設定選項。
描述
「不允許子程序」的緩解措施會防止應用程式建立新的子應用程式。 攻擊者常用的技巧是在裝置上使用惡意輸入 (「離地」攻擊) 來啟動受信任的處理序,這通常需要在裝置上啟動另一個應用程式。 如果某個應用程式沒有任何正當理由會啟動子處理序,則此緩解措施可減輕該潛在攻擊途徑所帶來的風險。 透過在處理序權杖上設定屬性來套用此緩解措施,會阻止為子處理序建立權杖,並傳回錯誤訊息 STATUS_CHILD_PROCESS_BLOCKED。
相容性考量
若您的應用程式因任何原因啟動子應用程式,例如支援啟動瀏覽器或外部瀏覽器的超連結,或啟動電腦上的其他工具,若使用此緩解措施,此功能即失效。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
匯出位址篩選
以下章節將說明匯出地址過濾的運作方式、其相容性影響及設定選項。
描述
匯出位址篩選 (EAF) 可減輕惡意程式碼查看所有已載入模組的匯出位址表格,尋找包含對其攻擊有用 API 之模組的風險。 這是 shellcode 常用的策略。 為了降低這類攻擊的風險,此風險降低措施可保護三個經常受攻擊的模組:
- ntdll.dll
- kernelbase.dll
- kernel32.dll
風險降低措施可保護匯出目錄中指向匯出位址表的記憶體頁面。 此記憶體頁面已套用 PAGE_GUARD 保護。 當有人試圖存取此記憶體時,會產生 STATUS_GUARD_PAGE_VIOLATION。 緩解措施會處理此例外,若存取指令未通過驗證,程序即終止。
相容性考量
此緩解措施主要會對偵錯工具、沙箱化應用程式、使用 DRM 的應用程式,或實作反偵錯技術的應用程式造成影響。
設定選項
驗證對經常遭漏洞利用程式濫用之模組的存取權 - 此選項(也稱為 EAF+)會為其他經常遭受攻擊的模組提供保護:
mshtml.dllflash*.ocxjscript*.ocxvbscript.dllvgx.dllmozjs.dllxul.dllacrord32.dllacrofx32.dllacroform.api
此外,啟用 EAF+ 後,此緩解措施會對包含「MZ」標頭的頁面新增 PAGE_GUARD 保護;「MZ」標頭是 PE 檔案中 DOS 標頭的前 2 個位元組。這屬於已知記憶體內容的一種特徵,shellcode 可藉此識別記憶體中可能值得關注的模組。
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
強制執行映像隨機化(強制 ASLR)
以下章節說明強制ASLR的運作方式、相容性影響及設定選項。
描述
位址空間配置隨機化 (ASLR) 可減輕攻擊者使用系統記憶體配置的知識,以執行已存在處理序記憶體中且已標示為可執行檔程式碼的風險。 這可降低攻擊者使用 return-to-libc 攻擊等技術的風險;在這類攻擊中,攻擊者會先設定執行脈絡,然後修改返回位址,以利用符合其目的的脈絡來執行既有程式碼。
強制 ASLR 會強制該處理序中的所有 DLL 重新定位基底位址。 開發人員可以使用 /DYNAMICBASE 連結器選項啟用 ASLR,而此風險降低措施有相同的效果。
當記憶體管理器將映像檔映射到程序時,強制 ASLR 會強制重新基准尚未選擇使用 ASLR 的 DLL 和 EXEs。 但請注意,這種重新定基底不具熵,因此可以放置在記憶體中可預測的位置。 對於經過重新定址且位置隨機化的二進位檔,此緩解措施應與隨機化記憶體配置(由下而上的 ASLR)搭配使用。
相容性考量
ASLR 的這種相容性影響通常僅限於較舊的應用程式,這些程式是使用會對二進位檔基底位址作出假設的編譯器所建置,或已移除基底重定位資訊。 當執行流程嘗試跳到預期而非記憶體中的實際位置時,這可能會導致無法預測的錯誤。
設定選項
不允許移除影像 — 此選項會阻止載入已移除搬遷資訊的影像。 Windows PE 檔案格式包含絕對位址,而編譯器也會產生一個[基底重定位表,讓載入器可用來找出所有相對記憶體參照及其位移,以便在二進位檔未載入於其偏好基底位址時加以更新。 有些較舊的應用程式會在生產版本中剔除這些資訊,因此這些二進位檔無法重新基底。 此風險降低措施會阻止載入這類二進位檔 (而不是允許以偏好的基底位址載入)。
注意事項
強制執行映像隨機化 (強制 ASLR) 沒有稽核模式。
硬體強制堆疊保護
描述
硬體強制堆疊保護提供強大的防範ROP漏洞。 它的運作方式是記錄程式的預期執行流程。 為了支持順利採用與應用程式相容性,Windows 提供此保護,採用選擇加入模式。 開發者可以依自己的步調啟用此功能。
相容性考量
硬體強制堆疊保護僅適用於支援硬體影子堆疊的晶片組、Intel 的控制流強制技術 (CET) 或 AMD 影子堆疊。
如果您執行的是以 .NET Framework 為基礎的應用程式,硬體強制執行的堆疊保護可搭配 .NET Framework 7(需選擇啟用)或更新版本使用。 如果你用舊版本,可能會遇到當機或高 CPU 使用率的問題。 這些問題也可能發生在稽核模式或僅針對相容模組時。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 之後,您可以在事件檢視器中檢視稽核事件,或使用 適用於端點的 Defender 中的進階搜捕來檢視這些事件。
強制適用於所有模組而非相容模組 ——你可以啟用此緩解措施,讓強制適用於所有模組,而非相容模組。
匯入位址篩選 (IAF)
描述
匯入位址篩選 (IAF) 風險降低措施可協助降低攻擊者變更應用程式控制流程的風險,方法為修改匯入位址表 (IAT),以重新導向至攻擊者在呼叫該功能時選擇的任意程式碼。 攻擊者可能會使用這個方法來劫持控制,或攔截、檢查和可能封鎖對敏感性 API 的呼叫。
所有受保護 API 的記憶體頁面都套用了 PAGE_GUARD 保護。 當有人試圖存取此記憶體時,會產生 STATUS_GUARD_PAGE_VIOLATION。 緩解措施會處理此例外,若存取指令未通過驗證,程序即終止。
此風險降低措施可保護下列 Windows API:
GetProcAddressGetProcAddressForCallerLoadLibraryALoadLibraryExALoadLibraryWLoadLibraryExWLdrGetProcedureAddressLdrGetProcedureAddressExLdrGetProcedureAddressForCallerLdrLoadDllVirtualProtectVirtualProtectExVirtualAllocVirtualAllocExNtAllocateVirtualMemoryNtProtectVirtualMemoryCreateProcessACreateProcessWWinExecCreateProcessAsUserACreateProcessAsUserWGetModuleHandleAGetModuleHandleWRtlDecodePointerDecodePointer
相容性考量
執行 API 攔截的合法應用程式可能會被此緩解措施偵測到,導致部分應用程式當機。 範例包括安全性軟體和應用程式相容性填充碼。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
隨機化記憶體分配 (由下而上的 ASLR)
描述
隨機記憶體配置 (由下而上 ASLR) 會將 Entropy 新增至重新配置,因此其位置是隨機的,因此較無法預測。 此緩解措施必須啟用 Mandatory ASLR 才會生效。
32 位元位址空間的大小對可新增的 Entropy 提出實際限制,因此 64 位元應用程式讓攻擊者更難猜測記憶體中的位置。
相容性考量
大多數可搭配強制 ASLR(重新定址)運作的應用程式,也可搭配自下而上的 ASLR 運作。 有些應用程式如果把本地指標存成 32 位元變數,可能會有指標截斷的問題。 這些應用程式預期基底位址低於 4 GB,因此無法支援高熵選項。 如果需要,你可以關閉高熵。
設定選項
不要使用高熵 - 此選項會停用高熵 ASLR,這會在 64 位元應用程式由下而上的配置中增加 24 位元的熵(1 TB 的變動範圍)。
注意事項
隨機記憶體配置 (由下而上 ASLR) 沒有稽核模式。
模擬執行 (SimExec)
描述
模擬執行 (SimExec) 是 32 位元應用程式的風險降低措施。 這有助於驗證對敏感 API 的呼叫是否會返回至合法的呼叫端函式。 它會透過攔截對敏感性 API 的呼叫,然後透過瀏覽尋找 RET 指令 (應會返回呼叫者) 的編碼組合語言指令來模擬這些 API 的執行。 然後它會檢查該函數,並往回在記憶體中向後移動,以尋找上述 CALL 指令,以判斷函數與 CALL 指令是否相符,以及 RET 是否尚未被攔截。
此風險降低措施攔截的 API 為:
LoadLibraryALoadLibraryWLoadLibraryExALoadLibraryExWLdrLoadDllVirtualAllocVirtualAllocExNtAllocateVirtualMemoryVirtualProtectVirtualProtectExNtProtectVirtualMemoryHeapCreateRtlCreateHeapCreateProcessACreateProcessWCreateProcessInternalACreateProcessInternalWNtCreateUserProcessNtCreateProcessNtCreateProcessExCreateRemoteThreadCreateRemoteThreadExNtCreateThreadExWriteProcessMemoryNtWriteVirtualMemoryWinExecCreateFileMappingACreateFileMappingWCreateFileMappingNumaWNtCreateSectionMapViewOfFileMapViewOfFileExMapViewOfFileFromAppLdrGetProcedureAddressForCaller
如果偵測到 ROP 小工具,則處理序會終止。
相容性考量
執行 API 攔截的應用程式 (尤其是安全性軟體) 可能會造成此風險降低措施的相容性問題。
此風險降低措施與任意程式碼防護風險降低措施不相容。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
驗證 API 呼叫 (CallerCheck)
描述
API 呼叫驗證 (CallerCheck) 是一種用來緩解返回導向程式設計 (ROP) 技術的措施,用於驗證敏感 API 是否由有效的呼叫者所呼叫。 此緩解措施會檢查傳入的返回位址,然後以啟發式方式向後反組譯,尋找位於返回位址之前的呼叫指令,以判斷該呼叫的目標是否與傳入函式的參數相符。
此風險降低措施攔截的 API 為:
LoadLibraryALoadLibraryWLoadLibraryExALoadLibraryExWLdrLoadDllVirtualAllocVirtualAllocExNtAllocateVirtualMemoryVirtualProtectVirtualProtectExNtProtectVirtualMemoryHeapCreateRtlCreateHeapCreateProcessACreateProcessWCreateProcessInternalACreateProcessInternalWNtCreateUserProcessNtCreateProcessNtCreateProcessExCreateRemoteThreadCreateRemoteThreadExNtCreateThreadExWriteProcessMemoryNtWriteVirtualMemoryWinExecCreateFileMappingACreateFileMappingWCreateFileMappingNumaWNtCreateSectionMapViewOfFileMapViewOfFileExMapViewOfFileFromAppLdrGetProcedureAddressForCaller
如果偵測到 ROP 小工具,則處理序會終止。
相容性考量
執行 API 攔截的應用程式 (尤其是安全性軟體) 可能會造成此風險降低措施的相容性問題。
此風險降低措施與任意程式碼防護風險降低措施不相容。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
驗證例外處理鏈 (SEHOP)
描述
驗證例外狀況鏈結 (SEHOP) 是一種用來緩解 結構化例外狀況處理常式 (SEH) 覆寫 漏洞利用技術的措施。 結構化例外狀況處理是應用程式可要求處理特定例外狀況的處理序。 例外處理常式會鏈結在一起,因此,如果一個例外處理常式選擇不處理特定例外狀況,可以將它傳遞至鏈中的下一個例外處理常式,直到有一個例外處理常式決定處理它。 因為處理常式清單是動態的,所以會儲存在堆疊中。 攻擊者可以利用堆疊溢位漏洞,接著以指向攻擊者所選程式碼的指標覆寫例外處理常式。
此緩解措施依賴 SEH 的設計,其中每個 SEH 項目都包含指向例外處理器的指標,以及指向例外鏈中下一個處理器的指標。 此風險降低措施是由例外發送器所呼叫,當叫用例外狀況時,會驗證 SEH 鏈。 驗證以下內容:
- 所有例外狀況鏈結記錄都位於堆疊界限內
- 所有例外記錄都對齊
- 沒有例外處理常式指標指向堆疊
- 沒有反向指標
- 例外狀況鏈結結束於已知的最終例外處理常式
若驗證失敗,則例外處理將中止,例外將不再被處理。
相容性考量
SEHOP 的相容性問題相當罕見。 應用程式很少會依賴破壞例外狀況鏈這種行為。 然而,有些應用程式會受到時序細微變化的影響,這可能表現為競爭狀態,揭示應用程式中潛在的多執行緒錯誤。
設定選項
注意事項
驗證例外狀況鏈結 (SEHOP) 沒有稽核模式。
驗證控制代碼使用方式
描述
驗證控制代碼的使用是一種緩解措施,可協助防止攻擊者利用現有的控制代碼來存取受保護的物件。 控制代碼是對受保護物件的參照。 如果應用程式碼正在參照無效的控制代碼,這可能表示攻擊者正試圖使用其先前記錄下來的控制代碼(但應用程式的參考計數機制不會察覺到這一點)。 如果應用程式嘗試使用無效物件,而不是直接回傳 null,而是會提出例外 (STATUS_INVALID_HANDLE) 。
此風險降低措施會自動套用 Windows Store 應用程式。
相容性考量
那些無法準確追蹤handle引用,且未用例外處理程序包裝這些操作的應用程式,可能會受到此緩解措施的影響。
設定選項
注意事項
驗證控制代碼使用方式 沒有稽核模式。
驗證堆積完整性
描述
驗證堆積完整性風險降低措施會增加 Windows 中堆積防護功能的保護層級,因為如果偵測到堆積損壞,則會造成應用程式終止。 風險降低措施包括:
- 防止 HEAP 控制代碼被釋放
- 對用於堆積配置的延伸區塊標頭再次進行驗證
- 確認堆積配置區塊尚未被標記為使用中
- 為大型配置區塊、堆區段,以及大於最小大小的子區段加入防護頁面
相容性考量
此風險降低措施已預設套用 64 位元應用程式,以及目標為 Windows Vista 或更新版本之 32 位元應用程式。 來自 Windows XP 或更早版本的舊版應用程式風險最大,但相容性問題很少發生。
設定選項
注意事項
驗證堆積完整性 沒有稽核模式。
驗證映像相依性完整性
描述
驗證映像檔相依性緩解措施有助於防範試圖以程式碼替代由 Windows 二進位檔靜態連結的 DLL 的攻擊。 DLL 植入技術會濫用載入器的搜尋機制來注入惡意程式碼,並可用來讓惡意程式碼在提升權限的內容中執行。 當載入 Windows 簽名的二進位檔,然後載入該二進位檔依賴的任何 dll 時,這些二進位檔會被驗證,以確保它們也是以 Windows 二進位檔數位簽章的。 如果未通過簽章檢查,DLL 就無法載入,並會引發例外,回傳 STATUS_INVALID_IMAGE_HASH 狀態。
相容性考量
相容性問題並不常見。 依賴以本地私有版本取代 Windows 二進位檔的應用程式會受到影響,且多執行緒應用程式中也存在微小的時序錯誤風險。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。
驗證堆疊完整性 (StackPivot)
描述
驗證堆疊完整性 (StackPivot) 風險降低措施可協助防範 Stack Pivot 攻擊,這是攻擊者在堆積記憶體中建立假堆疊的 ROP 攻擊,然後欺騙應用程式回到控制執行流程的假堆疊中。
此風險降低措施會攔截許多 Windows API,並檢查堆疊指標的值。 如果堆疊指標的位址不介於堆疊的底部與頂部之間,則會記錄事件,若非審計模式,程序即終止。
此風險降低措施攔截的 API 為:
LoadLibraryALoadLibraryWLoadLibraryExALoadLibraryExWLdrLoadDllVirtualAllocVirtualAllocExNtAllocateVirtualMemoryVirtualProtectVirtualProtectExNtProtectVirtualMemoryHeapCreateRtlCreateHeapCreateProcessACreateProcessWCreateProcessInternalACreateProcessInternalWNtCreateUserProcessNtCreateProcessNtCreateProcessExCreateRemoteThreadCreateRemoteThreadExNtCreateThreadExWriteProcessMemoryNtWriteVirtualMemoryWinExecCreateFileMappingACreateFileMappingWCreateFileMappingNumaWNtCreateSectionMapViewOfFileMapViewOfFileExMapViewOfFileFromAppLdrGetProcedureAddressForCaller
相容性考量
使用假堆疊的應用程式會受到影響,而且在多執行緒應用程式中,也有小幅風險會暴露出難以察覺的時序錯誤。 執行 API 攔截的應用程式 (尤其是安全性軟體) 可能會造成此風險降低措施的相容性問題。
此風險降低措施與任意程式碼防護風險降低措施不相容。
設定選項
僅審核 - 您可以在審核模式下啟用此緩解措施,以衡量應用程式可能對相容性的影響。 接著,您可以在事件檢視器中檢視稽核事件,或在 適用於端點的 Microsoft Defender 中使用進階搜捕功能。