WDAC 调试和故障排除

注意

Windows Defender应用程序控制的某些功能仅在特定 Windows 版本上可用。 详细了解Windows Defender应用程序控制功能可用性

本文介绍如何在使用 Windows Defender 应用程序控制 (WDAC) 时调试和排查应用和脚本故障。

1 - 收集 WDAC 诊断数据

在调试和排查 WDAC 问题之前,必须从显示问题行为的设备收集信息。

从提升的 PowerShell 窗口运行以下命令,收集可能需要的诊断信息:

  1. 收集常规 WDAC 诊断数据并将其复制到 %userprofile%\AppData\Local\Temp\DiagOutputDir\CiDiag:

    cidiag.exe /stop
    

    如果你的 Windows 版本中不存在 CiDiag.exe,请手动收集此信息:

  2. 将设备的“系统信息”保存到 CiDiag 文件夹:

    msinfo32.exe /report $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\SystemInformation.txt
    
  3. 使用 CiTool.exe 清点设备上的 WDAC 策略列表。 如果你的 Windows 版本中不存在 CiTool.exe,请跳过此步骤。

    citool.exe -lp -json > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\CiToolOutput.json
    
  4. 将 AppLocker 注册表项数据导出到 CiDiag 文件夹:

    reg.exe query HKLM\Software\Policies\Microsoft\Windows\SrpV2 /s > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt; reg.exe query HKLM\Software\Policies\Microsoft\Windows\AppidPlugins /s >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt; reg.exe query HKLM\System\CurrentControlSet\Control\Srp\ /s >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt
    

    注意

    你可能会看到一个错误,指出系统找不到指定的注册表项或值。 此错误并不表示存在问题,可以忽略。

  5. 将任何 AppLocker 策略文件从 %windir%System32\AppLocker 复制到 CiDiag 文件夹:

    Copy-Item -Path $env:windir\System32\AppLocker -Destination $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\ -Recurse -Force -ErrorAction Ignore
    
  6. 收集在上一步中收集的 AppLocker 策略文件的文件信息:

    Get-ChildItem -Path $env:windir\System32\AppLocker\ -Recurse | select Mode,LastWriteTime,CreationTime,Length,Name >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerPolicyFiles.txt
    
  7. 导出有效的 AppLocker 策略:

    Get-AppLockerPolicy -xml -Effective > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml
    
  8. 收集 AppLocker 服务配置和状态信息:

    sc.exe query appid > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt; sc.exe query appidsvc >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt; sc.exe query applockerfltr >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt
    

核心 WDAC 事件日志

WDAC 事件在两个位置下生成:

  • 应用程序和服务日志 - Microsoft - Windows - CodeIntegrity - 操作
  • 应用程序和服务日志 - Microsoft - Windows - AppLocker - MSI 和脚本

在 CiDiag 输出目录中,这些事件日志分别称为 CIOperational.evtx 和 ALMsiAndScript.evtx。

其他可能有用的 Windows 事件日志

有时,可以使用这些其他事件日志中的信息来补充核心 WDAC 事件日志中包含的信息。 CIDiag.exe 不收集斜 体中显示的斜体

  • 应用程序和服务日志 - Microsoft - Windows - CodeIntegrity - 详细
  • 应用程序和服务日志 - Microsoft - Windows - AppLocker - EXE 和 DLL
  • 应用程序和服务日志 - Microsoft - Windows - AppLocker - 打包的应用部署
  • 应用程序和服务日志 - Microsoft - Windows - AppLocker - 打包的应用执行
  • 应用程序和服务日志 - Microsoft - Windows - AppID - 操作
  • 应用程序和服务日志 - Microsoft - Windows - CAPI2 - 操作
  • 应用程序和服务日志 - Microsoft - Windows - DeviceGuard - 操作
  • 应用程序和服务日志 - Microsoft - Windows - PowerShell - *
  • Windows - 应用程序
  • Windows - 系统

2 - 使用诊断和日志数据识别问题

