Windows 10的基于虚拟化的安全(Virtualization-Based Security)

Windows 10搞出来了个“基于虚拟化的安全”(Virtualization-Based Security,简称VBS)。这玩意使用了处理器虚拟化技术,因此对于那些使用硬件虚拟化的软件会有较大的影响。接下来讲一些我自己所了解到的东西,以及实验出来的东西。

首先是Hyper-V。Hyper-V虽然是微软搞出来的虚拟机监管器(Virtual Machine Monitor,以下简称VMM),而VBS确实需要VMM来实现,但启用VBS在原则上不需要在系统中安装Hyper-V,因此删除掉Hyper-V并不能停用VBS。此外,通常情况下,Hyper-V本来就是要另装的。
VBS如何启动?在Windows 10中,可以打开组策略(gpedit.msc),依次点开计算机配置,管理模板,系统,Device Guard,最后点开“打开基于虚拟化的安全”,配置这个选项时,选择已启用,在“选择平台安全级别”选项里选择“安全启动”,在“基于虚拟化的代码完整性保护”中,选择“无锁启用”。当然咯,也可以选择“使用UEFI锁启用”。后面的配置就是VBS的一些其他功能,在本文中也不需要配置其他的。配置完之后重启。
启动VBS需要什么条件?微软规定系统使用UEFI并且安全启动(Secure Boot),因此现今VMware的Windows 10虚拟机就可以启动VBS了。以VMware Workstation 15为例,在配置虚拟机时,在“硬件”选项卡的“处理器”选项中,勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI”复选框。在“选项”选项卡的“高级”选项中,在“固件类型”框里选择UEFI,并且勾选“启用安全启动”复选框。
由于实机的固件各不相同,因此配置Secure Boot的步骤不尽相同,所以本文就不说实机了。在实机里配置了Secure Boot后也别忘了
如何查看VBS是否正在运行呢?可以通过PowerShell查询WMI的方式。打开PowerShell,输入下列命令:

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

