漏洞保护参考
适用于:
希望体验 Microsoft Defender for Endpoint? 注册免费试用版。
Exploit Protection 为企业管理员和 IT 专业人员在开发人员编译和分发软件后可以应用的应用程序提供高级保护。
本文可帮助你了解攻击防护在策略级别和单个缓解级别的工作原理,以帮助你成功生成和应用攻击防护策略。
如何应用缓解措施
攻击防护缓解措施按应用程序应用。
缓解措施通过为其配置保护的每个程序的注册表项进行配置。 这些设置存储在每个程序的 MitigationOptions 注册表项中, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\*ImageFileName*\MitigationOptions
() 。 它们在你重启程序时生效,并一直有效,直到你更改它们并再次重启程序。
重要
映像文件执行选项仅允许指定文件名或路径,而不能指定版本号、体系结构或任何其他差异因素。 请注意将缓解措施定向到具有唯一名称或路径的应用,以仅将其应用到已测试该版本和体系结构的应用程序的设备上。
如果使用 PowerShell、组策略 或 MDM 使用 XML 配置文件配置攻击防护缓解措施,则处理此 XML 配置文件时,将为你配置单独的注册表设置。
重置攻击保护
重要
不再强制实施分发 XML 文件的策略时,不会自动删除此 XML 配置文件部署的设置。
若要删除 exploit Protection 设置,请从干净Windows 10或Windows 11设备导出 XML 配置,并部署此新 XML 文件。 或者,Microsoft提供了一个 XML 文件,作为重置攻击保护设置Windows 安全中心基线的一部分。
若要使用 PowerShell 重置 exploit Protection 设置,请使用以下命令:
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) 。 任意代码保护的工作方式是防止将内存标记为可执行文件。 当应用程序尝试 分配内存 时,我们将检查保护标志。 (可以使用 read、write 和/或 execute 保护标志来分配内存。)如果分配尝试包含 执行 保护标志,则内存分配将失败并返回错误代码(STATUS_DYNAMIC_CODE_BLOCKED)。 同样,如果应用程序尝试 更改内存的保护标志,且该内存已分配并包含 execute 保护标志,则权限更改将失败并返回错误代码(STATUS_DYNAMIC_CODE_BLOCKED)。
通过阻止设置 execute 标志,Windows 10 和 Windows 11 的数据执行防护功能可以防止指令指针设置为该内存和运行该代码。
兼容性注意事项
任意代码防护可防止将任何内存分配为可执行文件,这导致了与实时 (JIT) 编译器等方法的兼容性问题。 例如,大多数新式浏览器将 JavaScript 编译为本机代码,以优化性能。 为了支持这种缓解措施,需要重新构建它们,以将 JIT 编译移到受保护的进程之外。 设计从脚本或其他中间语言动态生成代码的其他应用程序与此缓解措施类似不兼容。
配置选项
允许线程选择退出 - 可以将缓解配置为允许单个线程选择退出此保护。 开发人员必须编写了解此缓解措施的应用程序,并调用 SetThreadInformation API, 并将 ThreadInformation 参数设置为 ThreadDynamicCodePolicy ,以便允许在此线程上执行动态代码。
仅审核 - 可以在审核模式下启用此缓解措施,以衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Defender for Endpoint 中使用高级搜寻来查看审核事件。
阻止低完整性图像
说明
阻止低完整性映像会阻止应用程序加载不受信任的文件,通常是因为它们已从沙盒浏览器从 Internet 下载。
如果映像具有访问控制条目 (ACE) 授予对低 IL 进程的访问权限且没有信任标签 ACE,则此缓解措施会阻止映像加载。 它由内存管理器实现,这会阻止文件映射到内存中。 如果应用程序尝试映射低完整性映像,则会触发STATUS_ACCESS_DENIED错误。 有关完整性级别工作原理的详细信息,请参阅 强制完整性控制。
兼容性注意事项
阻止低完整性映像会阻止应用程序加载从 Internet 下载的文件。 如果应用程序工作流需要加载已下载的图像,则需要确保从更信任的进程下载这些图像,或者显式重新标记这些图像,以便应用此缓解措施。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
阻止远程图像
说明
阻止远程映像有助于防止应用程序加载远程设备(如 UNC 共享)上托管的文件。 阻止远程映像有助于防止将二进制文件加载到由攻击者控制的外部设备上的内存中。
如果确定映像位于远程设备上,则此缓解措施会阻止映像加载。 它由内存管理器实现,这会阻止文件映射到内存中。 如果应用程序尝试映射远程文件,则会触发STATUS_ACCESS_DENIED错误。
兼容性注意事项
阻止远程映像会阻止应用程序从远程设备加载图像。 如果应用程序从远程设备加载文件或插件,则它将与此缓解措施不兼容。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
阻止不受信任的字体
说明
阻止不受信任的字体可降低字体分析缺陷导致攻击者能够在设备上运行代码的风险。 将仅加载安装到 windows\fonts 目录中的字体以供 GDI 进行处理。
此缓解措施在 GDI 中实现,这将验证文件的位置。 如果文件不在系统字体目录中,则不会加载字体进行分析,并且该调用将失败。
此缓解是对 Windows 10 1607 和更高版本以及 Windows 11 中提供的内置缓解的补充,这可将字体解析从内核中移出,并移到用户模式应用程序容器中。 因此,任何基于字体分析的攻击都发生在沙盒化和隔离的上下文中,这大大降低了风险。 有关此缓解措施的详细信息,请参阅博客 使用零天攻击缓解措施强化 Windows 10。
兼容性注意事项
系统字体目录外字体的最常见用法是 Web 字体。 新式浏览器(如 Microsoft Edge)使用 DirectWrite 而不是 GDI,并且不受影响。 但旧式浏览器(如 Internet Explorer 11 以及新式 Microsoft Edge 中的 IE 模式)可能会受到影响,尤其是使用字体标志符号显示 UI 的 Office 365 等应用程序。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
代码完整性防护
说明
代码完整性防护可确保加载到进程中的所有二进制文件都由 Microsoft 进行数字签名。 代码完整性防护包括 WHQL (Windows 硬件质量实验室) 签名,这些签名允许 WHQL 批准的驱动程序在该过程中运行。
此缓解措施在内存管理器中实现,这会阻止将二进制文件映射到内存中。 如果尝试加载未由 Microsoft 签名的二进制文件,内存管理器会STATUS_INVALID_IMAGE_HASH返回错误。 通过在内存管理器级别进行阻止,此方法可以阻止由进程加载的二进制文件和注入到进程中的二进制文件。
兼容性注意事项
此缓解措施专门阻止任何未由 Microsoft 签名的二进制文件。 因此,它与大多数非Microsoft软件不兼容,除非该软件由 (分发,并由Microsoft应用商店) 数字签名,并且选择了允许加载Microsoft Store 签名的图像的选项。
配置选项
还允许加载由 Microsoft Store 签名 的图像 - Microsoft Store 分发的应用程序由 Microsoft Store 进行数字签名,并且添加此配置允许应用程序加载经过应用商店认证过程的二进制文件。
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
控制流保护 (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 位应用程序之间的交互,但此处未提供用于 ATL 的 16 位组件。 相反,为了优化二进制大小,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(称为旧式 IME)仅适用于 Windows 桌面应用,不适用于 UWP 应用。 此缓解措施还会阻止此旧版 IME 加载到指定的 Windows 桌面应用中。
- Windows 事件挂钩 - 应用程序可以调用 SetWinEventHook API 来记录对发生的事件的兴趣。 将指定 DLL,并且可以将其注入到进程中。 此缓解措施强制将挂钩发布到注册进程,而不是通过注入的 DLL 在进程内运行。
兼容性注意事项
这些扩展点中的大部分相对来说很少使用,因此兼容性影响通常很小,尤其在单个应用程序级别。 一个考虑因素是,用户是否使用无法与受保护应用程序一起使用的第三方旧式 IME。
配置选项
此缓解没有配置选项。
注意
禁用扩展点 没有审核模式。
禁用 Win32k 系统调用
说明
Win32k.sys 为攻击者提供了广泛的攻击面。 作为内核模式组件,它经常作为沙盒应用程序的转义途径。 此缓解措施通过阻止线程将自身转换为 GUI 线程来阻止对 win32k.sys 的调用,然后向该线程授予调用 Win32k 函数的访问权限。 线程在创建时是非 GUI 线程,但在首次调用 win32k.sys 时,或通过 API 调用 IsGuiThread 时会发生转换。
兼容性注意事项
此缓解措施专为属于专用非 UI 进程的进程而设计。 例如,许多新式浏览器使用进程隔离并合并非 UI 进程。 使用单个进程显示 GUI 的任何应用程序都将受到此缓解措施的影响。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
不允许子进程
说明
此缓解措施可防止应用程序创建新的子应用程序。 攻击者使用的一种常见技术是在设备上启动具有恶意输入的受信任进程(即“离地”攻击),这通常需要在设备上启动另一个应用程序。 如果没有合理原因导致应用程序启动子进程,则此缓解措施将缓解潜在的攻击途径。 通过在进程令牌上设置属性来应用缓解措施,这会阻止为子进程创建令牌,并显示错误消息 STATUS_CHILD_PROCESS_BLOCKED。
兼容性注意事项
如果应用程序出于任何原因(例如支持启动浏览器或外部浏览器的超链接,或在计算机上启动其他实用工具)启动子应用程序,则此功能将因应用此缓解措施而中断。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
导出地址筛选
说明
导出地址筛选 (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 for Endpoint 中使用高级搜寻来查看审核事件。
强制图像随机化(强制 ASLR)
说明
地址空间布局随机化 (ASLR) 可缓解攻击者利用其对系统内存布局的了解来执行已存在于进程内存中,并已标记为可执行的代码的风险。 这可以缓解攻击者使用返回到 libc 攻击等技术的风险,在这种攻击中,对手设置上下文,然后修改返回地址,以执行具有适合对手目的的上下文的现有代码。
强制 ASLR 可对进程中的全部 DLL 强制执行基址重置。 开发人员可以使用 /DYNAMICBASE 链接器选项启用 ASLR,并且此缓解具有相同的效果。
当内存管理器在映像中映射到进程中时,强制 ASLR 将强制重新设置未选择加入 ASLR 的 DLL 和 EXE 的基。 但是,请注意,此基址重置没有熵,因此可以放置在内存中的可预测位置。 对于二进制文件的基址重置和随机化位置,此缓解措施应与 随机化内存分配(自下而上 ASLR) 配对。
兼容性注意事项
ASLR 的这种兼容性影响通常局限于使用编译器生成的较旧应用程序,这些编译器假设了二进制文件的基址,或已剥离基址重定位信息。 这可能导致不可预测的错误,因为执行流尝试跳转到预期位置,而不是内存中的实际位置。
配置选项
不允许使用已剥离图像 - 此选项阻止加载已剥离重定位信息的图像。 Windows PE 文件格式包含绝对地址,编译器还会生成 [基本重定位表,加载程序可以使用该表查找所有相对内存引用及其偏移量,因此,如果二进制文件未在其首选基址处加载,则可以更新这些引用。 一些较旧的应用程序在生产版本中去除此信息,因此无法调整这些二进制文件的基础。 此缓解会阻止加载此类二进制文件(而不是允许它们加载到其首选基址)。
注意
图像强制随机化(强制 ASLR) 没有审核模式。
硬件强制实施的堆栈保护
说明
硬件强制实施的堆栈保护可针对 ROP 攻击提供可靠的保护,因为它会保留程序的预期执行流的记录。 为了确保生态系统的顺利采用和应用程序兼容性,Windows 提供了此保护作为选择加入模型,以便开发人员可以按自己的节奏接收此保护。
兼容性注意事项
硬件强制的堆栈保护仅适用于支持硬件影子堆栈的芯片集、Intel 的控制流强制技术 (CET) 或 AMD 阴影堆栈。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Defender for Endpoint 中使用高级搜寻来查看审核事件。
对所有模块(而不是兼容模块)强制 实施 - 可以启用此缓解措施,以对所有模块而不是兼容模块强制实施。
导入地址筛选(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 for Endpoint 中使用高级搜寻来查看审核事件。
随机化内存分配(自下而上 ASLR)
说明
随机化内存分配(自下而上 ASLR)会将熵添加到重定位,所以它们的位置是随机的,因此不容易进行预测。 此缓解要求强制 ASLR 生效。
32 位地址空间的大小对可添加的熵施加实际约束,因此 64 位应用程序会使攻击者更难猜测内存中的位置。
兼容性注意事项
与强制 ASLR(重置基址)兼容的大多数应用程序也与自下而上 ASLR 的另一熵兼容。 如果某些应用程序将本地指针保存在 32 位变量中, (预期基址低于 4 GB) ,则可能存在指针截断问题,因此,它们与可在) 禁用的高 entropy 选项 (不兼容。
配置选项
不要使用高熵 - 此选项可禁用高熵 ASLR,这会将 24 位熵(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 for Endpoint 中使用高级搜寻来查看审核事件。
验证 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 for Endpoint 中使用高级搜寻来查看审核事件。
验证异常链(SEHOP)
说明
验证异常链 (SEHOP) 是对 结构化异常处理程序 (SEH) 覆盖 利用技术的缓解。 结构化异常处理 是应用程序可以请求处理特定异常的过程。 异常处理程序链接在一起,因此如果一个异常处理程序选择不处理某个特定的异常,则可以将其传递给链中的下一个异常处理程序,直到一个异常处理程序决定处理它。 由于处理程序列表是动态的,因此它存储在堆栈上。 攻击者可以使用堆栈溢出漏洞,然后使用指向攻击者所选代码的指针覆盖异常处理程序。
这种缓解措施依赖于 SEH 的设计,其中每个 SEH 条目都包含一个指向异常处理程序的指针,以及一个指向异常链中下一个处理程序的指针。 此缓解由异常调度程序调用,该调度程序在调用异常时验证 SEH 链。 它验证:
- 是否所有异常链记录都在堆栈边界内
- 所有异常记录是否对齐
- 没有异常处理程序指针指向堆栈
- 不存在向后指针
- 异常链终止于一个已知的最终异常处理程序
如果这些验证失败,则会中止异常处理,并且不会处理异常。
兼容性注意事项
与 SEHOP 有关的兼容性问题相对较少。 应用程序依赖于损坏异常链是不常见的。 但是,某些应用程序会受到计时的细微变化的影响,这些变化可能表现为争用条件,导致应用程序中存在潜在的多线程 bug。
配置选项
注意
验证异常链 (SEHOP) 没有审核模式。
验证处理使用情况
说明
验证句柄用法 是一种缓解措施,有助于防止攻击者使用现有句柄访问受保护的对象。 句柄 是对受保护对象的引用。 如果应用程序代码引用无效句柄,则可能指示攻击者正在尝试使用它之前记录 (但哪个应用程序引用计数无法识别) 。 如果应用程序尝试使用无效对象,而不是简单地返回 null,应用程序会 (STATUS_INVALID_HANDLE) 引发异常。
此缓解将自动应用于 Windows 应用商店应用程序。
兼容性注意事项
未准确跟踪句柄引用且未将这些操作包装在异常处理程序中的应用程序可能会受到此缓解措施的影响。
配置选项
注意
验证句柄使用情况 没有审核模式。
验证堆完整性
说明
验证堆完整性 缓解通过在检测到堆损坏时导致应用程序终止来提高 Windows 中堆缓解的保护级别。 缓解措施包括:
- 阻止释放 HEAP 句柄
- 对堆分配的扩展块标头执行另一个验证
- 验证堆分配是否尚未标记为正在使用
- 将保护页添加到超过最小大小的大型分配、堆段和子段
兼容性注意事项
默认情况下,此缓解已应用于 64 位应用程序和面向 Windows Vista 或更高版本的 32 位应用程序。 Windows XP 或更早版本中的旧版应用程序的风险最大,但兼容性问题非常少见。
配置选项
注意
验证堆完整性 没有审核模式。
验证映像依赖项完整性
说明
验证图像依赖关系 缓解有助于防范尝试将代码替换为 Windows 二进制文件静态链接的 dll 的攻击。 DLL 植入技术滥用加载程序的搜索机制来注入恶意代码,这可以用于在已提升的上下文中运行恶意代码。 当加载程序加载 Windows 签名的二进制文件,然后加载该二进制文件所依赖的任何 dll 时,这些二进制文件会进行验证,以确保它们也以 Windows 二进制文件进行数字签名。 如果签名检查失败,则不会加载 dll,并引发异常,返回STATUS_INVALID_IMAGE_HASH状态。
兼容性注意事项
兼容性问题并不常见。 依赖于将 Windows 二进制文件替换为本地专用版本的应用程序会受到影响,在多线程应用程序中暴露细微的计时 bug 的风险也很小。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
验证堆栈完整性(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
兼容性注意事项
使用假堆栈的应用程序会受到影响,在多线程应用程序中暴露微妙的计时 bug 的风险也很小。 执行 API 拦截的应用程序(尤其是安全软件)可能导致与此缓解有关的兼容性问题。
此缓解与任意代码防护缓解不兼容。
配置选项
仅审核 - 可以在审核模式下启用此缓解措施,以便衡量对应用程序的潜在兼容性影响。 然后,可以在事件查看器中,也可以在 Microsoft Defender for Endpoint 中使用高级搜寻来查看审核事件。
提示
想要了解更多信息? Engage技术社区中的Microsoft安全社区:Microsoft Defender for Endpoint技术社区。