虚拟机监控2

曾经以为不在虚拟机内部安装一些东西,是无法获得虚拟机内部的信息的。经过几天的学习,发现这是一种错误的看法,由于种种原因,在系统的外面也是一样可以获得系统内部的很多信息,主要原因是由于很多信息都有固定的位置在内存中,而且我们需要的信息。恰恰CPU也要用到。事实上,系统所有的有用的信息,如果不能被CPU访问,那就是没用的信息,因此我们掌握了CPU可以说就是找到我们想要的信息。这样一来,就好办多了。

更加具体的技术路线还要讨论,找一个最简单可行的方法来搞。

虚拟机监控

今年的信安大赛,宿舍的同学怂恿我跟了另一个老师,做的东西涉及到了虚拟机行为监控,我们使用的虚拟化平台是kvm,主要的原因就是它是一个linux平台的源码开放的虚拟机管理程序,效率很好,易于修改。

kvm本身并没有提供很多监控功能,使用libvirt库也只能对性能进行一些监控,跟我们的要求还有一些差距,至于为什么不使用windows平台的vmware,主要是因为vmware本身提供的机制于我们的想法不同,而且又不能修改,因此转战kvm,kvm有很不错的发展前景,Red Hat已经将其集成到了企业版本中,代替xen成为红帽的虚拟化软件。

我们要做的是不在guest os 内部安装任何东西的前提下对其行为进行监控,学长提议作出了API调用的监控,我认为这是完全不可能的。

分析如下,考虑 :

P1申请一个区域M,并允许VP1在使用,在另一个与P1同层次的P2看来,M归于P1所有,只有P1可以控制这段区域。区域M中包含VP1的代码和数据,P1为其提供执行环境,但是P1对VP1的代码和数据是完全不能区分的,VP1在M中的布局P1也是毫不知情的,除非VP1具有某些特征。

只考虑我们的项目,我们要做到当一个新的进程创建的时候,当某些我们不希望的东西出现在M中的时候,要能搞掉,How!

考虑一个方法是监控M的变化,M的某些区域R1被更改之后,检查更改之后的数据,问题如下,如何锁定R1,在没有VP1的帮助下,我们当方面锁定R1,那么VP1不知道,如果它又操作这段区域怎么办,会不会出现问题,一个方法是让cpu空转,为x86的cpu增加一个标志位,标志位为1就空转,这样及其浪费资源,实现难度也很大。还一个问题是R1可能只一个虚拟cpu周期就可以完成,但是要检查却要花费很多物理cpu周期,而在这个检查还没有完成的时候另外的更改又发生了。

另外,M中保存的东西并不都是连续的,这也是一个很严重的问题。目前老师由于忙着写本子,也没人指导我们,限于水平,我们组没人能提出一个思路。

我自己的想法:不在guest os中添加任何东西,又不修改guest os前提下就是说guest os不主动为我们提供任何信息,我们只能通过os的某些特性或者他的行为来做。我们提供给guest os的,并且我们能完全控制的有cpu,硬盘,内存,所有的数据和可执行数据都在内存和硬盘上,监控这两个的读写是一个容易想到的思路。问题也很多,具体的技术路线还没有想出来。从根本上来说,我们的方法具有很大的优势,缺点也很明显,操作系统不支持,很多东西不好实现,实现了效果也不好。主要一点是无法对行为进行细粒度的监控。就目前的技术来说,特征码比较是最好的一种方法了,但是对于未知的病毒来说就几乎不怎么样了,其实我的倾向是两种方案接合,guest os中还是需要一个东西来支持我们,向我们传递消息,完全某些任务,我们在外面保证它可以被执行并且可以完全保证不被恶意代码修改。

再去找组员和老师讨论下,集思广益总可以找一条路出来的。