一种基于内核虚拟机的rootkit检测机制及检测方法

文档序号:6426172阅读:248来源:国知局
专利名称:一种基于内核虚拟机的rootkit检测机制及检测方法
技术领域
本发明属于操作系统安全领域,特别是一种基于内核虚拟机(简称KVM)的 rootkit检测机制及检测方法。
背景技术
随着计算机技术的应用深入,在计算机技术和研究领域,性能不再是主要的着力点,取而代之的是对系统高可靠和安全。一次计算机故障或者安全隐患,可能给运行在其上的应用带来无法估量的损失。Rootkit,作为一种运行在操作系统核心态的恶意代码,可以为上层的应用提供进程、文件、通信连接的隐藏功能。后门程序一旦利用Rootkit,则可以逃避系统管理员和监控程序,实现自己的目的,从而给关键应用带来危害。现有的针对Rootkit的检测机制,主要有两种手段。第一种手段依赖检测-恢复机制。具体地说,这种方式基本措施是,针对核心易受Rootkit攻击的关键数据段或者代码段,保存其副本,在内核中运行一个检测线程和恢复线程,检测线程定期去检测这些敏感区域,一旦发现异常,则立即启动恢复线程去恢复;第二种手段是定制或者修改内核,对于 rootkit常见于以可加载内核模块方式实现,可以在编译时强制禁用这项功能,但是系统扩展性较差,另外就是通过修改操作系统内核,通过修改内核中模块加载函数sys_init_ module扩充加载过程,这种手段通过执行完模块初始化函数后,再对敏感区域进行检测,一旦发现异常,记录信息并且将当前正在加载的内核模块卸载。在上述两种方案中,基于检测-恢复机制的手段是最常规的方法,缺点也很明显, 首先是不能防范rootkit的发生,定期检测具有一定的滞后性,并且检测线程带来了一定的时间开销,检测线程也易于受到rootkit的影响。第二种修改源代码的方式,由于其机制在加载模块中触发,相比第一种方法,具有一定的防范rootkit的能力,但是需要修改操作系统内核,耦合性不好,并且如果rootkit行为不是在模块加载过程中执行,仍然可以逃脱检测机制。

