WHQL HLK测试中HyperVisor代码完整性测试

          内存完整性系统准备就绪扫描工具 hvciscan _ amd64.exe 和 hvciscan _ arm64.exe 用于检查系统是否与内存完整性兼容。内存完整性是 Windows10、 Windows11和 WindowsServer2016或更高版本中提供的基于虚拟化的安全性(VBS)特性。内存完整性和 VBS 改善了 Windows 的威胁模型,并对试图利用 Windows 内核的恶意软件提供了更强的保护。VBS 使用 Windows 系统管理程序创建一个独立的虚拟环境,该虚拟环境成为假定内核可能受到破坏的操作系统的信任根。内存完整性是一个关键组件,它通过在 VBS 的隔离虚拟环境中运行内核模式代码完整性来保护和加强 Windows。内存完整性还限制了内核内存分配,这可能会危及系统,确保内核内存页只有在通过安全执行期函式库内部的代码完整性检查后才能执行,而且可执行页本身永远不可写。内存完整性系统准备就绪扫描工具会通知您设备是否有任何已知的兼容性问题。
    Windows 10有一个叫做设备保护(Device Guard)的新功能,它使组织能够锁定设备,从而提供针对新的和未知的恶意软件变体的高级恶意软件保护,以及高级持久性威胁(APT)。设备保护(Device Guard)可以使用硬件技术和虚拟化将代码完整性(Code Integrity,CI)决策功能与 Windows 操作系统的其余部分隔离开来。当使用基于虚拟化的安全性来隔离代码完整性时,内核内存成为可执行的唯一方法是通过代码完整性验证。这意味着内核内存页永远不能是可写的和可执行的(W + X) ,可执行代码不能被直接修改。
    如何构建兼容的驱动程序由于内存页面和部分永远不可能是可写和可执行的,因此第一步是确保数据和代码的明确分离,并且不要试图直接修改代码页。不要使用可写和可执行的节不要试图直接修改可执行系统内存不要使用内核中的动态代码不要加载数据文件作为可执行的节对齐必须是0x1000的倍数(PAGE _ SIZE)。例如,DRIVER _ ALIGNMENT = 0x1000
    在使用默认设置时,使用最新版本的 WDK 和 VisualStudio2015生成兼容的驱动程序。VisualStudio2013当前将 INIT 部分标记为 RWX。这将很快被修补,但仍然是兼容的,因为 Windows10将自动从 INIT 部分删除写权限(W)。
    如何验证驱动程序兼容性有四个步骤来验证驱动程序兼容性: 
    1。使用驱动程序验证器,并启用新的代码完整性检查
    2.在启用了基于虚拟化的代码完整性隔离的系统上测试驱动程序。
    3.在 WindowsHLK.中运行 HyperVisor 代码完整性就绪测试。
    4.使用设备保护准备工具。
    River Verifier 兼容性 checksDriver Verifier 有一个新的 Code Integrity 选项标志(0x02000000) ,以启用额外的检查来验证这个特性的兼容性。要从命令行启用此选项,请使用以下命令: 
    verifier.exe/Flag 0x02000000/Driver < driver.sys >

注意:
这个命令执行,可能会造成蓝屏,计算机无法启动。

