启用基于虚拟化的代码完整性保护

内存完整性 是 Windows 中提供的基于虚拟化的安全 (VBS) 功能。 内存完整性和 VBS 改进了 Windows 的威胁模型,并针对试图利用 Windows 内核的恶意软件提供更强大的保护。 VBS 使用 Windows 虚拟机监控程序创建独立的虚拟环境,该环境成为假定内核可能遭到入侵的 OS 的信任根。 内存完整性是一个关键组件,它通过在 VBS 的独立虚拟环境中运行内核模式代码完整性来保护和强化 Windows。 内存完整性还限制可用于破坏系统的内核内存分配。

注意

  • 内存完整性有时称为 虚拟机监控程序保护的代码完整性 (HVCI) 虚拟机监控程序强制实施的代码完整性,最初作为 Device Guard 的一部分发布。 除了在 组策略 或 Windows 注册表中查找内存完整性和 VBS 设置外,不再使用 Device Guard。
  • 内存完整性更好地适用于 Intel Kabylake 和具有 基于模式的执行控制的更高处理器,以及具有 来宾模式执行陷阱 功能的 AMD Zen 2 及更高处理器。 较旧的处理器依赖于这些功能(称为 受限用户模式)的仿真,并且将对性能产生更大的影响。 启用嵌套虚拟化后,当 VM 版本 >= 9.3 时,内存完整性会更好。

警告

某些应用程序和硬件设备驱动程序可能与内存完整性不兼容。 这种不兼容可能会导致设备或软件出现故障,在极少数情况下,可能会导致启动失败 (蓝屏) 。 在启用内存完整性后或启用过程本身期间,可能会出现此类问题。 如果出现兼容性问题,请参阅 故障排除 以获取修正步骤。

内存完整性功能

  • 保护内核模式驱动程序的控制流防护 (CFG) 位图的修改。
  • 保护内核模式代码完整性进程,确保其他受信任的内核进程具有有效的证书。

如何打开内存完整性

若要在整个企业中使用支持硬件在 Windows 设备上启用内存完整性,请使用以下任一选项:

Windows 安全中心

可以在Windows 安全中心设置中打开内存完整性,可在 Windows 安全中心>设备安全>核心隔离详细信息>中找到内存完整性。 有关详细信息,请参阅 Windows 安全中心 中的设备保护

从 Windows 11 22H2 开始,如果关闭内存完整性,Windows 安全中心会显示警告。 警告指示器也显示在 Windows 任务栏和 Windows 通知中心的Windows 安全中心图标上。 用户可以在Windows 安全中心内消除警告。

使用 Intune 启用内存完整性

使用设置目录的“基于虚拟化的技术>虚拟机监控程序强制实施代码完整性设置来启用内存完整性。 还可以在 VirtualizationBasedTechnology CSP 中使用 HypervisorEnforcedCodeIntegrity 节点。

使用 组策略 启用内存完整性

  1. 使用 组策略 编辑器 (gpedit.msc) 编辑现有 GPO 或创建新 GPO。
  2. 导航到 “计算机配置>管理模板>”“系统>设备防护”。
  3. 双击“ 启用基于虚拟化的安全性”。
  4. 选择 “已启用” ,然后在“ 基于虚拟化的代码完整性保护”下,选择“ 启用,无需 UEFI 锁定”。 仅当想要阻止远程或策略更新禁用内存完整性时,才选择“ 使用 UEFI 锁 启用”。 使用 UEFI 锁启用后,如果想要关闭内存完整性,则必须有权访问 UEFI BIOS 菜单以关闭安全启动。 使用 组策略 启用内存完整性。
  5. 选择“ 确定” 关闭编辑器。

若要在已加入域的计算机上应用新策略,请重启或在提升的命令提示符中运行 gpupdate /force

使用注册表项启用内存完整性

设置以下注册表项以启用内存完整性。 这些键提供与 组策略 提供的配置选项集完全相同。