发明内容
本发明所要解决的技术问题是提供一种基于内核虚拟机的rootkit检测机制及检测方法,将rootkit对象抽象成四类形式,通过扩展KVM虚拟机,实现对客户机不同类型的rootkit的形式分类进行防止或检测,在一定条件下,可以跟踪以及卸载产生恶意行为的客户机可加载内核模块。本发明基于内核虚拟机的rootkit检测机制,包括客户机和内核虚拟机;所述客户机包括获取客户机在运行时的相关信息并将该信息注入给内核虚拟机的运行时模块和接收内核虚拟机的反馈信息的监测线程;所述内核虚拟机包括解析运行时模块注入的信息的语义重构模块,以及为语义重构模块提供处理通道的管理模块和异常处理模块,其中,所述管理模块提供运行时影子页表遍历和设置机制,所述异常处理模块通过语义重构模块解析异常处理;所述客户机在运行时的信息分为静态内核代码,静态内核数据,动态分配函数空间以及堆空间关键数据,内核虚拟机的语义重构模块根据注入的不同类型的信息对应的分为静态代码段,静态数据段,动态分配函数空间以及堆空间关键数据,并根据注入的不同类型的信息建立不同的检测策略。作为本发明的优选实施例,所述客户机的运行时模块包括静态关键数据信息注入和检测线程、静态代码信息注入和检测线程,以及根文件系统信息注入线程;作为本发明的优选实施例,所述客户机的运行时模块通过vmcall的方式将接收的信息注入到内核虚拟机中;本发明基于内核虚拟机的rootkit检测机制方法,包括以下步骤(1)在客户机中加载一个运行时模块,采集客户机运行时的信息并将该信息注入给内核虚拟机,所述客户机运行时的信息分为静态内核代码,静态内核数据,动态分配函数空间以及堆空间关键数据;(2)在内核虚拟机中提供一个客户机的语义重构模块,解析从客户机的注入的信息,然后根据注入信息的类型建立不同的策略;(3)在内核虚拟机中提供一个管理模块和异常处理模块,为语义重构模块提供处理通道。在所述步骤(1)中,运行时模块以vmcall的方式将获取的信息注入到内核虚拟机中,然后客户机内的检测线程检测内核虚拟机反馈注入信息,然后通过注入的信息扫描可加载模块链表,卸载恶意模块;在所述步骤O)中,所述语义重构模块在建立不同的检测策略前,首先扩展内核虚拟机的hypercall机制,为客户机语义信息注入处理机制,hypercall判断当前异常触发参数信息,若为客户机注入的是定义值,则进入语义重构模块;所述hypercall根据客户机参数类型是否为GUEST_RUNTIME_INFOR而判定是否进入语义重构模块;所述步骤O)中所述的不同的检测策略如下若注入类型为静态内核代码段,通过扫描客户机影子页表,设置影子页表项写保护,并且一切客户机区间为不可信区间;若注入类型为静态内核数据,扫描客户机影子页表,设置影子页表项的写保护,并且根据运行时注入参数设置客户机信任区间,信任区间可以对该数据写操作,默认为内核代码段;若注入类型为动态代码函数,通过二进制扫描方式获取函数区间,隔离于客户机保存在内核虚拟机中,通过阈值触发来进行完整性检测;若注入类型为堆空间动态数据,获取与之相关的操作函数,将函数与数据保存在内核虚拟机中,通过阈值触发来进行完整性检测;所述阈值触发通过训练函数的执行间隔实现,若最近间隔序列调整大于预定阈值,则通过二次超时方式进行完整性检测。本发明基于内核虚拟机的rootkit检测机制及检测方法至少具有以下优点本发明将rootkit攻击对象抽象分类为四类静态代码段,静态数据段,动态分配函数,堆空间数据,针对不同类型提供了不同的保护和检测机制;而具体的rootkit敏感信息,则通过运行在客户机中的运行时模块来获取,通过增加语义处理通道实现内核虚拟机和客户机之间的信息交互,通过扩展对应的缺页异常处理程序和vmcall主动陷入机制,保证该机制下客户机正常执行。如此,本发明能够有效的组织针对静态代码和数据段的攻击并且在很小开销下和安全环境下实现动态信息的隔离保存和检测恢复。


