123

 

[转]走近虚拟机——McAfee研究员孙冰谈虚拟机技术和虚拟机安全

一、关于虚拟机技术的背景知识

1、Emulator和Virtualizer的区别

  现在很多杀毒软件里面有所谓的智能脱壳功能,其实它就是用一个Emulator模拟器来解释执行机器指令,比如说x86的机器语言是一条一条来被翻译执行的。而Virtualizer并不是由软件来模拟执行,而是使这个代码尽可能自然地在当前的处理器上运行,而虚拟机监控器只需要在某些特定时候进行干预,比如说来处理一些特权指令操作。

Emulator中比较有名的一个是BOCHS,可能有一些朋友用它来进行过一些操作系统级的调试。这是一个开源的软件,在网上可以下载到。

Virtualizer比较有代表性的是VMware、VPC这些软件。

VMM是虚拟机管理器,也叫做虚拟机监控器,其实它就是一个软件层。这个软件层是在被虚拟执行的操作系统和真实的硬件环境间由软件构架的一套中间层,由它来负责对下面的硬件,比如CPU处理器、硬件等进行虚拟。我们后面还会看到对VMM的结构和工作原理的介绍。

2、Host OS和Guest OS

  Host OS和Guest OS非常好理解,在虚拟机里运行的系统,我们称之为客操作系统。对于二型VMM架构它的主操作系统,我们叫做Host OS。

3、VMM的类型

  下面我们介绍一下VMM的类型,有两种:一种是在裸机上的架构,第二种是混合型,就是有主操作系统的VMM,典型代表有:

  1. Type I VMM(Bare Metal):VMware ESX, Xen, MS Hyper-V
  2. Type II VMM(Hosted/Hybrid):VMware Workstation, MS VPC

图1描述的是I型VMM的结构。我们可以看到虚拟机监控器VMM是装在裸机上的,在这个上面我们会有多个并发运行的客操作系统Guest OS。

图1  I型VMM结构图

 

对于有Host OS的II型VMM是图2这样的,虚拟机软件本身是Host OS的一部分,通过虚拟机软件,使VMM和Guest OS运行在同一个线性地址空间里来虚拟Guest OS的执行。另外VMM还有一个功能,从主操作系统的上下文空间向客操作系统的上下文空间进行切换,由它进行控制。

图2  II型VMM结构图

 

  我们原先用到虚拟机的技术,多半都是由纯软件来实现的,因为我们在硬件上没有对虚拟的直接的支持。用软件来实现虚拟,是非常困难,而且非常非常有技巧的一件事情。可能用过VMware的朋友都有一个疑问,它到底是怎么实现的?怎么来同时运行两个操作系统?VMware在里面的操作系统运行在一个Windows窗口里面,外部的操作系统也在并发执行,怎么做到的?其实这用到了很多比较复杂的技术,包括所谓的执行特权级压缩。也就是说,在窗口里运行的客操作系统的内核模式,实际上不是在ring0执行的,而是被降级到ring1执行的。这样就能保证它里面发出的一些特权指令的调用可以被虚拟机监控器所捕获到,来进行模拟。而它里面用户态的代码是自然在CPU上执行的,这就是为什么执行的效率相比起其他的一些模拟器来说我们会觉得比较快,因为它大部分的指令全是在CPU上自然执行,不需要虚拟机监控器来进行干预。

但是由于x86这个体系本身对于虚拟来说有一些不支持的地方,比如一些敏感的但是不可捕获的指令,比如说像SIDT这条指令,即便在ring3下执行也不能产生异常,VMM抓不到它,这对虚拟来说是一个挑战。所以VMM对于Guest OS的ring0采取的是二进制翻译,而对ring3采取的是直接执行。下面这条是为了对付这种敏感但是不可虚拟的指令,而采用的二进制翻译的机制。

4、用软件来实现MMU

还有一个比较关键的技术,就是所谓的用软件来实现MMU(内存管理单元),影子页表。在图2所示的II型VMM里面,客操作系统认为自己是独占线性地址空间,而且觉得这个物理内存全部是它的。但是我们可以看到,VMM是跟它运行在同一个线性空间里,而且只是划分了一部分物理内存给它使用,所以必须使用软件虚拟MMU的方法来使它认为自己好像是独占这个空间的。

Guest OS有自己的页表,但是这个页表不能被硬件直接使用,而硬件的页表是由VMM控制的。Guest OS自己的页表和实际的硬件设置之间有一个对应关系,这种对应关系是由VMM来维护的。

由于软件虚拟技术比较复杂,而且效率比较低,所以近几年处理器直接加入了对虚拟的支持,即所谓的硬件虚拟。我们可以看到,Intel和AMD都有所动作,Intel的叫做VT-x,AMD的叫做SVM技术。当然后面还有一些别的后续技术,比如说VT-d和IOMMU。