可以发现PS输出了好几行文本,每行具体是什么意义可以查询MSDN:https://docs.microsoft.com/en-us/windows/security/threat-protection/device-guard/enable-virtualization-based-protection-of-code-integrity#validate-enabled-windows-defender-device-guard-hardware-based-security-features
这里也简单说下,首先是AvailableSecurityProperties,意思是有哪些硬件特性可用,如果按照我刚才的方法配置VMware的Windows 10虚拟机,那么这里应该输出了{1, 2, 5, 6}。
然后是RequiredSecurityProperties,意思是启动VBS需要哪些硬件特性,如果按照我刚才的方法配置组策略,那么这里应该输出了{1, 2}。
接着是SecurityServicesConfigured,意思是配置了哪些VBS功能,如果按照我刚才的方法配置组策略,那么这里应该输出了{2}。
随后是SecurityServicesRunning,意思是哪些VBS功能正在运行,如果按照我刚才的方法配置组策略,那么这里应该输出了{2}。
最后是VirtualizationBasedSecurityStatus,意思是VBS状态码,为0是禁用了VBS,为1是启用了VBS但未在运行,为2是VBS正在运行。如果你的配置没有问题的话,这里应该输出了2。
启动了VBS后,最直观的结果就是硬件虚拟化被占用了,使用cpuid指令查询硬件虚拟化技术时会发现它返回处理器不支持使用硬件虚拟化技术。如果你试图玩VMware,会发现VMware提示和Device Guard/Credential Guard不兼容,需要你关闭它们。
微软搞VBS难道不想让用户玩虚拟机么,答案自然是否定的。微软为此提出了Microsoft Hypervisor Top-Level Functionality Specification文档,这份文档可以简称TLFS或者MSHV-TLFS。
TLFS文档下载地址:https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
关于这份文档,我们可以简单理解以下两点:
首先,微软在给Windows虚拟机优化。在Windows虚拟机启动时,检测虚拟机,如果这个虚拟机提供微软标准的接口,那么Windows就用这个接口从而优化。除了微软的Hyper-V之外,VMware虚拟机也提供这个接口,而Xen虚拟机也有。
其次,微软试图统一Intel VT-x和AMD-V这两种硬件虚拟化技术到一个平台之上。微软自己提供这个平台,让虚拟机软件调用这个平台来运行虚拟机。不过我们可以看出,VMware鸟都不鸟微软的这个平台,依然我行我素地直接使用硬件虚拟化技术。
有人鸟这个平台吗?当然有,要是微软的Hyper-V都不鸟这个平台,那微软可真是吃饱了撑。在启用VBS的时候,可以选用Hyper-V来玩虚拟机。我简单的玩了玩,感觉最奇葩的就是玩Windows虚拟机时竟然是以远程桌面的形式连接到虚拟机上的。如果对虚拟机不那么挑剔的话,玩玩Hyper-V大概也算是个较好的选择吧。
最后讲一些编程相关的吧。但本文就讲讲思路,不贴代码了。
首先谈谈检测VBS是否运行,前面说过可以用WMI检测,不过WMI作为系统服务,可以禁用,如果禁用可就没法玩了。这里提一种我自己的检测方法:
通常来说,如果需要检测VBS是否运行,肯定是因为自己要玩虚拟机,我们可以用CPUID指令查看是不是处理器不支持硬件虚拟化。eax=1时ecx的第五位表示是否支持Intel VT-x,而eax=0x80000001时ecx的第二位表示是否支持AMD-V。如果复位就表示不支持硬件虚拟化,如果支持,那就可以断言VBS并没有运行。“不支持硬件虚拟化”确实是VBS运行后的一大特征。VBS有一个另外一个特性,那就是它的虚拟化确实是用了Hyper-V。之前提到过检测VMware虚拟机可以通过eax=1时cpuid返回的ecx的最高位来判断,而检测Hyper-V也是同理。当ecx最高位置位时,就表示存在虚拟机。然后,令eax=0x40000000,执行cpuid指令,接下来,以ebx,ecx,edx的顺序,拼接出一个ansi字符串。VMware会返回“VMwareVMware”,而Hyper-V会返回“Microsoft Hv”。因此如果这个字符串是“Microsoft Hv”就可以认为Hyper-V的虚拟机正在运行,顺便看看eax的值以确认最大支持到多少,按照TLFS文档,这里eax至少会是0x40000005。然后令eax=0x40000001,执行cpuid指令后,将返回的eax视为四个字符的字符串,看看是不是“Hv#1”。这表示VMM是否提供了微软标准的接口。到此,我们确认了我们正运行于Hyper-V之下。
接下来是看看VBS的配置,既然是配置那当然去看注册表咯。打开“”HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard””注册表键,然后看看里面有些什么键值。我们要找的键值是“EnableVirtualizationBasedSecurity”,如果不存在或者键值为零,就表示VBS未被启用,反之则表示VBS已经启用。
总的来说,思路就是先看是不是支持硬件虚拟化,如果支持就表示VBS未启动,再看是否存在虚拟机,如果不存在就表示VBS未启动,接着看是哪家的虚拟机,如果不是微软的就表示VBS未启动,最后看VBS是否被配置为启动。

原创文章,转载请注明: 转载自Windows内核安全驱动编程

本文链接地址: Windows 10的基于虚拟化的安全(Virtualization-Based Security)

1人评论了“Windows 10的基于虚拟化的安全(Virtualization-Based Security)”

  1. 先说之前提到的检测VBS啥的,由于安装Hyper-V,WHP(Windows Hypervisor Platform),VMP(Virtual Machine Platform)等也会造成硬件虚拟化接口被占用,因此检测注册表纯属多此一举了。先判断是否支持硬件虚拟化,没有的话只需再判断Hyper-V即可。
    微软搞出来的这个平台并不是没人鸟,安卓模拟器就开始使用Windows Hypervisor Platform给模拟器加速了。另外我之前还说过VMware鸟都不鸟这个这个平台,不过现在看来是我错了,VMware Workstation 15.5.5支持在Windows 10 2004上与VBS兼容了。下载地址:https://www.vmware.com/go/getworkstation-win注意是Windows 10 2004,老版Windows 10启用VBS后仍然不能运行VMware Workstation。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注