内存完整性 Memory Integrity

一句话总结(通俗版)

内存完整性(又叫 HVCI / 虚拟机监控程序保护的代码完整性)是 Windows 的一项安全功能,它借助「基于虚拟化的安全(VBS)」,把内核代码的「安检」搬到一个独立的虚拟隔离环境里进行。

  • 通俗理解:让内核里的驱动和系统文件先在「隔离沙箱」里通过安检,确认可信后才能真正跑起来。
  • 具体怎么安检:内核模式代码完整性本就是 Windows 自带的进程,会在启动所有内核驱动/二进制文件之前逐一检查,挡住未签名或不受信任的驱动、系统文件,不让它们进内存。
  • 防什么:① 阻止未签名 / 不受信任的驱动和系统文件进入内存;② 即使系统存在缓冲区溢出等漏洞,恶意软件也无法修改已执行的代码页,更无法运行被篡改过的内存(因为「只有验证通过的代码才能变可执行,且可执行页永远不可写」)。
  • 靠什么:VBS 用虚拟机监控程序建出一个独立的虚拟环境,作为「即便内核被攻破也值得信任」的信任根,内存完整性就在这个安全环境里跑代码完整性检查。
  • 来龙去脉:最初作为 Device Guard 的一部分发布,如今除了组策略/注册表里还保留相关设置,Device Guard 这个名字已不再使用。
  • 性能看处理器:Intel Kabylake 及更高(带「基于模式的执行控制」)、AMD Zen 2 及更高(带「来宾模式执行陷阱」)受益最大;老旧处理器靠软件仿真(受限用户模式),性能影响更明显。开启嵌套虚拟化时,VM 版本 ≥ 9.3 表现更好。
  • Azure VM 注意:若选「使用 DMA 的安全启动」,内存完整性不被支持,VBS 会显示「已启用但未运行」,因此只选「安全启动」即可。
  • 风险提示:部分应用和硬件驱动可能与内存完整性不兼容,导致故障,极少数情况下会蓝屏;遇到兼容性问题见上方「故障排除」。
  • 哪些系统有:Windows 10 / 11 / Windows Server 2016 及更高版本均支持。

内存完整性 通过在 VBS 的隔离虚拟环境中运行内核模式代码完整性来保护和强化 Windows。内核模式代码完整性是指 Windows 进程,它在启动所有内核模式驱动程序和二进制文件之前对其进行检查,并防止未签名或不受信任的驱动程序或系统文件加载到系统内存中。 内存完整性还限制可用于入侵系统的内核内存分配,确保在安全运行时环境中传递代码完整性检查后,内核内存页才会成为可执行文件,并且可执行文件页本身永远不会可写。 这样,即使存在允许恶意软件试图修改内存的缓冲区溢出等漏洞,也无法修改可执行代码页,并且修改后的内存也无法执行。

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

内存完整性是 Windows 10、Windows 11 和 Windows Server 2016 或更高版本中提供的一项 基于虚拟化的安全性 (VBS) 功能。 内存完整性和 VBS 改进了 Windows 的威胁模型,并针对试图利用 Windows 内核的恶意软件提供更强大的保护。 VBS 使用 Windows 虚拟机监控程序创建一个独立的虚拟环境,该环境成为假定内核遭到入侵的操作系统的信任根。 内存完整性是一个关键组件,它通过在 VBS 的独立虚拟环境中运行内核模式代码完整性来保护和强化 Windows。 内存完整性还限制可用于入侵系统的内核内存分配,确保在安全运行时环境中传递代码完整性检查后,内核内存页才会成为可执行文件,并且可执行文件页本身永远不会可写。

内存完整性 是一项基于虚拟化的安全性(VBS)功能,可保护 Windows 免受内核级恶意软件攻击。 在 Windows 10、Windows 11 和 Windows Server 2016 及更高版本中可用,内存完整性使用硬件虚拟化在安全环境中隔离代码完整性验证,从而防止攻击者破坏内核。

VBS 使用 Windows 管理程序创建一个独立的虚拟环境,该环境将成为操作系统的信任根。 内存完整性在此安全环境中运行内核模式代码完整性检查,并限制可用于破坏系统的内核内存分配。 这可确保内核内存页仅在通过代码完整性验证后成为可执行文件,并且可执行文件页本身永远不会可写。

