Youhui Zhang, Yu Gu, Hongyi Wang, Dongsheng Wang
Tsinghua National Laboratory for Information Science and Technology,
Tsinghua University, 100084, Beijing, China
基于存储器的入侵检查系统(IDS),利用虚拟机和智能磁盘技术。虚拟机监控器(VMM)可以防止IDS自身发动特定攻击,而智能磁盘技术为IDS提供了受控的虚拟机的文件系统的整体视图。
使得虚拟磁盘维护一个扇区到文件的映射表(也叫做文件--存储块层次),和如何联机检测对文件的修改。基于以上特色,普通的文件层次的入侵检测规则将被转变为扇区层次的,以便将入侵检测函数集成到虚拟内存中。我们基于QEMU VMM和 windows xp(虚拟OS)实现了这样一个原型。
很多入侵检测系统是基于主机的或基于网络的。近年来出现了基于存储器的IDS.很多类型的入侵在重启后仍然持续,因为磁盘的持久化数据发生了改变,而这是能被存储系统检测到的。更进一步来说,存储系统是十分适合用来做这个的,因为即使主机系统已经被入侵了,它们还能继续工作。
面临一个困境:若IDS运行在主机里面,那么它就拥有系统的整个视图,而它又是会被外部的攻击所威胁的。若IDS运行在主机外,它对主机的视图又变得糟糕。
一方面,基于我们的文件感知的块级别的存储器,它能对被监控的主机的文件系统的状态有很好的可见度,另一方面,通过虚拟机技术又能使IDS维护很强的独立性。我们提出的IDS可以被用作虚拟块级别存储器的集成部件。
我们的方法就是让虚拟机监控器(VMM)把IDS拖到被监控的主机“外部”,这就在IDS和攻击者的恶意活动中间划出了一道障碍。一般来说,VMM为上层的OS和应用构建了一些虚拟硬件接口,包括常见的块级别存储接口。但攻击者通常利用系统文件,因此现有的基于存储器的IDS访问规则都是根据文件而不是数据扇区来定义的。
我们提出了文件感知的块级存储来解决这个问题。这种类型的存储器可以识别处那个文件正被上层的OS访问,从而使得相应的文件层次的入侵检测规则得以采用。我们设计了一个工具来协助虚拟存储器进一步发现文件系统结构的细节,存储器系统维护了一张扇区到文件的映射表,并且利用这张表实时地将文件层次的ID规则转换为扇区层次的ID规则。
贡献:1)它基于虚拟机技术和智能存取,这些使得IDS和目标主机相分离,而同时又可以获得文件系统的整体视图。2)利用FAT32文件系统实现了一个文件感知的块层次虚拟存储器,这可以被进一步用做运行入侵检测的虚拟磁盘。
一个基于规则(或叫基于策略)的入侵检测系统由三个部分组成:1)访问规则及指定规则的机制。2)监控违反规则的机制。3)对于违反规则所采取的行为。我们重点放在1)和2)。
我们的IDS利用VMM技术,它在IDS和可能的入侵间提供了一道障碍。但一个在虚拟机外部运行的IDS只能访问硬件层的状态(例如。物理内存页面数和磁盘扇区数等)和事件,而这不是访问规则工作的层次。【9】通过使用虚拟机内部的操作系统结构的详细知识来在OS级别语义层次解释这些状态和事件。在我们的方法中,采用了类似SDS的方法来发现存储磁盘上的文件系统数据结构,从而完成文件到扇区的转换。
我们的原型支持FAT32文件系统。我们引入了一个工具来协助虚拟存储磁盘进一步发现这些存储扇区,这些扇区包含了我们感兴趣的文件的数据和元数据。这是通过以预先定义模式浏览和(或)读取相关文件和(或)目录来告诉下面的虚拟磁盘那个文件或目录正在被访问,而后者就会将相关的扇区进行标记。当然,这需要一些FAT32的知识来分析其复杂的元数据结构,例如dir-entry结构。
总而言之,进过上面这些步骤后,存储磁盘将会维护一张扇区到文件的映射表。通过VMM,存储器也在另一个OS进行模拟,从而可以很直接地转换和指定文件层次的入侵检测规则。然后这些就可以被实时地用于监控任何违反规则的行为。系统架构图如下:
clip_image001
推断存储磁盘的结构
成功的入侵者经常修改存储的数据。可以设置一些规则来监控对文件内容和(或)相应的元数据的修改。规则可以指定那些文件和它们元数据的那些部分会被监控,对这些值的何种类型的访问将构成一个违反行为。
1) 一些受保护的文件或目录是只读的。不允许对相关的数据或元数据的修改,被读操作引入的除外(如对FAT32的DIR_LstAccDate属性的修改)。
2) 更新模式:必须检测更改模式,像对文件非附加性的修改(例如系统日志文件)
3) 可疑内容:它必须检测出现的可疑文件名字(例如隐藏的”dot”文件)或内容(例如已知的病毒或攻击工具)。
因此扇区到文件的映射表必须包含下列内容:
1) 包含文件元数据的扇区
2) 包含祖先目录信息的扇区
3) 包含文件内容的数据扇区
我们开发了一个工具来发现文件系统数据结构:
1) 将所有的FAT和保留扇区排除。这一步和工具无关。FAT32文件系统由很多连续扇区组成,如图:
clip_image002
a) 保留扇区,位于最开始:第一个保留扇区是启动扇区(分区启动记录)。它包括一块名为BIOS参数块(有一些基本的文件系统信息(尤其是其类型),和指向其他扇区位置的指针)的区域。
b) FAT区域:出于冗余的需要,它包含了文件分配表的两份拷贝。这些是分区的映射表,指明了簇是如何分配的。
c) 接下来的扇区用于存储根目录和其他所有数据。
保留扇区和FAT扇区的总数目可以通过启动扇区里的某些域计算出来,因此可以进一步将这些扇区排除掉。
2) 找到包含目录条目的扇区。
工具对目标文件系统进行全面的文件/目录枚举,并将产生的文件列表保存在内存中供第3)步使用。相应地,智能磁盘同时记录被访问的块集合(用A)表示。
3)产生扇区—文件映射表。
基于2)中生成的文件列表,工具逐一读取目标系统的所有文件。每个文件都逐项读取,并且访问单元是一个扇区(512字节)。当一个文件读取完毕时,工具将同时写入一系列预先定义的数据(以文件名结尾)到磁盘上,这些数据用于连续的文件读取时作为一种分割,从而协助磁盘构建一张扇区—文件映射表。
这个过程中涉及到的所有块也会被智能磁盘所记录(用B来表示)。很明显A和B的差集包含了所有数据块。
clip_image003
4)定位相应的文件和目录的目录项
这一步也是通过磁盘自身完成的。一个FAT32目录扇区只是包含32位结构的一个线性表,名为FAT32字节目录项结构。
DIR_NAME,文件的简短名字:目录扇区的第二个目录项的名字被设置为”..”,这表明它是当前目录的父目录。
DIR_Attr,文件属性:最有用的属性是ATTR_DIRECTORY,这个表示当前项是其他文件的一个容器(目录)。
DIR_FstCluHI,DIR_FstClusLO:此项对应文件(或目录)的第一个簇的序列号.
DIR_FileSize:32位DWORD,包含了文件的大小(以字节),对应一个目录,设置
为0。
通过上述属性,当给定一个文件的全路径名时,可以很容易得到包含其对应的目录项(元数据)以及它的祖先目录的信息的扇区的位置。我们可以在根目录扇区中找到第一级目录,然后通过DIR_Name, DIR_FstCluHI,DIR_FstClusLO找到下一级,直到目标被找到为止。
其他属性包括:DIR_WrtTime,DIR_WrtDate,DIR_CrtTime,DIR_LstAccDate,表示上次写,创建或访问的时间。
当特定的操作作用在一个文件或目录上时,会出现下列现象:
删除:DIR_Name的第一个字节会被设置为0xE5(对于FAT32, 0xE5意味着目录项为空)
重命名:通过先删除原来的,再创建一个新项完成。
修改属性:目录项的对应域会被修改。
修改文件内容:通过删除原来的,再创建一个新项,最后DIR_WrtTime和(或)DIR_WrtDate会被修改。
总而言之,对文件或目录的修改将修改对应的目录项的一个或多个域,而这可以被存储磁盘识别出。
到目前为止,扇区分布信息已经被虚拟磁盘所获取。对于上层OS的任何写请求,磁盘讲会执行下列步骤:
1) 查找扇区—文件映射表来找出扇区是否被监控。若没有,则正常执行并等待下一个请求,若是,则进入下一步。
2) 若被一个可疑内容相关的规则所保护并且扇区是数据扇区,它的内容将会被检测来定位可疑内容。若检测出,就被视为违反规则。
3) 若相关联的入侵检测规则是检测特定文件名是否出现,并且扇区是一个目录项,则检查DIR_Name属性是否违反规则。
4) 若是一个只读扇区,写操作本身是一个违反(除了读操作引入的)。例如,目录项的DIR_LstAccDate属性被修改。
5) 若相关规则是更新模式,将执行某些特别的检测。例如文件/目录的时间的回滚是禁止的,磁盘将读取原先的DIR_WrtTime,DIR_WrtDate,DIR_CrtTime,DIR_LstAccDate并和新值进行比较,若任一时间出现回滚,则被视为违反。
FAT32字节目录项结构包含DIR_NAME等属性,这些属性可以被用作识别一个扇区是否是一个合法目录,对于第2步,集合A的每个扇区被检测的结果都是YES。
在第3步中,当一个文件结束读取时,工具会同时写入一系列预先定义的数据(以文件名结尾)到磁盘中去。为了验证我们的猜想,两个连续预定义系列之间读取的扇区(集合A与B的差集)被按序集中起来构成一个文件,并用这个文件和OS视图中相同的文件进行比较。结果是两个文件完全一致。
我们选择了一个开源产品,QEMU来作为VMM,它是一个使用了动态解释从而获得很好的速度的模拟器。它可以仿真一个完整系统,包括一个或多个处理器和其他各种设备。因此,可以不做任何修改就用来运行各种操作系统。更进一步,它还引入了一个加速器模块(名为KQEMU)来增加其速度。在这种模式下,它直接在主机处理器上运行大部分目标代码,从而达到近乎本地的性能。
在QEMU中,磁盘是通过镜像文件来模拟的,并且支持多种磁盘镜像格式,这些格式的区别在于内部数据组织方式不同,但外部接口是一致的。因此,我们选择最简单的俄格式raw来创建镜像文件,它的大小是2G字节。
我们使用最新的QEMU源代码并在XP上编译,然后使用如下命令启动:./qemu.exe –had[image file name] –cdrom [windows xp installation ISO file] –boot d –m 512 –L ./pc-bios/
这表示从cdrom(安装ISO镜像文件)启动VM并且我们讲winXP安装在虚拟磁盘上,文件系统格式为FAT32。
原始的磁盘为上次的模块提供如下函数:
Raw_open,raw_read,raw_write,raw_close,raw_create和raw_probe.
我们对前四个函数进行了增强:
1) raw_open:增加两种打开模式:发现模式和入侵检测模式。第一种模式用来在磁盘上发现文件系统信息,第2种开启入侵检测并且加载扇区—文件映射表来内存中。
2) raw_read:对于发现模式,它记录3,4两步中访问的块,从而构建一个扇区—文件映射表。对于入侵检测模式,只进行一些日志操作。
3) raw_write:对于入侵检测模式,它将检测可能违反规则的任何写操作。
4) raw_close:关闭镜像文件并存储映射表到一个存储单元中,这个单元不能被VM所访问。
第一步开启ID函数是为了发现WinXP系统镜像文件中的文件系统分布。在发现模式下,这个镜像文件作为一个普通的驱动进行挂载(不是系统驱动)。然后我们用VM中的工具来发现虚拟原始存储器的分布。在这个阶段,我们发现WinXP SP2的系统驱动(默认安装模式)包含了7246个文件,平均文件大小为134K并且文件全路径名的平均长度为40字节。
然后可以对原始存储器指定一些ID规则。支持三类警告信号,包括数据/属性修改,可疑内容和更新模式。相应地,所以规则都存储在一个配置文件中并且格式如下:
clip_image004
在我们的原型中,受监控的扇区列表是一个整数数组:它的索引就是数据和目录扇区的位置号。任一数据扇区只属于一个文件或目录,所以一个指针被存储为数组单元,它指向一个包含文件名及相应规则的文件结构。
对于发现模式来说,会维护一个Hash表,这个表的键是文件名,而对于的值是元数据的ID规则。当一个目录项被修改时,它的DIR_Name会被用来访问Hash表,从而获取对应的规则。
当磁盘得到需要的信息并构建好映射表后,它就被作为系统驱动挂载来以ID模式启动VM,然后开始实时监控磁盘操作。若任何违反行为发生,ID会通知系统管理员。
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/11/27/974720.html,如需转载请自行联系原作者