重要提示

  • 在下面的命令中,为安全启动带 DMA 的安全启动选择相应设置。 在大多数情况下,建议选择安全启动。 此选项为安全启动提供与给定计算机硬件所支持的相同保护。 具有输入/输出内存管理单元 (IOMMU) 的计算机将具有带 DMA 保护的安全启动。 不具有 IOMMU 的计算机将仅启用安全启动。

  • 如果选择“ 使用 DMA 进行安全启动”,则仅对支持 DMA 的计算机启用内存完整性和其他 VBS 功能。 也就是说,仅适用于具有 IOMMU 的计算机。 任何没有 IOMMU 的计算机都不会提供 VBS 或内存完整性保护。

  • 系统上的所有驱动程序都必须与代码完整性的基于虚拟化的保护兼容;否则,你的系统可能失败。 建议先在一组测试计算机上启用这些功能,然后再在用户计算机上启用它们。

建议的设置 (在没有 UEFI 锁定) 的情况下实现内存完整性:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "EnableVirtualizationBasedSecurity" /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "RequirePlatformSecurityFeatures" /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "Locked" /t REG_DWORD /d 0 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Enabled" /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Locked" /t REG_DWORD /d 0 /f

如果要自定义上述建议设置,请使用以下注册表项。

仅启用 VBS (无内存完整性)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "EnableVirtualizationBasedSecurity" /t REG_DWORD /d 1 /f

启用 VBS 并仅需要安全启动(值 1)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "RequirePlatformSecurityFeatures" /t REG_DWORD /d 1 /f

使用安全启动和 DMA 启用 VBS (值 3)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "RequirePlatformSecurityFeatures" /t REG_DWORD /d 3 /f

在没有 UEFI 锁定的情况下启用 VBS(值 0)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "Locked" /t REG_DWORD /d 0 /f

启用具有 UEFI 锁的 VBS (值 1)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "Locked" /t REG_DWORD /d 1 /f

启用内存完整性

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Enabled" /t REG_DWORD /d 1 /f

在没有 UEFI 锁定的情况下启用内存完整性 (值 0)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Locked" /t REG_DWORD /d 0 /f

使用 UEFI 锁启用内存完整性 (值 1)

reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Locked" /t REG_DWORD /d 1 /f

将内存完整性 UI 灰显并显示消息“此设置由管理员管理”

reg delete HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity /v "WasEnabledBy" /f

让内存完整性 UI 正常 (不灰显)

reg add HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity /v "WasEnabledBy" /t REG_DWORD /d 2 /f

使用 Windows Defender 应用程序控制 (WDAC) 启用内存完整性

可以使用 WDAC 策略通过以下任何技术启用内存完整性:

  1. 使用 WDAC 向导创建或编辑 WDAC 策略,并在向导的“策略规则”页上选择“虚拟机监控程序保护的代码完整性”选项。
  2. 使用 Set-HVCIOptions PowerShell cmdlet。
  3. 编辑 WDAC 策略 XML 并修改为 <HVCIOptions> 元素设置的值。

注意

如果 WDAC 策略设置为打开内存完整性,即使策略处于审核模式,也会打开它。

验证已启用的 VBS 和内存完整性功能

使用 Win32_DeviceGuard WMI 类

Windows 10、Windows 11、Windows Server 2016及更高版本具有适用于 VBS 相关属性和功能的 WMI 类:Win32_DeviceGuard。 此类可使用以下命令从提升的 Windows PowerShell 会话查询:

Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard

注意

从 Windows 10 版本 1803 和版本 21H2 开始,基于模式的执行控件属性将仅列为可用Windows 11。 对于 Intel 的 基于模式的执行控制和 AMD 的 来宾模式执行陷阱 功能,将报告此值。

此命令的输出提供了基于硬件的可用安全功能以及当前启用的功能的详细信息。

AvailableSecurityProperties

此字段有助于枚举和报告 VBS 和内存完整性的相关安全属性的状态。

描述
0 如果存在,则设备上不存在相关属性。
1 如果存在,则虚拟机监控程序可用。
2 如果存在,则安全启动可用。
3 如果存在,则 DMA 保护可用。
4 如果存在,则安全内存覆盖可用。
5 如果存在,则 NX 保护可用。
6 如果存在,则 SMM 缓解可用。
7 如果存在,则 MBEC/GMET 可用。
8 如果存在,则 APIC 虚拟化可用。
InstanceIdentifier