注意

  • 内存完整性有时称为 _ 虚拟机监控程序保护的代码完整性(HVCI)或 _ 虚拟机监控程序强制代码完整性,最初作为 Device Guard 的一部分发布。 除了在组策略或 Windows 注册表中存在内存完整性和 VBS 设置外,不再使用 Device Guard。
  • 内存完整性更好地适用于 Intel Kabylake 和具有 _ 基于模式的执行控制的 _ 更高处理器,以及具有 来宾模式执行陷阱 功能的 AMD Zen 2 及更高处理器。 较旧的处理器依赖于这些功能(称为 受限用户模式)的仿真,并且将对性能产生更大的影响。 启用嵌套虚拟化后,当 VM 版本 >= 9.3 时,内存完整性会更好。
  • 选择 使用 DMA 进行安全启动 时,Azure VM 不支持内存完整性。 如果选择此选项,VBS 将显示为已启用但未运行。 因此,请确保仅使用以下方法之一选择 “安全启动 ”。

内存完整性导致蓝屏的原因

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

内存完整性功能

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

默认启用

在 Windows 11 的全新安装中默认开启内存完整性,以前仅在本文所述的兼容硬件上以 S 模式全新安装 Windows 10 时启用内存完整性。 默认情况下,还在所有安全核心电脑上启用。 在其他不符合内存完整性自动启用要求的系统上,客户可以选择使用有关 如何打开内存完整性 中所述的任何方法。 IT 专业人员和最终用户始终拥有是否启用内存完整性的最终控制权。

支持自动启用的硬件功能

当电脑满足以下最低硬件功能时,默认情况下启用内存完整性:

组件详细信息
处理器Intel 第 8 代或更高版本(从 Windows 11 版本 22H2 开始)(仅适用于 Windows 11 版本 21H2 的第 11 代核心处理器和更新版本)
AMD Zen 2 体系结构及更高版本
Qualcomm Snapdragon 8180 及更高版本
RAM最低 8GB(仅适用于 x64 处理器)
存储最小大小为 64GB 的 SSD
驱动程序必须安装与内存完整性兼容的驱动程序。 有关驱动程序的详细信息,请参阅驱动程序与内存完整性的兼容性。
BIOS必须启用虚拟化

如果生成的映像不会自动启用内存完整性,仍然可以配置映像,使其默认启用。

备注

自动启用仅适用于全新安装,而不适用于现有设备的升级。
当前默认启用逻辑中不包含英特尔 11 代酷睿桌面处理器。 但是,它们是推荐的内存完整性平台,并且可以由 OEM 启用。

启用内存完整性要求

尽管对于大多数系统,Windows 会默认启用内存完整性,但仍有多种原因可能导致其无法启用。 作为 OEM,可以通过在 OS 映像中配置注册表项,确保为设备启用内存完整性。

建议配置

在镜像中设置以下两个注册表项,以确保内存完整性已启用。

注册表项
HKLM\System\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrityEnabled=1
HKLM\System\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrityWasEnabledBy=1
HKLM\System\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrityEnabledBootId=<Current BootId>

BootId 是一个计数器,在每次成功启动时递增,可以在注册表项中找到:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\BootId

WasEnabledBy 和 EnabledBootId 注册表项控制防止设备无法启动的设置。设置后,如果系统在启动过程中崩溃,设备将自动关闭内存完整性,这可能是由于内存完整性阻止了不兼容的启动关键驱动程序所致。仅当 BootId 小于 EnabledBootId + 3 时,此自动禁用功能才可用。在某些版本的 Windows 中,自动禁用功能设计为在关闭内存完整性后启动失败继续时还原,这表明内存完整性不是失败的根本原因。

备注

对于高安全性系统,不应设置 WasEnabledBy 和 EnabledBootId

如何打开内存完整性

使用 Windows 安全中心 启用内存完整性

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

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

使用 Intune 启用内存完整性

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

  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

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

注册表项汇总

  • 键 A — DeviceGuard(VBS 总开关)
HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard
值名称功能可修改值
EnableVirtualizationBasedSecurity启用 VBS(不含内存完整性)1 = 启用
RequirePlatformSecurityFeaturesVBS 要求的平台安全特性1 = 安全启动;3 = 安全启动 + DMA 保护
LockedVBS 是否锁定到 UEFI0 = 无 UEFI 锁;1 = UEFI 锁
Mandatory强制模式(模块故障则拒绝启动)1 = 启用强制模式
  • 键 B — HypervisorEnforcedCodeIntegrity(内存完整性 HVCI)
HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity
值名称功能可修改值
Enabled启用内存完整性 (HVCI)1 = 启用
Locked内存完整性是否锁定到 UEFI0 = 无 UEFI 锁;1 = UEFI 锁
WasEnabledBy控制内存完整性 UI 是否灰显删除 = 灰显”由管理员管理”;2 = UI 正常

使用适用于企业的 App Control 启用内存完整性