图3是一个VMware VMM的总体架构图,我们可以看到中间有一条竖线,竖线左边是主操作系统环境。好比说你在一个Windows的系统里面装VM,里面来跑Linux,于是在右边的客操作系统就是Linux的上下文环境,左边就是Windows的环境。VMM这套代码是地址不相关的,它可以运行在线性地址空间最高的4MB区域里,它可以跟客操作系统Linux运行在同一个空间里,并且虚拟它的一些操作,比如内存访问、特权指令的执行、设备的IO访问。它会把虚拟IO的访问直接送到设备模拟器里进行模拟。比如在Linux里面要访问一个硬盘,实际这个硬盘是虚拟出来的,是由主操作系统里面特别大的一个文件做后备的。所以当虚拟机监控器捕获到Linux访问硬盘的操作后会切换回主操作系统,并且会把IO请求送到主操作系统里的设备模拟进程,进行设备的模拟,它会把硬盘IO模拟成对大文件的某一个偏移的读写,这相当于对磁盘的扇区进行读写。

图3  VMware VMM总体架构图

 

二、最近比较热门的基于硬件的虚拟技术和虚拟机安全的概念

1、最近比较热门的基于硬件的虚拟技术
  最近硬件虚拟技术变得比较热门。大概从2006年某月有第一款处理器出来号称支持硬件虚拟,到现在新买的笔记本上基本都可以看到对虚拟技术的支持,但是你仍然需要在BIOS中设置一下。这里我想多说两句,有很多的这样的硬件功能都需要在BIOS中进行设置,否则它们不会起作用,而变成了一种摆设,比如说NX、TPM等,你需要先把它们在BIOS设置中使能一下。

硬件虚拟技术,总结下来分为三代:

  1. 第一代:Intel VT—X 和AMD SVM,这些主要是提供对CPU指令执行部分相关的虚拟支持,后面会介绍一下它们的架构;
  2. 第二代:加入了对嵌套/扩展页表的支持;
  3. 第三代:支持对DMA操作的保护,我们知道,一个IO设备如果具备DMA总线主控功能的话就能够通过DMA操作直接读写你的内存,这对于虚拟机监控器来说是一件不能够接受的事情,所以第三代虚拟技术提供了对DMA访问的虚拟。

下面我们就来看看Intel VT的技术构架。

  其实VT跟AMD的机制相似,但是指令集不太一样,也不完全兼容。VT技术是一个家族,包括VT-X和VT-I和VT-D,主要的观念就是提供了特殊的根模式和非根模式。根模式是处理器支持的一种特权模式,它是留给VMM来使用的,是一种真正意义上的ring0模式;而非根模式则是给VM中的客操作系统使用的。

除了增加了额外的模式,处理器还提供了一套VMX指令集,大概有十种,还提供了一个所谓的虚拟机控制结构VMCS,AMD叫VMCB,意思是一样的。

  这个是硬件虚拟的工作原理,首先VMM会在VMCS里设置一些条件,然后让VM自己去运行,当什么时候VM中产生一个退出事件,控制权就会再回到VMM这里。这个退出条件可能包括特定指令的执行、IO操作、异常,或者是访问了控制寄存器、MSR模式特定寄存器。这些都不需要VMM自己来实现,而是完全依赖硬件上的实现,就可以捕获VM里发生的它所感兴趣的事件。VMM只要搭建起这个环境后等待就可以了,当VM中相关的事件发生了,比如说访问了某个内存页面,比如说执行了某个特定的指令,它就可以自动抓到这个事件,而不需要用软件的方法去降低VM的执行特权或是进行二进制翻译,这就是大大地方便了虚拟机监控器的实现。

  创建一个VMM/VM的基本步骤,首先要通过CPUID这条指令确定这台机器的处理器是否支持硬件虚拟特性,然后通过相关的MSR判断这个虚拟功能有没有被disable掉,接着你在控制寄存器CR4中把VMXE位设置一下,初始化VMCS中Guest OS的初始状态并填充一些退出条件,执行VMLAUNCH之后,CPU的状态就从VMM转入到Guest OS里面,它会一直去执行,直到有一个VMM退出条件满足,控制权再次回到VMM手里,然后由VMM进行模拟,等到该事件处理完成之后,VMM恢复Guest OS的状态,再一次执行VMLAUNCH,并一直循环这个过程。

