探索保護參考
適用於:
想要體驗適用於端點的 Microsoft Defender 嗎? 注册免費試用版。
惡意探索保護可為企業系統管理員和IT專業人員在開發人員編譯並散發軟體之後可套用的應用程式提供進階保護。
本文可協助您了解惡意探索保護在原則層級和個別風險降低層級的運作方式,以協助您成功建置和套用惡意探索保護原則。
如何套用風險降低措施
每個應用程式都會套用惡意探索保護防護功能。
風險降低措施是透過您設定保護之每個程式的登錄項目來設定。 這些設定會儲存在每個程式的 MitigationOptions 登錄專案中, (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\*ImageFileName*\MitigationOptions
) 。 它們會在您重新啟動程式時生效,並保持有效,直到您變更它們並重新啟動程序為止。
重要事項
圖像檔執行選項只允許您指定檔名或路徑,而非版本號碼、架構或任何其他差異。 請小心將緩和風險降低措施的目標鎖定為具有唯一名稱或路徑的應用程式,將其只套用在已測試該版本和應用程式架構的裝置上。
如果您使用PowerShell、群組原則 或 MDM 使用 XML 組態檔來設定惡意探索保護防護功能,則在處理此 XML 組態檔時,會為您設定個別的登錄設定。
當不再強制執行散發 XML 檔案的原則時,不會自動移除此 XML 組態檔所部署的設定。 若要移除惡意探索保護設定,請從乾淨的 Windows 10 或 Windows 11 裝置匯出 XML 設定,然後部署這個新的 XML 檔案。 或者,Microsoft 會提供 XML 檔案做為 Windows 安全性基準的一部分,以重設惡意探索保護設定。
若要使用 PowerShell 重設惡意探索保護設定,請使用下列命令:
Set-ProcessMitigation -PolicyFilePath EP-reset.xml
以下是與 Windows 安全性基準一起發佈的 EP-reset.xml:
<?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>
風險降低措施參考
下列各節詳細說明每個惡意探索保護風險降低措施所提供的保護、風險降低措施的相容性考慮,以及可用的設定選項。
任意程式碼防護
描述
任意程式碼防護可協助防止惡意攻擊者透過記憶體安全性弱點,將其選擇的程式碼載入記憶體,並能夠執行該程式碼。
任意程式代碼防護可防止應用程式執行動態產生的程式代碼 (未載入的程式代碼,例如,從 exe 本身或 dll) 。 任意程式碼防護會防止將記憶體標示為可執行檔來運作。 當應用程式嘗試配置記憶體時,我們會檢查保護旗標。 (記憶體可以使用讀取、寫入和/或執行保護旗標來配置。如果配置嘗試包含執行保護旗標,則記憶體配置會失敗並返回錯誤碼 (STATUS_DYNAMIC_CODE_BLOCKED)。 同樣地,如果應用程式嘗試變更已配置且包含執行保護旗標的記憶體保護旗標,則權限變更會失敗並返回錯誤碼 (STATUS_DYNAMIC_CODE_BLOCKED)。
如果防止設定執行旗標,Windows 10 和 Windows 11 的資料執行防護功能就可以防範設定至該記憶體並執行該程式碼的指令指標。
相容性考量
任意程式碼防護會防止將任何記憶體配置為可執行檔,這表示 Just-in-Time (JIT) 編譯器等方法發生相容性問題。 例如,大部分的新式瀏覽器會將 JavaScript 編譯成原生程式代碼,以優化效能。 若要支援此防護功能,必須重新架構它們,才能將 JIT 編譯移到受保護的程式之外。 其他設計會從腳本或其他中繼語言動態產生程式碼的應用程式,同樣與此防護功能不相容。
設定選項
允許執行緒退出 - 您可以設定風險降低措施,讓個別執行緒退出此保護。 開發人員必須已撰寫具有此風險降低措施感知的應用程式,並且已使用 ThreadInformation 參數設為 ThreadDynamicCodePolicy 來呼叫 SetThreadInformation API,以便允許在此執行緒上執行動態程式碼。
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Defender 中使用進階搜捕。
封鎖低完整性映像
描述
封鎖低完整性映像可防止應用程式載入不受信任的檔案,通常是因為這些檔案是從沙箱化瀏覽器從因特網下載。
如果映像具有 存取控制 專案 (ACE) ,而 ACE) 授與低 IL 進程的存取權,而且沒有信任卷標 ACE,則此風險降低會封鎖影像載入。 它是由記憶體管理員實作,這會封鎖檔案對應至記憶體。 如果應用程式嘗試對應低完整性影像,則會觸發STATUS_ACCESS_DENIED錯誤。 有關完整性層級如何運作的詳細資訊,請參閱強制完整性控制。
相容性考量
封鎖低完整性映像可防止應用程式載入從因特網下載的檔案。 如果您的應用程式工作流程需要載入已下載的映像,您會想要確保它們是從較高信任的程式下載,或明確地重新標記以套用此風險降低措施。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
封鎖遠端映像
描述
封鎖遠端映像可協助防止應用程式載入裝載在遠端裝置上的檔案,例如 UNC 共用。 封鎖遠端映像可協助防止將二進位檔載入被攻擊者控制之外部裝置的記憶體。
如果影像判斷為位於遠端裝置上,此防護功能會封鎖映像載入。 它是由記憶體管理員實作,這會封鎖檔案對應至記憶體。 如果應用程式嘗試對應遠端檔案,則會觸發STATUS_ACCESS_DENIED錯誤。
相容性考量
封鎖遠端映像可防止應用程式從遠端裝置載入映像。 如果您的應用程式從遠端裝置載入檔案或外掛程式,則它將與此風險降低措施不相容。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
封鎖不信任的字型
描述
封鎖不受信任的字型可減輕字型剖析錯誤的風險,導致攻擊者能夠在裝置上執行程式碼。 只有安裝在 windows\fonts 目錄中的字型會載入 GDI 進行處理。
此風險降低措施是在 GDI 內實作,可驗證檔案的位置。 如果檔案不在系統字型目錄中,則不會載入字型進行剖析,而且該呼叫將會失敗。
除了 Windows 10 1607 及更新版本和 Windows 11 中提供的內建風險降低措施之外,此風險降低措施會將字型剖析從核心移至使用者模式應用程式容器。 因此,任何以字型剖析為基礎的惡意探索,都發生在沙箱和已隔離的內容中,這可大幅降低風險。 有關此風險降低措施的詳細資訊,請參閱部落格使用零時差攻擊風險降低措施強化 Windows 10。
相容性考量
系統字型目錄外最常見的字型使用是使用 網頁字型。 Microsoft Edge 等新式瀏覽器會使用 DirectWrite 而非 GDI,而且不會受到影響。 不過,舊版瀏覽器,例如 Internet Explorer 11 (以及新 Microsoft Edge 中的 IE 模式),可能會受到影響,尤其是使用字型字元來顯示 UI 的應用程式 (例如 Office 365)。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
程式碼完整性防護
描述
程式碼完整性防護可確保載入至處理序的所有二進位檔都由 Microsoft 進行數位簽章。 程式代碼完整性防護包含 WHQL (Windows 硬體質量實驗室) 簽章,可讓 WHQL 核准的驅動程式在程式內執行。
此風險降低措施是在記憶體管理員內實作,會阻止二進位檔對應到記憶體。 如果您嘗試載入未由 Microsoft 簽署的二進位檔,記憶體管理員會傳回錯誤STATUS_INVALID_IMAGE_HASH。 在記憶體管理員層級封鎖,可防止由處理序載入的二進位檔和插入至處理序的二進位檔。
相容性考量
此防護功能會特別封鎖任何未由 Microsoft 簽署的二進位檔。 因此,它與大部分的第三方軟體不相容,除非該軟體是由 (散發,並由) Microsoft Store 進行數字簽署,並已選取允許載入 Microsoft Store 所簽署映像的選項。
設定選項
也允許載入由 Microsoft Store 簽署的 映像 - Microsoft Store 所散發的應用程式會由 Microsoft Store 以數位方式簽署,而新增此設定可讓應用程式載入已通過市集認證程式的二進位檔。
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
控制流量防護 (CFG)
描述
控制流程防護 (CFG) 可保護間接函數呼叫,降低攻擊者使用記憶體損壞弱點的風險。 例如,攻擊者可能會使用緩衝區溢位弱點來覆寫包含函數指標的記憶體,並使用指向其選擇之可執行程式碼的指標取代該函數指標 (可能也會插入程式)。
此風險降低措施是在編譯時插入另一個檢查。 在每個間接函數調用之前,會新增另一個指示來確認目標在呼叫之前是有效的呼叫目標。 如果目標不是有效的呼叫目標,則會終止應用程式。 因此,只有使用支援 CFG 編譯的應用程式才能從此風險降低措施中受益。
Windows 核心會提供有效目標的檢查。 載入可執行檔時,會擷取間接呼叫目標的中繼資料,並標示為有效的呼叫目標。 此外,當配置記憶體並標示為可執行檔 (例如產生的程式碼) 時,這些記憶體位置也會標示為有效的呼叫目標,以支援 JIT 編譯等機制。
相容性考量
由於應用程式必須編譯以支援 CFG,因此它們隱含地宣告其與 CFG 的相容性。 因此,大部分的應用程式應該能在啟用此風險降低措施的情況下運作。 因為這些檢查編譯成二進位檔,您可以套用的設定,只是停用 Windows 核心內的檢查。 換句話說,安全防護功能預設為開啟,但如果您稍後判斷應用程式開發人員未在其測試中發現相容性問題,您可以將 Windows 核心設定為一律傳回「是」,這應該很少見。
設定選項
使用嚴格 CFG - 在嚴格模式中,載入至處理序的所有二進位檔必須針對控制流程防護進行編譯 (或其中沒有可執行程式碼 ,例如資源 dll),才能載入。
注意事項
控制流程防護 沒有稽核模式。 二進位檔會在啟用此風險降低措施的情況下進行編譯。
資料執行防護 (DEP)
描述
數據執行防止 (DEP) 防止執行未明確配置為可執行檔的記憶體。 DEP 可協助防止攻擊者將惡意程式碼插入處理序,例如透過緩衝區溢位,然後執行該程式碼。
如果您嘗試將指令指標設定為未標示為可執行檔的記憶體位址,處理器會擲回例外狀況 (一般保護違規) ,導致應用程式當機。
相容性考量
所有 x64、ARM 和 ARM-64 可執行文件預設都已啟用 DEP,且無法停用。 因為應用程式從未在沒有 DEP 的情況下執行,所以會假設相容性。
所有 x86 (32 位元) 二進位檔預設都已啟用 DEP,但每個處理序都可以停用 DEP。 某些舊版應用程式 (通常是在 Windows XP SP2 之前開發的應用程式) 可能與 DEP 不相容。 這類應用程式通常會動態產生程式碼 (例如 JIT 編譯),或連結至較舊的程式庫 (例如舊版 ATL),以動態產生程式碼。
設定選項
啟用 ATL Thunk 模擬 - 此設定選項會停用 ATL Thunk 模擬。 ATL 是 ActiveX 範本庫,設計成盡可能小且快速。 為了縮減二進位檔的大小,它會使用稱為 Thunking 的技術。 Thunking 通常考慮在 32 位元和 16 位元應用程式之間互動,但這裡沒有 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」的 IME 只適用於 Windows 傳統型應用程式,而非 UWP 應用程式。 此防護功能也可防止此舊版 IME 載入指定的 Windows 傳統型應用程式。
- Windows 事件勾點 - 應用程式可以呼叫 SetWinEventHook API,註冊對正在發生事件的興趣。 已指定 DLL,而且可以插入至處理序。 此風險降低措施會強制將勾點張貼到註冊處理序,而不是透過插入的 DLL 在處理序中執行。
相容性考量
這些擴充點大部分很少使用,因此相容性影響通常很小,尤其是在個別應用程式層級。 其中一個考慮是使用者是否使用無法與受保護應用程式搭配使用的第三方舊版IME。
設定選項
此風險降低措施沒有設定選項。
注意事項
停用擴充點 沒有稽核模式。
停用 Win32k 系統呼叫
描述
Win32k.sys 為攻擊者提供廣泛的受攻擊面。 作為內核模式元件,它經常以沙盒化應用程式的逸出向量作為目標。 此風險降低措施會封鎖執行緒,防止呼叫 win32k.sys,防止執行緒自行轉換成 GUI 執行緒,然後提供叫用 Win32k 函數的存取權。 執行緒在建立時不是 GUI,但在第一次呼叫 win32k.sys 時轉換,或透過 API 呼叫 IsGuiThread。
相容性考量
此風險降低措施專為專用的非 UI 處理序所設計。 例如,許多新式瀏覽器都會使用進程隔離,並納入非UI進程。 任何使用單一處理序顯示 GUI 的應用程式都會受到此風險降低措施的影響。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 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.dll
flash*.ocx
jscript*.ocx
vbscript.dll
vgx.dll
mozjs.dll
xul.dll
acrord32.dll
acrofx32.dll
acroform.api
此外,此風險降低措施會啟用 EAF+,將 PAGE_GUARD 保護新增到包含「MZ」標頭 (PE 檔案中 DOS 標頭 前兩個位元組) 的頁面,這是已知記憶體內容的另一個層面,Shellcode 可尋找此內容來識別記憶體中可能感興趣的模組。
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
強制執行映像隨機化 (強制 ASLR)
描述
位址空間配置隨機化 (ASLR) 可減輕攻擊者使用系統記憶體配置的知識,以執行已存在處理序記憶體中且已標示為可執行檔程式碼的風險。 這可減輕攻擊者使用技術的風險,例如返回至 C 標準庫攻擊,其中攻擊者會設定內容,然後修改返回位址,以使用適合攻擊者目的內容執行現有程式碼。
強制 ASLR 強制在處理序內為所有 DLL 重訂基底。 開發人員可以使用 /DYNAMICBASE 連結器選項啟用 ASLR,而此風險降低措施有相同的效果。
當記憶體管理員將映像對應至進程時,強制 ASLR 會強制重新調整尚未加入 ASLR 之 DLL 和 EXE 的基底。 不過,請注意,此重訂基底沒有 Entropy,因此可以放在記憶體中的可預測位置。 對於二進位檔的重訂基底和隨機位置,此風險降低措施應該與隨機記憶體配置 (由下而上 ASLR) 配對。
相容性考量
ASLR 的相容性影響通常受限於使用編譯器所建立的較舊應用程式,這些編譯器會假設二進位檔的基底位址,或已移除基本重新配置資訊。 當執行流程嘗試跳到預期而非記憶體中的實際位置時,這可能會導致無法預測的錯誤。
設定選項
不允許已去除的映像 - 此選項會阻止載入已移除重新配置資訊的影像。 Windows PE 檔格式包含絕對位址,而且編譯程式也會產生 [基底重新配置數據表,載入器可用來尋找所有相對記憶體參考及其位移,因此,如果二進位檔未載入其慣用的基位址,就可以更新它們。 某些較舊的應用程式會在生產組建中去除這項資訊,因此無法重新建立這些二進位檔的基底。 此風險降低措施會阻止載入這類二進位檔 (而不是允許以偏好的基底位址載入)。
注意事項
強制執行映像隨機化 (強制 ASLR) 沒有稽核模式。
硬體強制執行堆疊保護
描述
硬體強制執行堆疊保護可針對 ROP 惡意探索提供強大的保護,因為它會維護程式預定執行流程的記錄。 為了確保順暢的生態系統採用和應用程式相容性,Windows 會提供此保護作為選擇加入模型,讓開發人員可以依照自己的步調接收這項保護。
相容性考量
硬體強制堆疊保護僅適用於支援硬體陰影堆疊的晶片組、Intel 的控制流程強制技術 (CET) 或 AMD 陰影堆疊。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Defender 中使用進階搜捕。
對所有模組強制執行,而不是針對相容模塊 強制執行 - 您可以啟用此防護功能,以強制執行所有模組,而非相容模組。
匯入位址篩選 (IAF)
描述
匯入位址篩選 (IAF) 風險降低措施可協助降低攻擊者變更應用程式控制流程的風險,方法為修改匯入位址表 (IAT),以重新導向至攻擊者在呼叫該功能時選擇的任意程式碼。 攻擊者可能會使用這個方法來劫持控制,或攔截、檢查和可能封鎖對敏感性 API 的呼叫。
所有受保護 API 的記憶體頁面都會套用 PAGE_GUARD 保護。 當有人嘗試存取此記憶體時,它會產生STATUS_GUARD_PAGE_VIOLATION。 風險降低會處理此例外狀況,如果存取指令未通過驗證,程式就會終止。
此風險降低措施可保護下列 Windows API:
GetProcAddress
GetProcAddressForCaller
LoadLibraryA
LoadLibraryExA
LoadLibraryW
LoadLibraryExW
LdrGetProcedureAddress
LdrGetProcedureAddressEx
LdrGetProcedureAddressForCaller
LdrLoadDll
VirtualProtect
VirtualProtectEx
VirtualAlloc
VirtualAllocEx
NtAllocateVirtualMemory
NtProtectVirtualMemory
CreateProcessA
CreateProcessW
WinExec
CreateProcessAsUserA
CreateProcessAsUserW
GetModuleHandleA
GetModuleHandleW
RtlDecodePointer
DecodePointer
相容性考量
此風險降低措施可能會偵測到執行 API 攔截的合法應用程式,並造成某些應用程式當機。 範例包括安全性軟體和應用程式相容性填充碼。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
隨機記憶體配置 (由下而上 ASLR)
描述
隨機記憶體配置 (由下而上 ASLR) 會將 Entropy 新增至重新配置,因此其位置是隨機的,因此較無法預測。 此風險降低措施需要強制 ASLR 生效。
32 位元位址空間的大小對可新增的 Entropy 提出實際限制,因此 64 位元應用程式讓攻擊者更難猜測記憶體中的位置。
相容性考量
大部分與強制 ASLR (重定基底) 相容的應用程式也與由下而上 ASLR 的其他 Entropy 相容。 如果某些應用程式將本機指標儲存在32位變數中, (預期基位址低於4 GB) ,因此與可停用的高爏選項不相容 () ,則可能會發生指標截斷問題。
設定選項
請勿使用高熵 - 此選項會停用高熵 ASLR 的使用,這會將 24 位元 Entropy (1 TB 差異) 新增到 64 位元應用程式的由下而上配置。
注意事項
隨機記憶體配置 (由下而上 ASLR) 沒有稽核模式。
模擬執行 (SimExec)
描述
模擬執行 (SimExec) 是 32 位元應用程式的風險降低措施。 這可協助驗證對敏感性 API 的呼叫會返回到合法的呼叫者函數。 它會透過攔截對敏感性 API 的呼叫,然後透過瀏覽尋找 RET 指令 (應會返回呼叫者) 的編碼組合語言指令來模擬這些 API 的執行。 然後它會檢查該函數,並往回在記憶體中向後移動,以尋找上述 CALL 指令,以判斷函數與 CALL 指令是否相符,以及 RET 是否尚未被攔截。
此風險降低措施攔截的 API 為:
LoadLibraryA
LoadLibraryW
LoadLibraryExA
LoadLibraryExW
LdrLoadDll
VirtualAlloc
VirtualAllocEx
NtAllocateVirtualMemory
VirtualProtect
VirtualProtectEx
NtProtectVirtualMemory
HeapCreate
RtlCreateHeap
CreateProcessA
CreateProcessW
CreateProcessInternalA
CreateProcessInternalW
NtCreateUserProcess
NtCreateProcess
NtCreateProcessEx
CreateRemoteThread
CreateRemoteThreadEx
NtCreateThreadEx
WriteProcessMemory
NtWriteVirtualMemory
WinExec
CreateFileMappingA
CreateFileMappingW
CreateFileMappingNumaW
NtCreateSection
MapViewOfFile
MapViewOfFileEx
MapViewOfFileFromApp
LdrGetProcedureAddressForCaller
如果偵測到 ROP 小工具,則處理序會終止。
相容性考量
執行 API 攔截的應用程式 (尤其是安全性軟體) 可能會造成此風險降低措施的相容性問題。
此風險降低措施與任意程式碼防護風險降低措施不相容。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
驗證 API 引動過程 (CallerCheck)
描述
驗證 API 引動過程 (CallerCheck) 是一種針對以返回為導向的程式設計 (ROP) 技術的風險降低措施,可驗證敏感性 API 是否從有效的呼叫者呼叫。 此風險降低措施會檢查傳遞的傳回位址,然後啟發式地反向分解以尋找傳回位址上方的呼叫,以判斷呼叫目標是否與傳遞至函數的參數相同。
此風險降低措施攔截的 API 為:
LoadLibraryA
LoadLibraryW
LoadLibraryExA
LoadLibraryExW
LdrLoadDll
VirtualAlloc
VirtualAllocEx
NtAllocateVirtualMemory
VirtualProtect
VirtualProtectEx
NtProtectVirtualMemory
HeapCreate
RtlCreateHeap
CreateProcessA
CreateProcessW
CreateProcessInternalA
CreateProcessInternalW
NtCreateUserProcess
NtCreateProcess
NtCreateProcessEx
CreateRemoteThread
CreateRemoteThreadEx
NtCreateThreadEx
WriteProcessMemory
NtWriteVirtualMemory
WinExec
CreateFileMappingA
CreateFileMappingW
CreateFileMappingNumaW
NtCreateSection
MapViewOfFile
MapViewOfFileEx
MapViewOfFileFromApp
LdrGetProcedureAddressForCaller
如果偵測到 ROP 小工具,則處理序會終止。
相容性考量
執行 API 攔截的應用程式 (尤其是安全性軟體) 可能會造成此風險降低措施的相容性問題。
此風險降低措施與任意程式碼防護風險降低措施不相容。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
驗證例外狀況鏈結 (SEHOP)
描述
驗證例外狀況鏈結 (SEHOP) 是防範結構化例外處理常式 (SEH) 覆寫惡意探索技術的風險降低措施。 結構化例外狀況處理是應用程式可要求處理特定例外狀況的處理序。 例外處理常式會鏈結在一起,因此,如果一個例外處理常式選擇不處理特定例外狀況,可以將它傳遞至鏈中的下一個例外處理常式,直到有一個例外處理常式決定處理它。 因為處理程式清單是動態的,所以會儲存在堆疊上。 攻擊者可以使用堆疊溢位弱點,然後以指向攻擊者選擇之程式碼的指標覆寫例外處理常式。
此緩和措施依賴 SEH 的設計,其中每個 SEH 專案都包含例外狀況處理程式的指標,以及例外狀況鏈結中下一個處理程式的指標。 此風險降低措施是由例外發送器所呼叫,當叫用例外狀況時,會驗證 SEH 鏈。 它會驗證:
- 所有例外狀況鏈結記錄都位於堆疊界限內
- 所有例外記錄都對齊
- 沒有例外處理常式指標指向堆疊
- 沒有反向指標
- 例外狀況鏈結結束於已知的最終例外處理常式
如果這些驗證失敗,則會中止例外狀況處理,且不會處理例外狀況。
相容性考量
SEHOP 的相容性問題相當罕見。 應用程式對於損壞例外鏈的相依性並不常見。 不過,某些應用程式受到時間上的細微變更所影響,可能會表現為競爭條件,顯示應用程式中潛在的多執行緒錯誤。
設定選項
注意事項
驗證例外狀況鏈結 (SEHOP) 沒有稽核模式。
驗證控制代碼使用方式
描述
驗證控制代碼使用方式是一種風險降低措施,可協助使用現有的控制代碼來存取受保護的物件,協助防範攻擊者。 控制代碼是受保護物件的參考。 如果應用程式程式碼參考的控制代碼無效,這可能表示攻擊者嘗試使用先前記錄的控制代碼 (但無法察覺到哪個應用程式參考計數)。 如果應用程式嘗試使用無效的物件,而不是只傳回 Null,應用程式會引發例外狀況 (STATUS_INVALID_HANDLE) 。
此風險降低措施會自動套用 Windows Store 應用程式。
相容性考量
未正確追蹤句柄參考,而且未將這些作業包裝在例外狀況處理程式中的應用程式,可能會受到此風險降低的影響。
設定選項
注意事項
驗證控制代碼使用方式 沒有稽核模式。
驗證堆積完整性
描述
驗證堆積完整性風險降低措施會增加 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 為:
LoadLibraryA
LoadLibraryW
LoadLibraryExA
LoadLibraryExW
LdrLoadDll
VirtualAlloc
VirtualAllocEx
NtAllocateVirtualMemory
VirtualProtect
VirtualProtectEx
NtProtectVirtualMemory
HeapCreate
RtlCreateHeap
CreateProcessA
CreateProcessW
CreateProcessInternalA
CreateProcessInternalW
NtCreateUserProcess
NtCreateProcess
NtCreateProcessEx
CreateRemoteThread
CreateRemoteThreadEx
NtCreateThreadEx
WriteProcessMemory
NtWriteVirtualMemory
WinExec
CreateFileMappingA
CreateFileMappingW
CreateFileMappingNumaW
NtCreateSection
MapViewOfFile
MapViewOfFileEx
MapViewOfFileFromApp
LdrGetProcedureAddressForCaller
相容性考量
使用假堆疊的應用程式會受到影響,而且在多線程應用程式中顯示細微計時錯誤的風險也很小。 執行 API 攔截的應用程式 (尤其是安全性軟體) 可能會造成此風險降低措施的相容性問題。
此風險降低措施與任意程式碼防護風險降低措施不相容。
設定選項
僅稽核 - 您可以在稽核模式中啟用此風險降低措施,以測量對應用程式的潛在相容性影響。 然後,您可以在事件檢視器中檢視稽核事件,或在適用於端點的 Microsoft Defender 中使用進階搜捕。
提示
想要深入了解? Engage 技術社群中的 Microsoft 安全性社群:適用於端點的 Microsoft Defender 技術社群。