图1为本发明检测机制的整体结构框图;图2是基于可信代码区间和主机页表写保护的客户机内存区域保护策略流程示意图;图3是KVM缺页异常处理程序;图4是基于统计阈值二次触发的完整性检测算法流程。
具体实施例方式本发明基于内核虚拟机的rootkit检测机制,首先,将Rootkit实现形式对象抽象为四种类型静态内核代码,静态内核数据,动态分配代码函数以及内核堆空间数据结构。在客户机中加载一个运行时模块和监测线程,其中,所述运行时模块的目的是为了获取客户机在运行时的相关信息。作为底层的虚拟机监控器KVM,其无法获取除系统级信息之外的客户机语义信息,因此,客户机的运行时模块是在运行时实现和底层客户机的语义交互。客户机的运行时模块在运行时获取的信息包括中断向量表,系统调用表,内核代码段信息,文件系统关键数据信息等。客户机的运行时模块作为一个标准的内核模块,以字符设备形式存在,并为客户机的用户层提供接口。所述客户机的运行时模块是通过vmcall的方式将运行时的客户机信息注入到 KVM。运行时模块将客户机运行时信息封装成不同的语义信息,通过同步指令vmcall注入 KVM,并且启动客户机监测线程,监测KVM反馈的信息。KVM提供扩展hypercall的调用功能,当传递参数为客户机运行时信息GUEST_ RUNTIME_INF0后,调用KVM语义重构模块。KVM语义重构模块负责接收运行时模块通过vmcall方式注入的信息,将注入信息重组为不同类型,调用不同的处理机制,包括基于信任代码区间和主机页表写保护的客户机内存区域保护策略,基于调用间隔阈值触发的完整性检测策略等。客户机的被保护内存区域的写操作以及客户机被检测函数的调用,都会同步触发到KVM异常处理中。对于客户机被保存区域写操作,除了可信代码区间外的客户机代码,均认为是恶意代码,组织次操作,向客户机注入反馈信息。客户机的监测线程接收来自KVM的反馈信息,默认认为当前异常来自于客户机可加载内核模块,通过扫描客户机可加载内核链表中模块,识别当前造成恶意程序的代码模块,语义记录或者删除。客户机对被检测函数的调用,KVM记录联系调用间隔序列,通过训练数据得到安全阈值,如果间隔超出阈值,则认为异常发生,则启动完整性检测方法检测函数和数据。为了防止随机性误差,通过二次阈值触发来实现检测。KVM保存所有待检测的副本并由KVM提供完整性检测过程,这样可以使得副本不会被客户机内核恶意代码污染。
KVM模块抽象四种不同类型的内存代码或者数据的检测机制,而不关心具体是数据还是代码,是属于系统调用层还是更低文件系统层,以此提高更好的可扩展性。而具体使用,由上层的客户机运行时模块决定。下面结合附图对本发明进行详细描述请参阅图1所示,为本发明基于内核虚拟机的rootkit检测机制的框架图,所述基于内核虚拟机的rootkit监测机制包括客户机部分和KVM部分。客户机部分的核心为运行在客户机核心的一个运行时模块,它封装成一个标准的字符设备,供上层用户工具程序提供接口,便于配置和操作。客户机的运行时模块主要包含生成三个线程,静态关键数据信息注入和检测线程,用户获取客户机内核关键数据结构注入KVM,如中断向量表和系统调用表;静态代码信息注入和检测线程用于获取静态内核代码信息;根文件系统信息注入线程用于获取客户机根文件系统信息注入KVM。通过在运行时动态获取这类信息,可以做到更好的维护性和可用性。KVM部分是对内核虚拟机的扩充,这部分是对上层客户机的运行时模块的支持。 与客户机的运行时模块不同,客户机的运行时模块是负责对具体客户机信息的获取,而KVM 模块则是将rootkit攻击对象抽象成四种类型,对应不同类型,提供不同的策略。这四种类型分别是静态的内核代码,静态的内核数据,动态分配内核函数,堆空间的内核数据。之所以对rootkit攻击对象进行分类,原因在于对于静态的内核代码和静态的内核数据,其均是由编译器决定的,静态内核代码在运行时不会更改,而对于静态内核数据,原则上只有静态内核代码有权修改,而其它内核代码诸如可加载内核模块不可以修改, 或者说在本发明检测机制启动之前,所有的内核代码都被认为是安全的,不管是内核静态代码还是其它可加载内核模块代码,因此,通过信任区间列表的方式来区分可信非可信内核代码。对于动态分配内核函数,例如通过可加载模块的函数,通常是在加载过程中动态分配的,这个和系统当前的模块加载顺序以及系统的进程数目有关,因此,地址并不是在编译期决定的,这类函数尤其是文件系统相关函数,也是rootkit攻击对象,因此,可以单独监控这些敏感函数,通过在运行时指令扫描方式,获取函数完整性信息,并且实时监控。对于堆空间的内核数据,和动态分配内核函数一样,地址也并不是在编译器决定的,并且这些是易受攻击的数据,也有一个特点,往往和某些具体操作函数关系密切,比如对于根文件系统的攻击,rootkit通常会重定向filejperation结构体的一些函数指针,因此,这个结构体式rootkit敏感数据通常是通过重定向readdir以及read函数来实现rootkit功能,因此, 这属于第四类形式。底层运行的KVM分别针对这四类rootkit对象存在形式及其特征,分别建立了不同的检测策略。对于静态的内核代码,由于其在运行时是不可更改的,因此,可以对其整体进行写保护,并且可信区间的头指针为空,即认为所有的代码区间,对于静态的内核代码段的写操作都是不可信的。对于静态的内核数据,尤其是rootkit的目标数据,通常也是在运行时不会更改的,但是以防内核代码在关键时刻的修改,这类形式的数据,可以通过建立可信代码区间方式保证访问的完整性和安全性。对于动态分配内核函数和堆空间的内核数据,因为基于其动态分配,并且一般比较小,所以采取写保护策略会有很大的性能开销,因此,仍然采用传统的检测-恢复机制,但是所不同的是,所有的副本(即动态分配内核函数和堆空间的内核数据的副本)均存放在KVM中而不是客户机中,这种隔离特性保证了客户机的rootkit代码永远不会污染到检测线程和副本,另外,KVM可以监控函数的执行行为, 因为,不用定期检测完整性,而是通过调用间隔序列的阈值计算,在超时的时候再进行检测,减少了一定的性能开销。下面对各个部分做一个详细的说明。在客户机的运行时模块中,产生了三个线程, 这些线程都是通过用户态命令触发启动,比如用户态命令参数SYSCALL_TABLE代表当前需要启动中断向量表和系统调用表的保护线程,这个线程通过sidt指令读取中断向量表的首地址,然后通过结合中断向量表的长度,将该中断向量表的首地址及其长度注入虚拟机 KVM中,告诉当前需要调用基于主机页表和信任区间的保护策略,系统调用表类似,通过在中断向量表中获取第0x80个中断门,获取系统调用函数的总入口,然后扫描系统调用函数找到系统调用表调用指令call,从而获得系统调用表的基地址,和中断向量表类似的方法注入KVM。用户态参数KERNEK_C0DE表示对内核代码段保护,防止rootkit在敏感函数中插入跳转指令,客户机启动内核代码扫描和检测线程,获得内核代码段信息注入KVM,并且告诉KVM,这类保护没有可信区间。用户态参数ROOTFS表示客户机的运行时模块需要启动客户机根文件系统信息获取和检测线程,这个线程在运行时获取根文件系统为上层的虚拟文件系统提供的相关操作函数集,包括文件操作函数集file_0perati0ns、索引节点操作函数集inodejperations、目录节点操作函数集dentry^perations以及超级块操作函数集 superjperations。针对rootkit敏感函数,设置其为KVM监控函数,并设置初始监控阈值, 然后将这些信息注入KVM,告诉KVM将对内核堆空间数据监控。KVM经过语义重构模块,记录堆空间数据副本信息,并为相关函数设置超时监控线程。图2描述了基于可信代码区间及主机页表写保护的内存区域保护流程示意图。来自客户机的信息注入包含内存区域的信息,包括起始地址、大小、是否可写、状态,可信区间链、区间描述、异常线性地址,异常指令地址等。当KVM语义重构模块获得客户机注入的内存区域保护信息,从当前的内存保护块中获取空闲内存块,根据地址和内存大小,计算该区域占的内存页面数N,然后将地址按内存页面对齐,从当前页面开始计算,遍历M个客户机页表项(该M个客户机页表项与上述内存页面数N—一对应),循环遍历其对应的客户机页表和影子页表项,遍历的次数为P (该遍历的次数P与上述M个客户机页表项一一对应), 每次获得影子页表项后,设置影子页表项为只读,并且将起始地址增加一个页面大小,并且记录对应的物理帧号,最后将填充的保护块添加到保护列表中。与基于可信代码区间和主机页写保护的策略对应,KVM缺页异常处理模块提供对应的处理策略,图3描述了 KVM缺页异常处理流程的逻辑流程。在KVM常规的缺页异常处理流程结束后,如果返回结果非零,说明当前是宿主机缺页异常,并且保证返回客户机正常执行,若此时即使rootkit恶意写,客户机依然会进行,因此,在此需要对当前写操作是否合法进行检查,首先判断缓存即最常用的客户机模块是否包含写的线性地址,如果包含,则说明在这个保护块中,如果不是,则遍历保护块链表,看是否在其中一个保护块中,如果在, 说明当前非法写操作是潜在恶意的,这个时候从虚拟机控制结构VMCS中读出当前客户机页表指令寄存器RIP的信息,和这个保护块中的可信区间一一比较,如果在某个可信区间, 说明该写造作潜在恶意,但是是在可信区间,仍然允许,否则,认为这是恶意程序的写操作, 需要禁止,KVM将跳过这个指令的操作,让客户机执行后续操作,并且仍然设置影子页不可写,这样后续恶意操作仍然可以拦截,处理完毕后,KVM向客户机空间的监测线程反馈信息,填充引发恶意操作的RIP值。客户机的监测线程,一旦检测KVM反馈的信息,则立即启动检查和卸载操作。默认恶意程序来自可加载内核模块,通过可加载内核模块的链表,来获取各模块地址空间信息, 根据RIP定位恶意模块,将之删除。对于动态分配的函数和数据结构,其中也有rootkit敏感的区域,rootkit新型方式可以通过文件系统来实现目的,如针对根文件系统,重定向其向上层虚拟文件系统提供的操作函数集,如 file_operations dentry_operations super_operations inode_ operations等。这类方式由于动态分配,采取内存保护方式开销太大,因此,采取完整性检测策略,与传统检测不同的是,副本隔离保存,并且并不是定期进行检查完整性,这样会带来无用开销。经过分析,数据结构和相关操作函数通常联系紧密,因此,可以通过函数调用序列方式来触发,具体来说,将这些数据结构保存在KVM副本库中,然后设置相关的监控函数,并为每一个监控函数设置监控阈值,阈值可以动态调整。如果被监控调用函数超出阈值没有被调用,则说明该过程有可能被拦截,然后进行完整性检查,为了消除随机访问带来的影响,并不是超出阈值即检测,认为连续两次超出阈值即进行检测。在每次调用过程中,记录时间间隔,将最近N次的调用间隔序列作为下一次检查前的阈值计算样本,动态更新阈值。图4即为基于统计阈值的完整性检测算法流程,在检测线程启动开始,根据训练数据设置超时阈值,也可以设置尽量比较小。检测线程通过当前阈值来调节监控频率,每一次检测当前间隔是否超出阈值,如果连续两次超出阈值,则说明客户机很有可能产生恶意行为,及时进行完整性检测,当发生异常是,进行客户机信息恢复。每次检测后,重新计算当前的阈值,保证调用过程能随着客户机负载变化精确调整。客户机运行时模块和KVM之间通过增加语义层进行交互,这些信息是非系统级, 因此,需要接触额外的手段实现,在这里,通过扩展vt规范里的vmcall指令方式实现, vmcall使得客户机主动陷入kvm,在kvm中增加vmcall的处理通道,进而达到实现信息交互的目的。通过客户机运行时模块的信息获取注入以及KVM抽象的处理策略结合方式,能有效的防止一些rootkit的发生和尽可能减少时间开销。以上所述仅为本发明的一种实施方式,不是全部或唯一的实施方式,本领域普通技术人员通过阅读本发明说明书而对本发明技术方案采取的任何等效的变换,均为本发明的权利要求所涵盖。
9
权利要求
1.一种基于内核虚拟机的rootkit检测机制,其特征在于包括客户机和内核虚拟机;所述客户机包括获取客户机在运行时的相关信息并将该信息注入给内核虚拟机的运行时模块和接收内核虚拟机的反馈信息的监测线程;所述内核虚拟机包括解析运行时模块注入的信息的语义重构模块,以及为语义重构模块提供处理通道的管理模块和异常处理模块,其中,所述管理模块提供运行时影子页表遍历和设置机制,所述异常处理模块通过语义重构模块解析异常处理;所述客户机在运行时的信息分为静态内核代码,静态内核数据,动态分配函数空间以及堆空间关键数据,内核虚拟机的语义重构模块根据注入的不同类型的信息对应的分为静态代码段,静态数据段,动态分配函数空间以及堆空间关键数据,并根据注入的不同类型的信息建立不同的检测策略。
2.如权利要求1所述的一种基于内核虚拟机的rootkit检测机制,其特征在于所述客户机的运行时模块包括静态关键数据信息注入和检测线程、静态代码信息注入和检测线程,以及根文件系统信息注入线程。
3.如权利要求1或2所述的基于内核虚拟机的rootkit检测方法,其特征在于所述客户机的运行时模块通过vmcall的方式将接收的信息注入到内核虚拟机中。
4.一种基于内核虚拟机的rootkit检测方法,其特征在于包括以下步骤(1)在客户机中加载一个运行时模块,采集客户机运行时的信息并将该信息注入给内核虚拟机,所述客户机运行时的信息分为静态内核代码,静态内核数据,动态分配函数空间以及堆空间关键数据;(2)在内核虚拟机中提供一个客户机的语义重构模块,解析从客户机的注入的信息,然后根据注入信息的类型建立不同的策略;(3)在内核虚拟机中提供一个管理模块和异常处理模块,为语义重构模块提供处理通道。
5.如权利要求4所述的基于内核虚拟机的rootkit检测方法,其特征在于在所述步骤(1)中,运行时模块以vmcall的方式将获取的信息注入到内核虚拟机中,然后客户机内的检测线程检测内核虚拟机反馈注入信息,然后通过注入的信息扫描可加载模块链表,卸载恶意模块。
6.如权利要求5所述的基于内核虚拟机的rootkit检测方法,其特征在于在在所述步骤O)中,所述语义重构模块在建立不同的检测策略前,首先扩展内核虚拟机的 hypercall机制,为客户机语义信息注入处理机制,hypercall判断当前异常触发参数信息,若为客户机注入的是定义值,则进入语义重构模块。
7.如权利要求6所述的基于内核虚拟机的rootkit检测方法,其特征在于所述 hypercall根据客户机参数类型是否为GUEST_RUNTIME_INFOR而判定是否进入语义重构模块。
8.如权利要求4所述的基于内核虚拟机的rootkit检测方法,其特征在于所述步骤 ⑵中所述的不同的检测策略如下若注入类型为静态内核代码段,通过扫描客户机影子页表,设置影子页表项写保护,并且一切客户机区间为不可信区间;若注入类型为静态内核数据,扫描客户机影子页表,设置影子页表项的写保护,并且根据运行时注入参数设置客户机信任区间,信任区间可以对该数据写操作,默认为内核代码段;若注入类型为动态代码函数,通过二进制扫描方式获取函数区间,隔离于客户机保存在内核虚拟机中,通过阈值触发来进行完整性检测;若注入类型为堆空间动态数据,获取与之相关的操作函数,将函数与数据保存在内核虚拟机中,通过阈值触发来进行完整性检测。
9.如权利要求8所述的基于内核虚拟机的rootkit检测方法,其特征在于所述阈值触发通过训练函数的执行间隔实现,若最近间隔序列调整大于预定阈值,则通过二次超时方式进行完整性检测。
全文摘要
本发明提供了一种基于内核虚拟机的rootkit检测机制及检测方法,该机制对rootkit的攻击对象类型进行了抽象分类静态代码段,静态数据段,动态分配函数,堆空间数据,并且针对不同类型提供了不同的保护和检测机制;而具体的rootkit敏感信息,则通过运行在客户机中的运行时模块来获取,通过增加语义处理通道实现内核虚拟机和客户机之间的信息交互,通过扩展对应的缺页异常处理程序和vmcall主动陷入机制,保证该机制下客户机正常执行。本发明能够有效的组织针对静态代码和数据段的攻击并且在很小开销下和安全环境下实现动态信息的隔离保存和检测恢复。
文档编号G06F21/22GK102194080SQ20111015773
公开日2011年9月21日 申请日期2011年6月13日 优先权日2011年6月13日
发明者卫进, 吴忠远, 吴楠, 宋鸿雁, 张东, 张兴军, 彭义勇, 王恩东, 胡雷钧, 董小社, 董渭清, 郑豪 申请人:山东高效能服务器和存储研究院, 西安交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1