2、目前对硬件虚拟技术的应用

  目前对硬件虚拟技术的应用,大致分为两大类。一类是反面的,用硬件虚拟技术来实现Rootkits。现在我所知道的,在2006年拉斯维加斯Blackhat上有两个比较精彩的演讲,一个是使用了AMD SVM实现的BluePill。另外还有一个是用VT实现了类似的功能。除了利用硬件虚拟来实现Rootkits,还可以用它来做一些好的事情,比如用它做IPS。今年的Blackhat上有一个演讲,实现了一个叫做Viton的HIPS,其实在国内也有人在进行着类似的研究。

  先看看BluePill,它的工作流程跟我刚才讲的大致类似。BluePill是利用一个驱动程序进行加载,加载完成之后,等于是把当前的操作系统装进了一个虚拟机里,等控制权再次返回的时候,这个系统已经运行在由BluePill控制的虚拟机里面。它的好处在于和一般的Rootkits不一样,它并不是操作系统的一部分,常规的方法检测不到。你不能看到它,但是它可以看到并控制你,因为它的实现比你更底层。

  但是也不是说这种基于虚拟技术的Rootkits是完全不可检测的,其实针对它也有一些检测的方法。比如说通过虚拟机嵌套的方法,在虚拟机里面再产生一个虚拟机,如果Rootkits不支持嵌套的虚拟机模拟,就无法规避这种检测。还可以通过计时的方法,有一些指令的执行是通过虚拟出来的,所占用的CPU周期的肯定会比真实的时间要长,可以通过这种方法来进行检测。当然还可以通过所谓的TLB勒谱,通过物理内存扫描,还有利用DMA进行攻击。另外比较有意思的是有一种方法是通过Chipset,北桥里面嵌入的一个微控制器来进行检测,我最开始对这种东西的了解是缘于前一阵花了一些时间去研究AMT技术,AMT代码实际上并不是执行在CPU中,是执行在北桥里面相当于是一个嵌入式控制器里。这种代码本身可以操纵微控制器的DMA功能,能够读写主存里任意的内存地址,包括系统管理模式内存。通过这种方法,可以在物理内存中来检测到Rootkits。

  基于硬件虚拟技术的HIPS可以检测并阻止所有VMX指令的执行,可以用来锁定控制寄存器和某些重要的MSR不被修改。它可以保护一些重要的操作系统的表,比如说像IDT表、SSDT表,也可以保护NTOSKRNL内核中所有的代码页面不被修改,这是传统的IPS无法做到的。我个人一直有一个观点,就是现在的恶意软件和IPS(包括杀毒软件),它们的运行级别是一样的,所以它们之间的竞争只是一种猫和鼠的竞争,谁先加载的早一点,就可能会占有更多的优势。所以使用这种基于硬件虚拟技术的IPS,可以使你的检测软件获得更高的特权级,这样的话,它在对抗中会占到一些上风。这个恐怕也是今后主机入侵检测和防御系统的一个发展趋势。但是它也有一些弱点,比如说我们看到的它可以监控到的事件全是些跟硬件相关的事件,比如像内存读写、IO访问、指令的执行等,而对于文件系统和网络协议栈,还有包括进程、线程等这些东西却一无所知。所以我的想法是把一个基于硬件虚拟技术的IPS和一个操作系统内部的防护软件关联起来形成一个完整的防护体系。但目前还没有看到任何一个安全厂商实现,我估计在不久的将来会有这种新的产品出来。

3、利用VMware的标准来实现虚拟机本身的安全

  下面我们讲讲利用VMware提出的一套标准来实现虚拟机本身的安全。我们可以看到,基本上所有的系统上都有相应防护解决方案:File System上有AV保护,Mail Server上有ANTI Spam保护,Network Stack上有Firewall保护,Browser上有Anti Phishing保护,OS上有HIPS保护。那么,Hypervisor应该由谁来保护呢?

所以需要提出一套理论标准来保护VMM自身的安全。VMsafe实际上正是提供了一套API可以使第三方软件准确地获知VM内部发生的事件,比如说像内存访问事件,CPU上的一些状态信息,一些系统表的遍历。我刚开始在研究VMware的时候就一直在疑惑,它究竟有没有一个内部的调试接口,VM内部跑的状态怎么获取?现在这些问题都得到了解决,我们可以自己写一个程序对VM里面跑的系统进行实时的调试和跟踪。

在今年加拿大举办的CanSecWest会议有一个来自VMware的研究员做了一个关于VMsafe的演讲,他利用Vmsafe API实现了一个小工具,这个工具是在VM外面运行,VM里面运行Filemon时会去修改SSDT表来监控文件的操作,在外面运行的小工具就会知道里面发生的一切,而且可以进行干预。比如说我想让VM中的系统在某些内存访问的时候产生一个断点,然后外面就可以知道里面运行的程序在做什么。

 

本文主要内容整理自McAfee研究员孙冰先生在2008中国软件安全峰会(www.sinoit.org.cn)上的演讲。

posted on 2009-01-10 13:09  Hiu  阅读(539)  评论(0)    收藏  举报

导航