Windows 的企业版和服务器版支持基于虚拟化的代码 IntegrityVirtualization 安全性。要启用基于虚拟化的代码完整性保护,最简单的方法是使用如下所述的 gpedit。这将打开 Hyper-V 和独立用户模式,并启用功能:

  1. Run gpedit to edit local Group Policy
  2. Under Computer Configuration -> Administrative Templates -> System -> Device Guard , choose Turn On Virtualization Based Security
  3. 在这里插入图片描述
    在这里插入图片描述
  4. In the detailed configuration dialog that appears, choose Enabled , and then select Enable Virtualization Based Protection of Code Integrity
  5. Reboot Virtualization-based protection of Code Integrity is now enabled.
    HLK 测试(桌面和服务器)一个新的 HLK 测试,HyperVisor 代码完整性准备测试,需要通过 HVCI 驱动程序才能被微软批准签署。台式机和服务器 SKU 都需要与 HVCI 兼容的驱动程序。HLK 测试是一个基本的测试编写,以确保 HVCI 兼容的驱动程序正确加载和运行的操作系统。虽然简单地通过 HLK 测试就足以为驱动程序的微软签名,我们强烈建议彻底的功能测试与设备保护启用。例如,可能存在错误编码的内存分配,违反了 NX 保护,导致测试无法捕获的故障。驱动程序作者应该在保持设备保护启用的同时彻底测试驱动程序。在驱动程序开发和 HLK 测试期间,应该禁用设备保护,因为设备保护可能会阻止加载驱动程序。
    设备保护准备工具设备保护和证书保护硬件准备工具也可以用来检查设备上所有安装的驱动程序的 HVCI 兼容性。下载包含一个自述文件,其中包含使用信息。请注意,当运行准备工具时,设备保护必须被禁用,因为设备保护可能会阻止驱动程序加载,并且驱动程序将不可用于准备工具进行测试。有关准备工具的详细信息,请参阅使用设备保护准备工具来评估 HVCI 驱动程序的兼容性。
    Windows 10 Creators Update: Enabling Device Guard 基于虚拟化的代码完整性保护可能导致系统在启动过程中崩溃我们注意到 Windows 10 Creators Update 引入的一个问题,它可能导致启动过程中的系统失败,这些系统已经启用了基于设备保护的基于虚拟化的代码完整性保护功能,并且正在运行某些以前工作的第三方驱动程序。我们已经解决了这个问题,修复程序计划在2017年5月23日发布。我们建议您在升级之前禁用“基于设备保护的基于虚拟化的代码完整性保护”功能,或者在修复程序发布之前延迟升级,并且在修复程序发布之前不要在 Windows 10 Creators Update 上启用该功能。
    常见问题: 现有的驱动程序如何?我是否需要重新构建这些驱动程序来使它们与 Windows10一起工作?看情况。许多驱动程序将已经是兼容的。如果对 WDK 和 VisualStudio 的旧版本使用标准设置,一个已知的问题是 INIT 部分被标记为 RWX。然而,在 Windows10中,W 将被自动剥离,所以如果这是唯一的问题,那么驱动程序将是兼容的。如何验证是否启用了基于虚拟化的代码完整性保护。最简单的机制是运行系统信息应用程序(msinfo32)。查找以下一行: “设备保护安全服务运行”。它应该报告: “ Hypervisor 强制执行代码完整性”。还有一个用于检查使用管理工具的 WMI 接口。我可以验证基于虚拟化的代码完整性保护是从内核以编程方式启用的,以改变驱动程序的行为。是的,你可以使用 ntquerySystemInformation: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85)。SYSTEM _ CODEINTEGRITY _ INFORATION 结构公开了一个新的0x400值,表示正在打开基于虚拟化的代码完整性保护。如何修复兼容性问题? 除了双重检查没有 W + X 页面和驱动程序部分是否如上所述正确对齐之外,最有可能的问题是内存分配不当。有关内存分配的代码分析警告的信息可在下面的 MSDN 网页找到: 驱动程序代码分析警告下面的 MSDN 链接显示了一些常用的导致可执行内存分配的 API 的例子,以及一些修复示例:
    C30029
    C30030
    C30031
    C30032
    C30033
    C30034
    C30035
    使用下表解释输出,以确定需要修改哪些驱动程序代码来解决不同类型的 HVCI 不兼容性。
    1.执行池类型
    调用方指定了可执行池类型。调用请求可执行内存的内存分配函数。确保所有池类型都包含非可执行 NX 标志。
    2.执行页面保护
    调用方指定了一个可执行页保护。请指定一个“无执行”页保护掩码。
    3.执行页映射
    调用方指定了一个可执行内存描述符列表(MDL)映射。确保使用的掩码包含 MdlMappingNoExecute。有关更多信息,请参见 MmGetSystemAddressForMdlSafe
    4.执行-写入部分
    该图像包含一个可执行和可写的部分。
    5.路段对齐失败
    图像包含一个未对齐页面的部分。节对齐必须是0x1000(PAGE _ SIZE)的倍数。例如,DRIVER _ ALIGNMENT = 0x1000
    6.不支持的 Relocs
    在 Windows10版本1507到1607中,由于使用了位址空间配置随机载入(ASLR) ,地址对齐和内存重定位可能会出现问题。操作系统需要将链接器设置其默认基地址的地址重新定位到 ASLR 分配的实际位置。此重定位不能跨越页边界。例如,考虑一个64位地址值,它从页中的偏移量0x3FFC 开始。它的地址值在偏移量0x0003处与下一页重叠。在 Windows10版本1703之前,这种类型的重叠重置不受支持。当全局结构类型变量初始化器有一个指向另一个全局变量的不对齐指针时,就会出现这种情况,其布局方式使链接器无法移动变量以避免跨越重定位。链接器将尝试移动变量,但在某些情况下它可能无法做到这一点,例如大型不对齐结构或大型不对齐结构数组。在适当的情况下,应该使用/Gy (COMDAT)选项来组装模块,以允许链接器尽可能地对齐模块代码。