从设备收集必要的诊断信息后,即可开始分析上一部分收集的诊断数据。

  1. 验证活动并强制执行的 WDAC 策略集。 确认当前只有预期处于活动状态的策略处于活动状态。 请注意可能也处于活动状态的 Windows 收件箱策略 。 可以使用以下任一方法:

    • 查看 CiTool.exe -lp 的输出(如果适用),该输出已作为CiToolOutput.json保存到 CIDiag 输出目录。 请参阅 使用 Microsoft Edge 查看格式化的 json 文件
    • 查看应用程序和服务日志 - Microsoft - Windows - CodeIntegrity - Operational 中的核心 WDAC 事件日志中的所有策略激活事件。 在 CIDiag 输出目录中,此事件日志称为 CIOperational.evtx。
  2. 查看应用程序和服务日志 - Microsoft - Windows - CodeIntegrity - Operational 中的核心 WDAC 事件日志中可执行文件、dll 和驱动程序的任何块事件。 在 CIDiag 输出目录中,此事件日志称为 CIOperational.evtx。 使用块事件及其相关 3089 签名详细信息事件的信息 () 来调查任何无法解释或意外的块。 有关参考,请参阅本文稍后介绍的被阻止的可执行文件示例。

  3. 应用程序和服务日志 - Microsoft - Windows - AppLocker - MSI 和脚本中,查看核心脚本强制事件日志中打包的应用、MSI 安装程序、脚本和 COM 对象的任何块事件。 在 CIDiag 输出目录中,此事件日志称为 ALMsiAndScript.evtx。 使用块事件及其相关 8038 签名详细信息事件的信息 () 来调查任何无法解释或意外的块。

大多数 WDAC 相关问题(包括应用和脚本故障)都可以使用前面的步骤进行诊断。

阻止的示例可执行文件的事件分析

下面是典型 WDAC 强制模式阻止事件 3077 及其相关 3089 签名信息事件之一的详细 EventData 示例。 每个事件屏幕截图后面的表描述了事件中包含的一些元素。 下面是事件说明的分步演练,说明如何使用事件来了解块发生的原因。

事件 3077 - WDAC 强制阻止事件

PowerShell.exe 的示例 3077 阻止事件。

元素名称 描述
系统 - 关联 - [ActivityID] 屏幕截图中未显示
使用相关 ActivityID 将 WDAC 块事件与一个或多个 3089 签名事件相匹配。
文件名 磁盘上阻止运行的文件路径和名称。 由于磁盘上的名称是可变的,因此此值 不是 使用 -Level FileName创建 WDAC 文件规则时使用的值。 相反,请参阅此表中稍后的 OriginalFileName 元素。
进程名称 尝试运行阻止的文件的路径和名称。 也称为父进程。
请求的签名级别 运行所需的代码的 Windows 签名授权级别。 请参阅 请求和验证的签名级别
验证的签名级别 为代码提供的 Windows 签名授权级别。 请参阅 请求和验证的签名级别
状态 Windows NT状态代码。 可以使用 certutil.exe -error <status> 查找状态代码的含义。
SHA1 哈希 被阻止文件的 SHA1 Authenticode 哈希。
SHA256 哈希 阻止文件的 SHA256 Authenticode 哈希。
SHA1 平面哈希 被阻止文件的 SHA1 平面文件哈希。
SHA256 平面哈希 被阻止文件的 SHA256 平面文件哈希。
PolicyName 导致阻止事件的 WDAC 策略的友好名称。 对于阻止文件运行的每个策略,将显示单独的 3077 阻止事件 (或 3076 审核阻止事件) 。
PolicyId 导致块事件的 WDAC 策略的友好 ID 值。
PolicyHash 导致块事件的 WDAC 策略二进制文件的 SHA256 Authenticode 哈希。
OriginalFileName 开发人员在阻止的文件的资源标头中设置的不可变文件名。 此值是使用 -Level FileName创建 WDAC 文件规则时使用的值。
InternalName 开发人员在被阻止文件的资源标头中设置的另一个不可变值。 可以将此值替换为文件规则中的 OriginalFileName。-Level FileName -SpecificFileNameLevel InternalName
FileDescription 开发人员在被阻止文件的资源标头中设置的另一个不可变值。 可以将此值替换为文件规则中的 OriginalFileName。-Level FileName -SpecificFileNameLevel FileDescription
ProductName 开发人员在被阻止文件的资源标头中设置的另一个不可变值。 可以将此值替换为文件规则中的 OriginalFileName。-Level FileName -SpecificFileNameLevel ProductName
FileVersion 策略的 VersionEx 值,用于强制对已签名策略进行版本控制。
PolicyGUID 导致阻止事件的 WDAC 策略的 PolicyId。
UserWriteable 一个布尔值,指示文件是否位于用户可写入的位置。 当 FilePath 规则允许时,此信息可用于诊断问题。
PackageFamilyName 打包应用的包系列名称 (MSIX) ,其中包含阻止的文件。