验证已启用的 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

VBS 已启用的状态下获取到的值

AvailableSecurityProperties                  : {1, 2, 3, 4...}
CodeIntegrityPolicyEnforcementStatus         : 2
InstanceIdentifier                           : 4ff40742-2649-41b8-bdd1-e80fad1cce80
RequiredSecurityProperties                   : {1}
SecurityFeaturesEnabled                      : {0}
SecurityServicesConfigured                   : {2}
SecurityServicesRunning                      : {2}
SmmIsolationLevel                            : 0
UsermodeCodeIntegrityPolicyEnforcementStatus : 0
Version                                      : 1.0
VirtualizationBasedSecurityStatus            : 2
VirtualMachineIsolation                      : False
VirtualMachineIsolationProperties            : {0}
PSComputerName                               :

VBS 被禁用后获取到的值

AvailableSecurityProperties                  : {1, 2, 3, 4...}
CodeIntegrityPolicyEnforcementStatus         : 0
InstanceIdentifier                           : 4ff40742-2649-41b8-bdd1-e80fad1cce80
RequiredSecurityProperties                   : {0}
SecurityServicesConfigured                   : {0}
SecurityServicesRunning                      : {0}
UsermodeCodeIntegrityPolicyEnforcementStatus : 0
Version                                      : 1.0
VirtualizationBasedSecurityStatus            : 2
VirtualMachineIsolation                      : False
VirtualMachineIsolationProperties            : {0}
PSComputerName                               :

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

  • InstanceIdentifier:特定设备唯一且由 WMI 设置的字符串。
  • Version:此字段列出此 WMI 类的版本。 现在,唯一有效的值是 1.0
  • AvailableSecurityProperties:此字段有助于枚举和报告 VBS 和内存完整性的相关安全属性的状态。
描述
0如果存在,则设备上不存在相关属性。
1如果存在,则虚拟机监控程序可用。
2如果存在,则安全启动可用。
3如果存在,则 DMA 保护可用。
4如果存在,则安全内存覆盖可用。
5如果存在,则 NX 保护可用。
6如果存在,则 SMM 缓解可用。
7如果存在,则 MBEC/GMET 可用。
8如果存在,则 APIC 虚拟化可用。
  • CodeIntegrityPolicyEnforcementStatus:此字段指示代码完整性策略强制实施状态。
描述
0关闭
1审核。
2执行。
  • 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 固件度量。
5如果存在,则配置内核模式硬件强制实施堆栈保护。
6如果存在,则会在审核模式下配置内核模式硬件强制实施堆栈保护。
7如果存在,Hypervisor-Enforced 配置分页转换。
  • SecurityServicesRunning:此字段指示 Credential Guard 还是内存完整性正在运行。
描述
0没有运行任何服务。
1如果存在,则运行凭据保护。
2如果存在,则内存完整性正在运行。
3如果存在,System Guard 安全启动正在运行。
4如果存在,则 SMM 固件度量正在运行。
5如果存在,则正在运行内核模式硬件强制实施堆栈保护。
6如果存在,则内核模式硬件强制堆栈保护在审核模式下运行。
7如果存在,Hypervisor-Enforced 分页翻译正在运行。
  • SmmIsolationLevel:此字段指示 SMM 隔离级别。
  • UsermodeCodeIntegrityPolicyEnforcementStatus:此字段指示用户模式代码完整性策略强制实施状态。
描述
0关闭
1审核。
2执行。
  • VirtualizationBasedSecurityStatus:此字段指示是否启用并运行 VBS。
描述
0VBS 未启用。
1VBS 已启用但尚未运行。
2VBS 已启用且正在运行。
  • VirtualMachineIsolation:此字段指示是否启用了虚拟机隔离。
  • VirtualMachineIsolationProperties:此字段指示可用的虚拟机隔离属性集。
描述
1AMD SEV-SNP
2基于虚拟化的安全性
3Intel TDX

使用 msinfo32.exe

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

标识内存完整性状态

以下易失性注册键反映了内存完整性的状态:

注册表键
HKLM\System\CurrentControlSet\Control\CI\StateHVCIEnabled

注册表值状态变化

内存完整性开启状态下,HVCIEnabled 为 1;
内存完整性关闭状态下,无 State 项

检查内存完整性状态的其他方法是查看基于虚拟化的安全服务正在运行下的 MsInfo,或者参阅 Windows 安全应用中的核心隔离设置页面,以查看内存完整性的值。 还有一个 WMI 接口可用于使用管理工具进行检查,请参阅 验证已启用 VBS 和内存完整性功能

调试驱动程序问题

