第一章节 预备
先提一下在硬件虚拟化架构中的几个概念:
工作模式被分为两类,一类是“根模式操作(VMX Root Operation)”和“非根模式操作(VMX Non-Root Operation)”。一般来讲,“根模式”的操作权限就是某些砖家所谓的“Ring -1权限”。
软件被分为两类,分别是运行在“非根模式”的“客户软件(Guest Software)”和运行在“根模式”的“虚拟机监视器(Virtual-Machine Monitor,简称VMM)”。在硬件架构上,只存在一个虚拟机监视器。但在软件架构上,可以再度虚拟出一个虚拟机监视器来实现硬件虚拟化的嵌套。VMCS,中文名是“虚拟机控制结构(块)”,是“Virtual Machine Control Structure”的缩写,在AMD-V架构中被称为“Virtual Machine Control Block”,即VMCB。
EPT/RVI,中文名分别是“扩展页表”和“快速虚拟化索引”,分别是“Extended Page Table”和“Rapid Virtualization Index”的缩写。EPT是英特尔的技术,而RVI是超威半导体的技术。
无论是英特尔的处理器还是超威半导体的处理器,在硬件虚拟化技术上,概念都是一样的,只是有细节不同罢了。这些细节只有程序员才会去考虑。作为科普,不做讨论。
第二章节 框架
要使用硬件虚拟化技术,首先要启动虚拟机指令集来获得虚拟机监视器的控制权。要停止使用虚拟机监视器,则放弃控制权并停用虚拟机指令集。如果CPU不支持硬件虚拟化技术(或固件上设置禁用硬件虚拟化技术),启动虚拟机指令集会引起“非法指令错误(Invalid Opcode Exception,简称#UD)”。若没有启动虚拟机指令集就去获取虚拟机监视器控制权也同样会引起“非法指令错误”。若已经有其他程序获取了虚拟机监视器的控制权,但没有实现虚拟化虚拟机监视器,即VT嵌套,则该程序尝试获取虚拟机监视器的控制权时会失败。
硬件虚拟化技术的流程生命周期如下:
当客户软件执行了特定的指令时,触发“退出虚拟机事件(VM Exit)”,即非根模式到根模式的转换,此时会保存处理器上下文并执行虚拟机监视器的处理代码,一般来讲虚拟机监视器的处理代码可能也会修改处理器的上下文,处理完成后则恢复处理器上下文,并触发“进入虚拟机事件(VM Entry)”,客户软件继续运行。
用图来解释上面的话可能更能让人看明白(不要嫌丑,因为这是用Windows自带的画图做的)
第三章节 虚拟机控制块
当启动虚拟机监视器时,程序首先要设置虚拟机控制块。虚拟机控制块的概念与结构相当复杂,因此本文只提取和主动防御有关的内容进行科普。
虚拟机控制块的结构中有一部分被称之为“虚拟机执行控制域(VM-Execution Control Fields)”,这个域管理非根模式下的操作。对这个域进行设置会使得处理器在执行特定指令或中断时触发退出虚拟机事件。之前说过,退出虚拟机事件是非根模式到根模式的变化,在根模式中,虚拟机监视器可以修改,读取上下文达到特定的目的。这种特性和HOOK十分相似,因此这也被戏称为“VT Hook”。
注意,硬件虚拟化只可以拦截所有的VT指令和部分x86指令。并非所有指令都可以被硬件虚拟化拦截!
第四章节 扩展页表与快速虚拟化索引
每个客户程序在运行的时候都不知道自身是被运行在虚拟机里的,因此访问内存的时候会访问“真正物理机该访问的地址”。如果真的访问了这个地址,那就宿主机的数据会被访问,因此,英特尔和超威半导体分别引入了“扩展页表”和“快速虚拟化索引”技术,旨在转化虚拟机物理地址为对应在物理机上的物理地址,以防止物理地址冲突。但一般的安全软件在使用EPT/RVI的时候,都不会搞什么“创建虚拟机”,因此只需要直接搞个对等页表,让访问的物理地址依然访问原来的物理地址即可。但是会利用EPT/RVI的其他特性来实现拦截内存的操作。
注意,在这个技术引入之前,硬件虚拟化技术就已经被提出,因此,支持硬件虚拟化技术的CPU不一定支持扩展页表技术或快速虚拟化索引技术。
在虚拟机实际运行时可能会出现“错误配置”,“违规访问”或“日志爆满”。上述情况发生时,将触发退出虚拟机事件。由于程序对虚拟机控制块中虚拟机执行控制域的设置问题,部分违规访问会引起虚拟化异常而非触发退出虚拟机事件。当触发了虚拟机退出事件时,虚拟机监视器就可以在里面做文章了。
错误配置(EPT Misconfiguration):当EPT转换物理地址时,扩展页表的配置不正确。
违规访问(EPT Violation):当EPT转换物理地址时,发现该访问权限不被允许。
日志爆满(Log-Full Event):当逻辑处理器创建日志时发现当前日志已经爆满。至于这日志是关于啥的,不做讨论。
第五章节 硬件虚拟化技术在安全软件上的应用
除了常见的虚拟机项目外,硬件虚拟化技术也被应用在安全软件上。但是,效果和虚拟机一样么?答案是不一样。
由于Win64操作系统引入了PatchGuard,导致在Win32上常用的HOOK方式进行监控变得不再适用。而微软给出的监控方案过于死板,导致恶意软件利用某些漏洞加载驱动后可以直接干掉监控器,这个时候安全软件没有任何可以对抗的办法,因为不允许挂钩。而现有的使用硬件虚拟化技术的安全软件是为了绕过PatchGuard才引入硬件虚拟化技术的。
最经典应用:隐藏钩子过PatchGuard检测
Win64AST的作者曾经发表过一个PoC(
http://www.m5home.com/bbs/thread-8758-1-1.html
)。【注:对SSDT的HOOK方式有很多种,一种是直接修改SSDT表,一种是修改表上函数的函数头实现跳转,另一种就是修改MSR寄存器中关于syscall的寄存器的值】该PoC采用修改MSR的方式实现HOOK,并修改了虚拟机执行控制域来实现拦截MSR的读取,从而实现对PatchGuard的欺骗。
应用之二:VT调试器
当程序发生断点而没有调试器进行控制时,程序会直接退出。当操作系统内核发生断点而没有外部调试器通过如串行端口等调试通信渠道进行控制时,就会直接蓝屏。VT调试器的特点在于可以通过调试异常时通过退出虚拟机事件实现本地承接本地内核断点,也可以通过在进入虚拟机事件时的“事件注入”特性来插入新的断点。
应用之三:反恢复钩子/恶意挂钩
如果挂钩的方式依赖写入内存,则对抗恢复钩子需要使用EPT/RVI的特性。通过设定EPT页为不可写入后,在客户软件内无论用何种方式,比如映射虚拟内存绕过写入保护或者是修改CR0关闭写入保护(注意,这些方法仅仅绕过/关闭了虚拟内存的写入保护,而没有绕过/关闭掉EPT/RVI设定的物理内存的禁止写入,实际上也无法绕过或关闭,除非有CPU本身有BUG),尝试恢复钩子都会触发EPT/RVI的违规访问,从而触发退出虚拟机事件。一旦触发了退出虚拟机事件,虚拟机监视器就可以对恢复钩子的行为进行过滤,从而保护自己。
如果挂钩的方式依赖写入寄存器,则对抗恢复钩子无需使用EPT/RVI的特性。鉴于常见的针对寄存器的钩子也就只有MSR Hook,DRX Hook,而对这两类寄存器的操作都会受到虚拟机执行控制域的管制,因此只需要依赖硬件虚拟化技术本身的特性就可以实现拦截。道理依旧是在触发退出虚拟机事件中进行拦截。
反恶意挂钩的本质是和反恢复钩子一样的,同样是用EPT/RVI设定物理内存的禁止写入页,或用硬件虚拟化原有特性来拦截操作MSR,DRX。
实际上上面的应用方式可以推广出很多新的应用,比如在游戏外挂与反外挂的对抗,安全软件和恶意软件的对抗之类的。注意,硬件虚拟化是CPU的特性,而非操作系统特性,因此只要代码写的好完全可以移植到其他的操作系统平台上使用。
第六章节 Windows 10的新特性
在最新的Windows Internal这本书里,微软的SysInternal组的Mark E.Russinovich说明了Windows 10已经增加的新部件——HyperGuard。该组件于Windows 10 Rs1和Windows Service 2016(周年更新版,版本1607)中被引入,且存在于任何架构(Intel x86或AMD64)的操作系统。该组件可以被简称为HG,但Mark E.Russinovich并未说明如何开启该组件。但说明了一点,当HG启动的时候,尝试挂钩系统关键组件会被HG通过硬件虚拟化技术拦截且不会有“窗口期”,也就意味着尝试写入会引起瞬间蓝屏,而不再是以往的“周期扫描式”。和原来的PG不同,HG被触发时使用的蓝屏代码不是0x109,而是0x18C,但截至现在(2017-06-15),这个蓝屏代码仍没有贴在MSDN里。个人猜测,微软目前的HyperGuard在实现虚拟化嵌套方面的代码写的比较垃圾,因此暂时不公开使用。一旦微软大面积展开应用HyperGuard,则以往的VT过PG的技术将宣告全部失效。
微软将HG基于的新架构称之为基于虚拟化的安全架构,英文名为“Virtualization-Based Security Architecture”,简称VBS Architecture。该架构的概念下,由三个部分组成:超级管理器(HyperVisor),第零虚拟信任等级操作级别(VTL 0)和第一虚拟信任等级操作级别(VTL 1)。其中,VTL是Virtual Trust Levels的缩写。这两个VTL又各自一分为二,分为内核层和用户层。其中VTL 0被分为“内核模式”和“用户模式”,名字和以往一样。而VTL 1的命名发生大变化,分别是“安全内核(Secure Kernel)”和“隔离用户模式(Isolated User Mode)”。
用图来表达可能更清晰明了一些。。。
借助硬件虚拟化的特性,微软在这个架构下又引入了新概念:非特权指令执行保护(Non-Privileged Instruction Execution Prevention,简称NPIEP),在该架构下,NPIEP的作用是防止泄露关键数据,如中断描述符的地址。在NPIEP下,部分可获取系统关键信息的非特权指令仍被允许执行,但取到的地址实际上已经被NPIEP组件处理过了,不再是真实的地址,从而实现了防止诸如溢出攻击之类的攻击。
总结
写这篇文章呢也是因为root1605写了几篇科普贴,突发奇想自己也写篇玩玩。不过好久不发帖了真的得出来装装逼,不然对不起“装逼部部长”的名头不得不承认,写篇科普贴很难,因为写出来的东西还不能出现太高深的词汇。。。
目前在杀软行业里,所谓硬件虚拟化级别的对抗,实际上仍然没有达到真正的“虚拟化”的程度。很多人可能以为这个虚拟化能让病毒只运行在一个沙箱之内,这个想法虽然很正常,但是因为目前安全软件开发人员的思路问题导致硬件虚拟化的用途也变了味。曾经看雪论坛上有很多小白求大佬扔一些VT框架的代码,目的却是为了过保护(头一次听说英特尔还搞作弊软件业务)。。。
本文结束,如果有不理解的内容欢迎回帖提问。
举报/反馈

只有一个天原

23.5万获赞 2.2万粉丝
网罗全网信息,评论世间百态
关注
0
收藏
分享