事件 3089 - WDAC 签名信息事件

PowerShell.exe 的示例 3089 签名信息事件。

元素名称 描述
系统 - 关联 - [ActivityID] 使用相关 ActivityID 将 WDAC 签名事件与其块事件匹配。
TotalSignatureCount 为阻止的文件检测到的签名总数。
签名 此 3089 事件中显示的当前签名的索引计数(从 0 开始)。 如果文件具有多个签名,则会发现其他签名的 3089 个事件。
哈希 WDAC 用于匹配文件的哈希值。 此值应与 3077 或 3076 块事件上显示的四个哈希中的一个匹配。 如果未找到 TotalSignatureCount = 0) 的文件 (签名,则仅显示哈希值。
SignatureType 签名的类型
ValidatedSigningLevel 符合签名的 Windows 签名授权级别。 请参阅 请求和验证的签名级别
VerificationError 此特定签名未能通过 WDAC 策略的原因。 请参阅 VerificationError
PublisherName (CN 的公用名) 叶证书中的值。
IssuerName 证书链中最高可用证书的 CN 值。 此级别通常是根证书以下的一个证书。
PublisherTBSHash 叶证书的 TBS 哈希。
IssuerTBSHash 证书链中可用证书最高的 TBS 哈希。 此级别通常是根证书以下的一个证书。

示例 3077 和 3089 事件的分步演练

现在,让我们演练如何使用示例 3077 和 3089 事件中的事件数据来了解 WDAC 策略阻止此文件的原因。

了解被阻止的文件和块上下文

引用 3077 事件,找到标识策略、被阻止的文件以及尝试运行该策略的父进程的信息。 请考虑此上下文信息,以确定块是否预期和需要。

在此示例中,被阻止的文件 PowerShell.exe,它是 Windows 的一部分,通常预期会运行。 但是,在这种情况下,该策略基于 S 模式的 Windows 策略模板,该模板不允许脚本主机以限制攻击面的方式运行。 对于 S 模式,此阻止事件是成功的。 但是,假设策略作者在选择模板时并不知道该约束,并将此块视为意外的。

确定 WDAC 拒绝文件的原因

再次提到 3077 事件,我们看到请求的签名级别为 2 意味着代码必须通过 WDAC 策略。 但验证签名级别为 1 意味着代码被视为未签名。 “未签名”可能表示文件确实未签名、已签名但证书无效,或者已签名但 WDAC 策略不允许的任何证书。

现在,让我们检查被阻止文件的关联 3089 事件 () 。 在此示例中,我们仅查看在具有多个签名的文件上找到的第一个签名 (签名索引 0) 。 对于此签名,ValidatedSigningLevel 为 12,这意味着它具有 Microsoft Windows 产品签名。 VerificationError 为 21 意味着签名未通过 WDAC 策略。

请务必查看每个相关 3089 事件的信息,因为每个签名可能具有不同的 ValidatedSigningLevel 和 VerificationError。

重要提示

请注意,3077 事件的验证签名级别与 3089 事件的 ValidatedSigningLevel 的解释方式大相径庭。

对于 3077 事件,验证签名级别会告诉我们 Windows 实际如何处理二进制文件。

另一方面,对于 3089 事件,ValidatedSigningLevel 会告诉我们签名可以接收的潜在 最大 级别。 必须使用 VerificationError 来了解签名被拒绝的原因。

3 - 解决常见问题

分析 WDAC 诊断数据后,可以采取措施来解决问题或执行更多调试步骤。 下面是一些常见问题和步骤,可以尝试解决或进一步隔离根问题:

问题:阻止了要允许的文件

  • 使用核心 WDAC 事件日志中的数据添加规则以允许阻止的文件。
  • 如果策略信任托管安装程序,请使用托管安装程序重新部署文件或应用。

问题:策略处于活动状态,但意外

如果出现以下情况,则可能存在此情况:

  • 已删除策略,但系统尚未重新启动。
  • 策略已部分删除,但策略的副本仍存在于系统分区或 EFI 分区中。
  • 使用 PolicyId {A244370E-44C9-4C06-B551-F6016E563076} 的策略 (单策略格式) 在激活前复制到多策略格式策略位置,从而导致磁盘上出现重复的策略二进制文件。 检查系统和 EFI 分区中的 SiPolicy.p7b 和 {A244370E-44C9-4C06-B551-F6016E563076}.cip 文件。
  • 策略未正确部署到设备。
  • 具有管理员访问权限的攻击者应用了策略,导致某些关键进程拒绝服务。

若要解决此类问题,请按照 为标识的策略删除 WDAC 策略 的说明进行操作。

问题:发生未经处理的应用故障,并且未观察到 WDAC 事件

当用户模式 WDAC 策略处于活动状态时,某些应用会更改其行为,这可能会导致意外失败。 对于无法正确处理脚本主机实现的强制行为的应用,它也可能是脚本强制实施的副作用。

尝试通过执行以下操作来隔离根本原因:

  • 检查本文第 1 部分中列出的其他事件日志,了解与意外应用故障对应的事件。
  • 暂时将 WDAC 策略替换为另一个 禁用脚本强制实施 和重新测试的策略。
  • 暂时将 WDAC 策略替换为 允许所有 COM 对象 和重新测试的另一个策略。
  • 暂时将 WDAC 策略替换为放宽其他 策略规则 并重新测试的另一个策略。

问题:托管安装程序部署的应用无法正常工作

若要使用托管安装程序调试问题,请尝试以下步骤:

  • 检查阻止应用的 WDAC 策略是否包含用于启用托管安装程序的选项。
  • 检查有效的 AppLocker 策略 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml 是否正确,如 自动允许托管安装程序部署的应用中所述。
  • 检查 AppLocker 服务是否正在运行。 此信息在本文第 1 部分创建的 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 中找到。
  • 检查是否存在名为 MANAGEDINSTALLER 的 AppLocker 文件。APPLOCKER 存在于之前创建的 CiDiag 文件夹中。 如果没有,请重复步骤以部署并启用托管安装程序 AppLocker 配置。
  • 重启托管安装程序进程,并检查 PolicyName = MANAGEDINSTALLER 的托管安装程序进程的 AppLocker - EXE 和 DLL 事件日志中观察到 8002 事件。 如果看到 PolicyName = MANAGEDINSTALLER 为 8003 或 8004 的事件,请在 AppLocker 策略 XML 中检查 ManagedInstaller 规则,并确保规则与托管安装程序进程匹配。
  • 使用 fsutil.exe 验证托管安装程序进程写入的文件是否具有托管安装程序源扩展属性。 如果没有,请使用托管安装程序重新部署文件,然后再次检查。
  • 使用托管安装程序测试不同应用的安装。
  • 将另一个托管安装程序添加到 AppLocker 策略,并使用其他托管安装程序测试安装。
  • 检查应用是否遇到 托管安装程序的已知限制。 如果是这样,则必须使用其他方式授权应用。

问题:你预期智能安全图 (ISG) 允许的应用无法正常工作

若要使用 ISG 调试问题,请尝试以下步骤:

  • 检查阻止应用的 WDAC 策略是否包含用于启用智能安全图的选项。
  • 检查 AppLocker 服务是否正在运行。 此信息在本文第 1 部分创建的 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 中找到。
  • 使用 fsutil.exe 验证文件是否具有 ISG 源扩展属性。 如果没有,请使用托管安装程序重新部署文件,然后再次检查。
  • 检查应用是否遇到 ISG 的已知限制

4 - 向 Microsoft 报告问题(如果适用)

如果在遵循本文所述的指南后,你认为你发现了产品问题,请将问题报告给 Microsoft。

  • 拥有 Microsoft 顶级支持的客户应通过正常渠道记录服务请求。
  • 所有其他客户都可以通过 Windows 反馈中心直接向 WDAC 产品团队报告问题。 选择类别 “安全 & 隐私 - 应用程序控制 ”,确保问题已正确路由到 WDAC 产品团队。

报告问题时,请务必提供以下信息:

  • 前面介绍的所有 WDAC 诊断数据
  • 如果可能,阻止的文件 () 。
  • 清除重现问题的说明。