对特定设备唯一且由 WMI 设置的字符串。

RequiredSecurityProperties

此字段描述启用 VBS 所需的安全属性。

描述
0 无需任何项。
1 如果存在,则需要虚拟机监控程序支持。
2 如果存在,则需要安全启动。
3 如果存在,则需要 DMA 保护。
4 如果存在,则需要安全内存覆盖。
5 如果存在,则需要 NX 保护。
6 如果存在,则需要 SMM 缓解。
7 如果存在,则需要 MBEC/GMET。
SecurityServicesConfigured

此字段指示是否配置 Credential Guard 或内存完整性。

描述
0 未配置任何服务。
1 如果存在,则配置凭据保护。
2 如果存在,则配置内存完整性。
3 如果存在,System Guard配置安全启动。
4 如果存在,则配置 SMM 固件度量。
SecurityServicesRunning

此字段指示 Credential Guard 或内存完整性是否正在运行。

描述
0 没有运行任何服务。
1 如果存在,则运行凭据保护。
2 如果存在,则内存完整性正在运行。
3 如果存在,System Guard安全启动正在运行。
4 如果存在,则 SMM 固件度量正在运行。
Version

此字段列出了此 WMI 类的版本。 现在,唯一有效的值是 1.0

VirtualizationBasedSecurityStatus

此字段指示 VBS 已启用还是正在运行。

描述
0 VBS 未启用。
1 VBS 已启用但尚未运行。
2 VBS 已启用且正在运行。
PSComputerName

此字段列出了计算机名称。 计算机名称的所有有效值。

使用 msinfo32.exe

确定可用且已启用的 VBS 功能的另一种方法是从提升的 PowerShell 会话运行 msinfo32.exe。 运行此程序时,VBS 功能将显示在 “系统摘要” 部分的底部。

系统信息系统摘要中基于虚拟化的安全功能。

疑难解答

  • 如果设备驱动程序在运行时加载失败或崩溃,则可以使用 设备管理器 更新驱动程序。
  • 如果在启动过程中遇到严重错误,或者打开内存完整性后系统不稳定,可以使用 Windows 恢复环境 (Windows RE) 进行恢复。
    1. 首先,禁用用于启用 VBS 和内存完整性的任何策略,例如组策略。

    2. 然后,在受影响的计算机上启动到Windows RE,请参阅Windows RE技术参考

    3. 登录到 Windows RE 后,将内存完整性注册表项设置为 off:

      reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v "Enabled" /t REG_DWORD /d 0 /f
      
    4. 最后,重启设备。

注意

如果使用 UEFI 锁打开了内存完整性,则需要禁用安全启动才能完成Windows RE恢复步骤。

虚拟机中的内存完整性部署

内存完整性可以保护 Hyper-V 虚拟机,就像保护物理计算机一样。 从虚拟机中启用内存完整性的步骤相同。

内存完整性可防止在来宾虚拟机中运行的恶意软件。 它不会向主机管理员提供额外的保护。 在主机中,可以禁用虚拟机的内存完整性:

Set-VMSecurity -VMName <VMName> -VirtualizationBasedSecurityOptOut $true

在 Hyper-V 虚拟机中运行内存完整性的要求

  • Hyper-V 主机必须至少运行 Windows Server 2016 或 Windows 10 版本 1607。
  • Hyper-V 虚拟机必须是第 2 代并且至少运行 Windows Server 2016 或 Windows 10。
  • 可以同时启用内存完整性和 嵌套虚拟化 。 若要在虚拟机上启用 Hyper-V 角色,必须先在 Windows 嵌套虚拟化环境中安装 Hyper-V 角色。
  • 虚拟光纤通道适配器与内存完整性不兼容。 在将虚拟光纤通道适配器附加到虚拟机之前,必须先使用 Set-VMSecurity选择退出基于虚拟化的安全性。
  • 传递磁盘的 AllowFullSCSICommandSet 选项与内存完整性不兼容。 在使用 AllowFullSCSICommandSet 配置传递磁盘之前,必须先使用 Set-VMSecurity选择退出基于虚拟化的安全性。