虚拟机自省是保证虚拟机安全的一个重要的概念和技术,英文virtual machine introspection(VMI),第一次提出虚拟机自省技术的应该是Tal Garfinkel在论文“A Virtual Machine Introspection Based Architecture for IntrusionDetection”。虚拟机自省的技术思想大概是这样子的:一台虚拟机被赋予hypervisor(虚拟机监控器)的权限,去监视其他的虚拟机;监视是在一个隔离的和安全的虚拟机中进行的,监视的过程会得到操作系统的内存,磁盘以及CPU的信息等。

   XenAccess项目的主要是建立了一个用于自省的函数库(当时是基于Xen hypervisor),它可以提供一个特权域,用来获取其他客户机上的操作系统的信息。现在XenAccess项目已经不再更新和维护,XenAccess已经用于LibVMI项目,可以在LibVMI项目中找到VMITools更新的自省工具。XenAccess的信息可以在网站http://code.google.com/p/xenaccess/上查看。

  下面我们看一下关于vmitools(Virtual machine introspection tools)的介绍,原文可以在http://code.google.com/p/vmitools/中找到。LibVMI也是一个用于自省的函数库,它主要功能集中在虚拟机内存的读写上。另外,LibVMI也会提供一些函数用于获取CPU寄存器,中断或停止中断一台虚拟机,打印二进制数据等。LibVMI设计是可以运行在多种虚拟化平台上的,暂时只支持Xen和KVM。当虚拟机内存快照保存为文件的时候,LibVMI也支持读物理内存的快照。

主要的技术细节

  本质上说,内存的自省就是从一台虚拟机上获得另一台虚拟机上的内存视图的过程。表面上听起来很容易实现,比如Xen中还提供有可以帮助这种内存获取方式的函数(KVM中没有)。

  但是其实有一个很难的问题,就是两台虚拟机之间存在语义鸿沟。比如说,查找虚拟地址时,LibVMI必须进入用户虚拟机扫描页表;然而,为了扫描这些页表,LibVMI必须首先知道页目录的位置。

  以下是虚拟机自省工具使用的一个例子——使用自省去查看一个内核符号。

程序请求区查看一个内核符号;

2.LibVMI找到相应内核符号的虚拟地址;

3.匹配内核页目录找到正确的页表;

4.匹配页表找到正确的数据页;

5.数据也返回到LibVMI函数库;

6.LibVMI返回VMI请求的数据(可能需要匹配许多页)。

虚拟机开启虚拟化 自动 软件CPU 和MMU 虚拟机自省_libvmi

最近刚开始看虚拟机自省,也是刚刚看到XenAccess和vmitools,就把这些概念性的东西翻译出来,其实对很多地方还不理解,如有不对的地方请指出,互相交流,互相学习。

参考文献:

[1]XenAccess,http://code.google.com/p/xenaccess/

[2]VMITools,http://code.google.com/p/vmitools/

[3]Garfinkel, Tal, and Mendel Rosenblum. "A Virtual MachineIntrospection Based Architecture for Intrusion Detection." NDSS. Vol. 3.2003.n