检查代码完整性日志,查看是否有任何驱动程序由于内存完整性而被阻止加载。 这些日志位于以下路径下的事件查看器中:

Applications and Service Logs\Microsoft\Windows\CodeIntegrity\Operational

通常,内存完整性兼容性事件的 EventID 为 3087。

检查内存完整性默认启用的结果

若要查看有关内存完整性默认启用结果的详细信息,请检查 setupact.log 并搜索 HVCI。 你应该会看到以下结果日志之一,以及导致启用决策的成功/失败检查:

已启用内存完整性:SYSPRP HVCI: Enabling HVCI

未启用内存完整性:SYSPRP HVCI: OS does not meet HVCI auto-enablement requirements. Exiting now.

如果设备通过前面详细介绍的 regkey 方法选择退出内存完整性启用,那么这将是内存完整性的 sysprep 中的唯一日志。 如果设备存在兼容性问题,则应在前面的日志中标识该问题,并显示以下错误消息:

SYSPRP HVCI: Compatibility did not pass. VBS_COMPAT_ISSUES 0xXXXXXXXX

下面列举了潜在的 VBS 或内存完整性兼容性问题。 每个问题均由位数组中的单个索引表示,并且错误消息输出由存在的每个错误位产生的十六进制值。

位索引兼容性问题十六进制值体系结构
0不支持的体系结构(例如,x86)0x00000001
1要求支持 SLAT0x00000002x64
2需要安全启动功能0x00000004x64
3需要 IOMMU0x00000008x64
4需要 MBEC/GMET0x00000010x64
5需要 UEFI0x00000020x64
6UEFI WX 内存属性表为必需项0x00000040x64
7ACPI WSMT 表 为必需0x00000080x64
8需要 UEFI MOR 锁0x00000100x64
9已弃用
10需要硬件虚拟化0x00000400x64
11需要 安全启动0x00000800ARM64
12已弃用
13设备未达到所需的最小卷大小 64GB0x00002000x64、ARM64
14需要系统驱动器 SSD0x00004000x64、ARM64
15必需支持 Intel CET(仅适用于 Windows 11 21H2)0x00008000x64
16ARM SoC 与 VBS 不兼容0x00010000ARM64
17需要 8GB RAM0x00020000x64

错误代码和错误标识示例:VBS_COMPAT_ISSUES 0x000000C0

0x000000C0 -> 0x00000080 AND 0x00000040 ->要求有 UEFI WX 内存属性表,且要求有 ACPI WSMT 表

使用 SkTool 检查虚拟机监控程序和 VBS 状态

最新的 Windows SDK 包括 SkTool,这是一个用于排查与基于虚拟化安全性(VBS)和虚拟机监控程序相关的任何问题,或检查其当前状态的有用工具。 SkTool.exe 二进制文件位于 Windows SDK 的 bin 文件夹中。 典型路径为:

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\<Arch>

占位符 <Arch> 对应于系统体系结构(例如 x64、arm64)。

在没有任何命令行开关的情况下运行时,SkTool 会显示虚拟机监控程序和 VBS 的当前状态,同时提供 VBS 启动或 未启动 的动机:

该工具还支持其他不同的命令行开关,最重要的是:

  • /status - 显示虚拟机监控程序和安全内核信息(默认命令行开关)。
  • /lkey - 显示 VSM 主密钥(LKey)预配状态。
  • /mitigations - 显示 NT 和安全内核缓解信息。

具体而言,“/lkey”开关允许你在拒绝接受当前用户的 PIN 或人脸识别的情况下解决增强型 Sign-In 安全性(如 Windows Hello)的问题。

例如,下面是当 VSM 主密钥无法解除密封时的工具报告的内容,因为整个系统的安全状况(由 TPM 测量)中的内容已更改(在本例中,安全启动已被禁用):

C:\Tools>sktool.exe /lkey
Hypervisor / Secure Kernel / Secure Mitigations Parser Tool 1.4

VBS Master Key Provisioning information
Found UEFI Master Key provisioning information.
   The system has tried to unseal the VBS master key with Status 0xC0000225.
   A New VSM Master key has been generated (status 0x0) and stored in a UEFI variable (in plaintext).

关闭内存完整性功能

通过 Windows Defender 关闭

打开 Windows Defender ,选择 Device security 页面,进入 Core isolation 功能进入,找到 Memory integrity 标题

将 On 改为 Off,并通过消息通知中的 Restart 按钮重启 (不通过 Restart 按钮重启可能会不生效)

通过改注册表关闭内存完整性功能

注册表路径如下,将 Enabled 的值从 1 改为 0,然后重启计算机

HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity

命令如下

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

注意

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