#include <pshpack1.h>

typedef struct _BAD_STRUCT {
USHORT Value;
CONST CHAR *String;
} BAD_STRUCT, * PBAD_STRUCT;

#include <poppack.h>

#define BAD_INITIALIZER0 { 0, "BAD_STRING" },
#define BAD_INITIALIZER1 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0

#define BAD_INITIALIZER2 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1

#define BAD_INITIALIZER3 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2

#define BAD_INITIALIZER4 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3

BAD_STRUCT MayHaveStraddleRelocations[4096] = { // as a global variable
BAD_INITIALIZER4
};

6.可执行文件中的 IAT
导入地址表(IAT)不应该是内存的可执行部分。当 IAT 位于内存的只读和执行(RX)部分时,就会发生这个问题。这意味着操作系统将无法写入 IAT 来为引用的 DLL 设置正确的地址。这种情况可能发生的一种方式是在代码链接中使用/MERGE (CombinSections)选项。例如。Rdata (只读初始化数据)与。文本数据(可执行代码) ,这是可能的 IAT 可能最终在一个可执行的内存部分。

哪些 API 可能受到影响? 以下列出的 API 不是为系统使用而保留的,这些 API 可能受到影响,详细请参考下面网址:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff544501(v=vs.85).aspx

内存完整性的兼容性验证驱动程序兼容性有三个步骤:
1.使用驱动程序验证程序 (请参阅下面的部分,) 启用了代码完整性兼容性检查。
2.在启用了内存完整性的系统上测试驱动程序。
3.在 Windows HLK 中运行虚拟机监控程序代码完整性就绪情况测试。

问题排查:
1.测试服务器的当前区域非美国区域,则修改当前区域为美国,测试机系统语言包没有英语语言包,添加 英语语言包。
在这里插入图片描述
在这里插入图片描述
2.有关 HLK 测试失败的常规故障排除,请参阅排查 Windows HLK 测试失败问题。
https://learn.microsoft.com/zh-cn/windows-hardware/test/hlk/user/troubleshooting-windows-hlk
在这里插入图片描述

3.下载最新的筛选器
https://learn.microsoft.com/zh-cn/windows-hardware/test/hlk/user/windows-hardware-lab-kit-filters
HLK 和 HCK 筛选器存储在同一个 HCKFilterUpdates.cab 筛选器文件中,HLK 没有单独的文件。
查看自述文件,了解如何在控制器上安装筛选器。

  1. 将 HCKFilterUpdates.cab 下载到控制器。

  2. 打开下载的 HCKFilterUpdates.cab 文件。

  3. 单击 zip 文件中的 UpdateFilters.sql 并将其拖到桌面。
    4)单击桌面上的 UpdateFilters.sql 文件并将其拖到 %Program Files (x86)%\Windows Kits<version>\Hardware Lab Kit\Controller 目录。
    其中 是 HLK 的版本。
    5)关闭 HLK Studio 的所有实例。
    6)从该目录运行 UpdateFilters.exe 命令。
    4.检查执行日志
    在 Windows HLK Studio 中,右键单击失败的测试结果中的任务结果。
    使用“基础结构”菜单项查看日志类型。
    检查“执行日志”选项是否被禁用(变灰)。
    如果执行日志缺失,则此失败可能是由已知问题导致的。 解决方法就是重新运行测试,以便将日志复制回控制器。

     测试在 HLK Studio 中标记为失败,但 te.wtl 日志只显示通过结果
    

如果测试在 HLK Studio 中标记为失败,但 te.wtl 日志只显示通过结果,则可以通过执行以下步骤来获取导致失败的错误:
右键单击红色的“运行测试”图标
选择“错误”
一个对话框会出现,其中包含所发生错误的说明。

5.代码完整性设置
必须先使用服务器管理器启用 Windows Server 2016 的基于虚拟化的安全性 (VBS) 功能。
启用该功能后,必须创建并设置以下注册表项:
HKLM\System\CurrentControlSet\Control\DeviceGuard
HypervisorEnforcedCodeIntegrity:REG_DWORD
0 or 1 (disabled, enabled)
6. S 模式全新安装 Windows 10 时启用内存完整性。 默认情况下,还在所有安全核心电脑上启用。标识内存完整性状态
以下易失性注册键反映了内存完整性的状态:
注册表项 值
HKLM\System\CurrentControlSet\Control\CI\State HVCIEnabled
检查内存完整性状态的其他方法是查看基于虚拟化的安全服务正在运行下的 MsInfo,或者参阅 Windows 安全应用中的核心隔离设置页面,以查看内存完整性的值。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值