一种支持多节点的KVM虚拟机隐藏进程检测系统的制作方法

文档序号:13675290阅读:382来源:国知局

本发明涉及虚拟化安全技术领域,特别是指一种支持多节点的kvm虚拟机隐藏进程检测系统。



背景技术:

kvm/qemu-kvm是目前虚拟化研究方向的核心支撑技术之一,被广泛应用于各个方向。但是引入qemu-kvm技术后,由于其虚拟化出来的操作系统之间的安全性问题目前尚未获得较好的解决或证明方法,使攻击者有渠道完成虚拟机逃逸,甚至可以在宿主机平台上造成严重的破坏。目前绝大多数内核级rootkit,都具有隐藏进程的功能,一旦与恶意进程相配合,将会对系统安全造成巨大的威胁。因此,研究恶意隐藏进程的检测方法对保障系统的安全具有重要的意义。

vmwatcher在虚拟机外部构建进程控制块链表,并通过交叉视图的方式比较外部重构进程列表和内部汇报进程列表的差异,以此确定是否存在隐藏进程。然而直接操作内核对象(directkernelobjectmanipulation,dkom)类攻击可以将待隐藏进程控制块从进程队列中摘链,因而该方法可能会出现漏检现象。

lycosid利用假设检验方法判定被检测系统中是否存在隐藏进程,并通过最小二乘回归分析法计算进程的cpu占用率情况,以识别目标隐藏进程。该方法适合相对活跃系统(进程创建、销毁频繁的系统),但是需要统计一定数量的数据,在此过程中恶意隐藏进程可能己对系统造成了破坏。由于它通过概率的方式识别隐藏进程,可能存在漏检或误警的现象。

虚拟机监视器(virtualmachinemonitor,vmm)对上层虚拟机的完全控制权以及虚拟机间运行环境的强隔离性,为安全检测系统提供了良好的实施平台。借助虚拟机监控器提供的控制权与隔离性,电子科技大学的彭春洪与刘丹提出了一种基于kvm虚拟机的隐藏进程检测算法。算法依据客户机调度进程时会访问cr3寄存器而引起vcpu陷入到根模式执行的原理,在虚拟机的陷入异常处理函数中插入多视图进程检测算法,大大提升了隐藏进程的检测准确性,同时提出一种优化的hash算法来减小对虚拟机的性能损失。

目前的虚拟机隐藏进程检测技术通过不断深入了解虚拟机架构及机理,已经逐步提高了检测准确率以及对虚拟机的性能消耗。但现有的研究仍局限于方法验证的层次,仅针对单个虚拟机进行检测算法研究层次上的功能和性能优化。从应用角度来看,现有的技术无法实现对宿主机上部署的所有节点的同时检测,难以用于实际的工程应用。同时目前尚没有成熟、可靠、实用的工具软件可供使用,对虚拟机隐藏进程技术的实用化产生了不利影响。



技术实现要素:

有鉴于此,本发明提供一种支持多节点的kvm虚拟机隐藏进程检测系统,其具有对部署宿主机上的所有虚拟机节点进行实时、准确、高效的隐藏进程检测的能力,用户不必在虚拟机内部进行多余操作,便可在宿主机中对虚拟机进行进程监控,有助于促进kvm虚拟机隐藏进程检测技术在实际工程方面的应用。

为了实现上述目的,本发明提供的技术方案是:

一种支持多节点的kvm虚拟机隐藏进程检测系统,其包括可信进程追踪模块、进程系统调用捕获模块、终止进程判定模块、非可信进程列表获取模块、隐藏进程对比检测模块及用于集成上述模块的系统框架程序;其中:

可信进程追踪模块:用于实现从虚拟机监控器层次上对多个虚拟机节点的进程追踪、语义重构以及进程列表存储;

进程系统调用捕获模块:用于实现对多个虚拟机节点的进程系统调用行为的捕获及识别功能;

终止进程判定模块:用于对可信进程模块追踪得到的各个虚拟机节点的进程进行终止判定;

非可信进程列表获取模块:用于实现从虚拟机操作系统层次获取目标虚拟机的内部进程列表的功能;

隐藏进程对比检测模块:用于将可信进程追踪模块获取的可信进程列表以及非可信进程列表获取模块输出的非可信进程列表进行对比,检测出当前虚拟机中的隐藏进程,并将检测结果输出至系统框架程序提供的用户界面;

系统框架程序:用于实现各子模块的集成和数据的传递与管理,并提供用户界面,将用户输入的虚拟机域名传递至非可信进程列表获取模块,将隐藏进程对比检测模块的检测结果输出至用户界面。

可选的,所述可信进程追踪模块实现如下过程:

(1)在虚拟机监控器中处理客户机进程切换的功能模块中,获取虚拟机cpu描述符kvm_vcpu结构体,借助内核接口vmcs_readl从中读取将被切换至非运行状态的进程页目录基地址寄存器以及内核栈顶指针寄存器的值;

(2)依据内核栈顶指针寄存器值解析得到目标虚拟机的进程控制块thread_info结构体对应的客户机虚拟地址;同时进程页目录基地址寄存器的值被保存到指向当前虚拟机的虚拟机描述符kvm结构体中,提供给终止进程判定模块作为查找进程的依据;

(3)调用内核接口kvm_mmu_gva_to_gpa_read以及kvm_read_guest,完成客户机虚拟地址到客户机物理地址的转换以及进程控制块thread_info结构体的数据读取,thread_info结构体成员变量中包含指向虚拟机当前进程的进程描述符的客户机虚拟地址;

(4)根据进程描述符的客户机虚拟机以及目标虚拟机内核中进程pid及进程名称偏移值,再次调用内核接口kvm_mmu_gva_to_gpa_read以及kvm_read_guest,完成地址转换并读取出进程pid、父进程pid、线程组id以及进程名称等关键信息;

(5)将重构出的虚拟机当前进程的进程pid、进程名称、进程pid、父进程pid、线程组id以及进程页目录基地址存入目标虚拟机对应的kvm结构体;

(6)每当目标虚拟机进行进程切换时,自动执行步骤(1)至(5),收集所有曾在目标虚拟机中被调度执行过的进程信息。

可选的,所述进程系统调用捕获模块实现如下过程:

(1)在虚拟机监控器运行虚拟机后,修改虚拟机硬件支持寄存器efer的sce位,关闭目标虚拟机对syscall系统调用指令的支持,同时设置捕获陷阱标记;

(2)设置系统调用捕获范围;

(3)在虚拟机监控器负责模拟syscall指令的模块中,设置检测点:首先判断捕获陷阱标记是否存在;如果不存在,则说明是目标虚拟机操作系统自身产生的指令异常;否则,说明捕获到目标虚拟机的进程系统调用行为;

(4)若捕获到进程的系统调用行为,则借用内核接口kvm_register_read读取当前rax、rdi、rsi寄存器的值作为系统调用信息,提供给终止进程判定模块进行进程终止判定的数据来源;

(5)将系统调用信息以及目标虚拟机对应的虚拟机描述符传输至终止进程判定模块;

(6)每当目标虚拟机内部进程使用syscall指令调用系统调用时,自动执行步骤(1)至(5)。

可选的,所述终止进程判定模块实现如下过程:

(1)在进程系统调用捕获模块输出的系统调用信息中,rax寄存器的值为系统调用号,本模块将根据系统调用号对系统调用行为进行区分处理;

(2)如果系统调用号对应sys_exit或者sys_exit_group,则根据目标虚拟机描述符结构体中记录的当前进程,将该进程判定为已终止;系统调用号对应sys_exit_group时,要将与调用该系统调用的进程处于同一线程组的进程全部判定为已终止;

(3)如果系统调用号对应sys_wait4,则rdi寄存器为要被终止的目标进程的进程pid,当pid为0时,针对调用该系统调用的进程的子进程,将与调用进程处于同一线程组的所有进程判定为已终止;当pid为-1时,将调用该系统调用的进程的所有子进程判定为已终止;当pid小于-1时,针对调用该系统调用的进程的子进程,将线程组id等于pid绝对值的进程判定为已终止;当pid大于0时,针对调用该系统调用的进程的子进程,将线程组id等于pid的进程判定为已终止;

(4)如果系统调用号对应sys_waitid,则rsi寄存器为要被终止的目标进程的进程pid,rdi寄存器中为idtype;当idtype为0时,将调用该系统调用的进程的所有子进程判定为已终止;当idtype为1时,针对调用该系统调用的进程的子进程,将进程pid等于rsi寄存器值的进程判定为已终止;

(5)如果捕获到的系统调用为sys_kill或者sys_tkill或者sys_tgkill,则rdi寄存器为要被终止的目标进程的进程pid,rsi寄存器为向目标进程发出的信号类型;当信号类型表示终止目标进程时,则根据进程pid将对应进程判定为已终止;

(6)将判定结果写入虚拟机描述符中的对应进程项。

可选的,所述非可信进程列表获取模块实现如下过程:

(1)系统框架程序将用户输入的目标虚拟机域名传递至本模块,根据域名完成libvmi库初始化;

(2)根据虚拟机域名获取该虚拟机内核中进程pid及进程名称等信息的偏移值;

(3)暂停虚拟机运行,用以访问虚拟机内存;

(4)读取内0号进程swapper的地址;

(5)根据地址读取出0号进程对应进程描述符的内容,其成员变量tasks为当前虚拟机内存中的进程链表;

(6)遍历该进程链表,根据步骤(2)获取的进程pid等偏移值,获取进程信息,存入本模块自定义的进程列表中;

(7)读取完所有进程信息后,将进程链表输出至隐藏进程对比检测模块;

(8)借助预先在虚拟机内部添加的模块,将通过在虚拟机内部执行ps命令获取的进程列表,通过socket接口传输回至主机中的本模块,而本模块再将该列表传输至隐藏进程对比检测模块。

可选的,所述隐藏进程对比检测模块实现如下过程:

(1)添加用户空间与内核空间进行通信的ioctl指令接口,调用该接口实现将存储在宿主机内核中的可信进程列表读取至用户空间的功能;

(2)将由系统框架程序传递来的目标虚拟机域名参数传入非可信进程列表获取模块,调用该模块获取两份非可信进程列表;

(3)将可信进程列表与通过libvmi工具获取的非可信进程列表相结合,以进程pid为比对标准,与通过从目标虚拟机内部视角获取的非可信进程列表进行对比检测,最后将检测结果输出至系统框架程序的用户界面中。

可选的,所述系统框架程序完成对可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的部署以及模块调用、参数传递,其实现方式如下:

(1)移除宿主机内核原有kvm及kvm_intel模块;

(2)将本系统生成的包含可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的kvm相关内核模块插入宿主机内核;

(3)完成内核模块插入后,可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块将自动开始运行;

(4)根据用户的操作执行隐藏进程检测,首先将用户在用户界面输入的虚拟机域名,传递至隐藏进程对比检测模块;

(5)调用隐藏进程对比检测模块,读取内核中的可信进程列表,再将虚拟机域名传入非可信进程列表获取模块,得到两份非可信进程列表;

(6)获取隐藏进程对比检测模块对比检测的结果,将其显示在用户界面。

本发明与现有技术相比的优点在于:本发明实现了支持多节点的kvm虚拟机隐藏进程检测技术,同时提供了实用、可靠的隐藏进程检测系统,与现有虚拟机隐藏进程检测技术相比,将其扩展至支持同时对宿主机上所有运行的虚拟机节点进行检测,而且克服了当前隐藏进程检测技术只局限于方法验证层次的不足,为工程人员提供了一种实际可用、操作简便、性能可靠的工具系统,适用于工程应用。用户只需要输入目标虚拟机的名称便可完成对目标虚拟机的隐藏进程检测功能。

附图说明

图1为本发明的系统架构图;

图2为本发明中的可信进程追踪模块的实现原理;

图3为本发明中的进程系统调用捕获模块以及终止进程判定模块实现原理;

图4为本发明中的非可信进程列表获取模块的实现原理;

图5为本发明中的隐藏进程对比检测模块实现过程。

具体实施方式

下面结合具体实施方式对本发明的技术方做进一步地详细说明。

一种支持多节点的kvm虚拟机隐藏进程检测系统,其包括:可信进程追踪模块、进程系统调用捕获模块、终止进程判定模块、非可信进程列表获取模块、隐藏进程对比检测模块及用于集成上述模块的系统框架程序;其中:

可信进程追踪模块:用于实现从虚拟机监控器层次上对多个虚拟机节点的进程追踪、语义重构以及进程列表存储;利用虚拟机操作系统进行进程切换时会将控制权移交至位于宿主机内核中的虚拟机监控器这一机制,以虚拟机监控器提供的目标虚拟机的虚拟机cpu描述符为输入,通过从中读取相关寄存器值获取当前虚拟机内部运行进程的页目录基地址以及内核栈顶指针;依据内核栈顶指针,重构出目标虚拟机内部当前进程的进程描述符,获取到当前进程的相关信息;将解析得到的进程信息保存至与输入的虚拟机cpu描述符对应的虚拟机描述符结构体中;利用进程追踪方法,为所有运行的虚拟机节点在其各自对应的虚拟机描述符结构体中保存一份可信进程列表;

进程系统调用捕获模块:用于实现对多个虚拟机节点的进程系统调用行为的捕获及识别功能;以虚拟机监控器提供的虚拟机cpu描述符为输入,通过修改其中的虚拟化硬件寄存器的系统调用使能位,关闭虚拟机对syscall指令的硬件支持,使得虚拟机进程调用系统调用时陷入至宿主机虚拟机监控器;在虚拟机监控器中负责模拟syscall指令的模块中设置标记点,完成对系统调用的捕获;通过读取参数寄存器获取系统调用号及系统调用参数,获取系统调用信息;将系统调用信息连同虚拟机cpu描述符对应的目标虚拟机描述符输出至终止进程判定模块;

终止进程判定模块:用于对可信进程模块追踪得到的各个虚拟机节点的进程进行终止判定;利用进程系统调用捕获模块输出的系统调用信息,在每次捕获到系统调用时根据系统调用号判断系统调用类别;如果捕获到的系统调用为sys_exit或者sys_exit_group,则根据目标虚拟机的虚拟机描述符结构体中保存的当前进程,将该进程判定为已终止;如果捕获到的系统调用为sys_wait4,进程系统调用捕获模块输出的系统调用参数值为对应目标进程编号(processidentifier,以下简称pid),根据pid将虚拟机描述符结构体中保存的对应进程判定为已终止;如果捕获到的系统调用为sys_waitid,进程系统调用捕获模块输出的系统调用参数1代表idtype,参数2代表进程pid,其中idtype用于指示pid的作用范围,根据两个参数将对应进程判定为已终止;如果捕获到的系统调用为sys_kill或者sys_tkill或者sys_tgkill,进程系统调用捕获模块输出的系统调用参数1代表目标进程pid,参数2代表信号类型,当信号类型表示要终止目标进程时,则将对应进程判定为已终止;最后将判定结果写入虚拟机描述符中保存的对应进程项;

非可信进程列表获取模块:用于实现从虚拟机操作系统层次获取目标虚拟机的内部进程列表的功能;根据输入的虚拟机域名,借助libvmi工具提供的接口定位对应的虚拟机,完成数据读取初始化工作;读取内核符号“init_task”地址,获取0号进程的进程描述符结构体地址;依据该进程描述符地址,读取出存储在虚拟机内存中的进程列表,解析出进程pid以及名称等关键信息;将进程信息保存为进程列表输出至隐藏进程对比检测模块;同时借助在宿主机及虚拟机内部实现的socket通信接口从目标虚拟机中获取一份通过ps命令得到的进程列表,并输出至隐藏进程对比检测模块;

隐藏进程对比检测模块:此模块用于将可信进程追踪模块获取的可信进程列表以及非可信进程列表获取模块输出的非可信进程列表进行对比,检测出当前虚拟机中的隐藏进程;在宿主机用户空间中从内核空间读取出可信进程追踪模块存储的可信进程列表;将可信进程列表与非可信进程列表获取模块输出的非可信进程列表进行对比检测,并将检测结果输出至系统框架程序提供的用户界面;

系统框架程序:用于实现各子模块的集成和数据的传递与管理,主要功能包括将包含可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的kvm内核模块插入宿主机内核,以及对各子模块的调用;提供用户界面,将用户输入的虚拟机域名传递至非可信进程列表获取模块,将隐藏进程对比检测模块的检测结果输出至用户界面。

所述可信进程追踪模块实现过程:

(1)在虚拟机监控器中处理客户机进程切换的功能模块中,获取虚拟机cpu描述符kvm_vcpu结构体,借助内核接口vmcs_readl从中读取将被切换至非运行状态的进程页目录基地址寄存器以及内核栈顶指针寄存器的值;

(2)依据内核栈顶指针寄存器值解析得到目标虚拟机的进程控制块thread_info结构体对应的客户机虚拟地址;同时进程页目录基地址寄存器的值被保存到指向当前虚拟机的虚拟机描述符kvm结构体中,提供给终止进程判定模块作为查找进程的依据;

(3)调用内核接口kvm_mmu_gva_to_gpa_read以及kvm_read_guest,完成客户机虚拟地址到客户机物理地址的转换以及进程控制块thread_info结构体的数据读取,thread_info结构体成员变量中包含指向虚拟机当前进程的进程描述符的客户机虚拟地址;

(4)本系统只支持检测linux操作系统且内核版本为2.6.38的虚拟机,所以其内核中进程pid及进程名称偏移值的偏移值为预先知晓的。根据进程描述符的客户机虚拟机以及目标虚拟机内核中进程pid及进程名称偏移值,再次调用内核接口kvm_mmu_gva_to_gpa_read以及kvm_read_guest,完成地址转换并读取出进程pid、父进程pid、线程组id以及进程名称等关键信息;

(5)将重构出的虚拟机当前进程的进程pid、进程名称、进程pid、父进程pid、线程组id以及进程页目录基地址存入目标虚拟机对应的kvm结构体;

(6)每当目标虚拟机进行进程切换时,自动执行步骤(1)至(5),收集所有曾在目标虚拟机中被调度执行过的进程信息;

(7)因为各个虚拟机节点拥有各自对应的kvm结构体,所以进程追踪过程互不干扰;本模块会为所有运行的虚拟机节点维护一张进程列表。

所述进程系统调用捕获模块实现过程:

(1)在虚拟机监控器运行虚拟机后,修改虚拟机硬件支持寄存器efer的sce位,关闭目标虚拟机对syscall系统调用指令的支持,同时设置捕获陷阱标记;

(2)设置系统调用捕获范围;

(3)在虚拟机监控器负责模拟syscall指令的模块中,设置检测点:首先判断捕获陷阱标记是否存在;如果不存在,则说明是目标虚拟机操作系统自身产生的指令异常;否则,说明捕获到目标虚拟机的进程系统调用行为;

(4)若捕获到进程的系统调用行为,则借用内核接口kvm_register_read读取当前rax、rdi、rsi寄存器的值作为系统调用信息,提供给终止进程判定模块进行进程终止判定的数据来源;

(5)将系统调用信息以及目标虚拟机对应的虚拟机描述符传输至终止进程判定模块;

(6)每当目标虚拟机内部进程使用syscall指令调用系统调用时,自动执行步骤(1)至(5);

(7)因为各个虚拟机节点有各自的虚拟机cpu描述符以及虚拟机描述符,所以系统调用捕获功能互不影响。

所述终止进程判定模块具体实现过程如下:

(1)在进程系统调用捕获模块输出的系统调用信息中,rax寄存器的值为系统调用号,本模块将根据系统调用号对系统调用行为进行区分处理;

(2)如果系统调用号对应sys_exit或者sys_exit_group,则根据目标虚拟机描述符结构体中记录的当前进程,将该进程判定为已终止;系统调用号对应sys_exit_group时,要将与调用该系统调用的进程处于同一线程组的进程全部判定为已终止;

(3)如果系统调用号对应sys_wait4,则rdi寄存器为要被终止的目标进程的进程pid,当pid为0时,针对调用该系统调用的进程的子进程,将与调用进程处于同一线程组的所有进程判定为已终止;当pid为-1时,将调用该系统调用的进程的所有子进程判定为已终止;当pid小于-1时,针对调用该系统调用的进程的子进程,将线程组id等于pid绝对值的进程判定为已终止;当pid大于0时,针对调用该系统调用的进程的子进程,将线程组id等于pid的进程判定为已终止;

(4)如果系统调用号对应sys_waitid,则rsi寄存器为要被终止的目标进程的进程pid,rdi寄存器中为idtype;当idtype为0时,将调用该系统调用的进程的所有子进程判定为已终止;当idtype为1时,针对调用该系统调用的进程的子进程,将进程pid等于rsi寄存器值的进程判定为已终止;

(5)如果捕获到的系统调用为sys_kill或者sys_tkill或者sys_tgkill,则rdi寄存器为要被终止的目标进程的进程pid,rsi寄存器为向目标进程发出的信号类型;当信号类型表示终止目标进程时,则根据进程pid将对应进程判定为已终止;

(6)将判定结果写入虚拟机描述符中的对应进程项。

所述非可信进程列表获取模块实现过程:

(1)系统框架程序将用户输入的目标虚拟机域名传递至本模块,根据域名完成libvmi库初始化;

(2)根据虚拟机域名获取该虚拟机内核中进程pid及进程名称等信息的偏移值;

(3)暂停虚拟机运行,用以访问虚拟机内存;

(4)读取内核符号“init_task”即0号进程swapper的地址;

(5)根据地址读取出0号进程对应进程描述符的内容,其成员变量tasks为当前虚拟机内存中的进程链表;

(6)遍历该进程链表,根据步骤(2)获取的进程pid等偏移值,获取进程信息,存入本模块自定义的进程列表中;

(7)读取完所有进程信息后,将进程链表输出至隐藏进程对比检测模块;

(8)之后借助预先在虚拟机内部添加的模块,将通过在虚拟机内部执行ps命令获取的进程列表,通过socket接口传输回至主机中的本模块,而本模块再将该列表传输至隐藏进程对比检测模块。

所述隐藏进程对比检测模块实现过程:

(1)添加用户空间与内核空间进行通信的ioctl指令接口,调用该接口实现将存储在宿主机内核中的可信进程列表读取至用户空间的功能;

(2)将由系统框架程序传递来的目标虚拟机域名参数传入非可信进程列表获取模块,调用该模块获取非可信进程列表;

(3)将可信进程列表与通过libvmi工具获取的非可信进程列表相结合,以进程pid为比对标准,与通过从目标虚拟机内部视角获取的非可信进程列表进行对比检测,最后将检测结果输出至系统框架程序的用户界面中。

系统框架程序完成对可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的部署以及模块调用、参数传递,其实现方法如下:

模块部署:

(1)移除宿主机内核原有kvm及kvm_intel模块;

(2)将本系统生成的包含可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的kvm相关内核模块插入宿主机内核;首先插入核心模块kvm.ko,为kvm_intel模块的插入提供依赖支持;

(3)之后插入kvm_intel模块,并关闭虚拟机对扩展页表的支持,使得虚拟机进行进程切换时会陷入至虚拟机监控器;

各子模块的调用、参数传递:

(1)完成内核模块插入后,可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块将自动开始运行;

(2)根据用户的操作执行隐藏进程检测,首先将用户在用户界面输入的虚拟机域名,传递至隐藏进程对比检测模块;

(3)之后调用隐藏进程对比检测模块,读取内核中的可信进程列表,再将虚拟机域名传入非可信进程列表获取模块,得到两份非可信进程列表;

(4)获取隐藏进程对比检测模块对比检测的结果,将其显示在用户界面。

如图1所示,本发明为支持多节点的kvm虚拟机隐藏进程检测系统,由可信进程追踪模块、进程系统调用捕获模块、终止进程判定模块、非可信进程列表获取模块、隐藏进程对比检测模块及用于集成上述模块的系统框架程序组成。整体实现过程如下:

(一)可信进程追踪模块:用于实现从虚拟机监控器层次上对多个虚拟机节点的进程追踪、语义重构以及进程列表存储;利用虚拟机操作系统进行进程切换时会将控制权移交至位于宿主机内核中的虚拟机监控器这一机制,以虚拟机监控器提供的目标虚拟机的虚拟机cpu描述符为输入,通过从中读取相关寄存器值获取当前虚拟机内部运行进程的页目录基地址以及内核栈顶指针;依据内核栈顶指针,重构出目标虚拟机内部当前进程的进程描述符,获取到当前进程的相关信息;将解析得到的进程信息保存至与输入的虚拟机cpu描述符对应的虚拟机描述符结构体中;利用进程追踪方法,为所有运行的虚拟机节点在其各自对应的虚拟机描述符结构体中保存一份可信进程列表;

(二)进程系统调用捕获模块:用于实现对多个虚拟机节点的进程系统调用行为的捕获及识别功能;以虚拟机监控器提供的虚拟机cpu描述符为输入,通过修改其中的虚拟化硬件寄存器的系统调用使能位,关闭虚拟机对syscall指令的硬件支持,使得虚拟机进程调用系统调用时陷入至宿主机虚拟机监控器;在虚拟机监控器中负责模拟syscall指令的模块中设置标记点,完成对系统调用的捕获;通过读取参数寄存器获取系统调用号及系统调用参数,获取系统调用信息;将系统调用信息连同虚拟机cpu描述符对应的目标虚拟机描述符输出至终止进程判定模块;

(三)终止进程判定模块:用于对可信进程模块追踪得到的各个虚拟机节点的进程进行终止判定;利用进程系统调用捕获模块输出的系统调用信息,在每次捕获到系统调用时根据系统调用号判断系统调用类别;如果捕获到的系统调用为sys_exit或者sys_exit_group,则根据目标虚拟机的虚拟机描述符结构体中保存的当前进程,将该进程判定为已终止;如果捕获到的系统调用为sys_wait4,进程系统调用捕获模块输出的系统调用参数值为对应目标进程编号(processidentifier,以下简称pid),根据pid将虚拟机描述符结构体中保存的对应进程判定为已终止;如果捕获到的系统调用为sys_waitid,进程系统调用捕获模块输出的系统调用参数1代表idtype,参数2代表进程pid,其中idtype用于指示pid的作用范围,根据两个参数将对应进程判定为已终止;如果捕获到的系统调用为sys_kill或者sys_tkill或者sys_tgkill,进程系统调用捕获模块输出的系统调用参数1代表目标进程pid,参数2代表信号类型,当信号类型表示要终止目标进程时,则将对应进程判定为已终止;最后将判定结果写入虚拟机描述符中保存的对应进程项;

(四)非可信进程列表获取模块:用于实现从虚拟机操作系统层次获取目标虚拟机的内部进程列表的功能;根据输入的虚拟机域名,借助libvmi工具提供的接口定位对应的虚拟机,完成数据读取初始化工作;读取内核符号“init_task”地址,获取0号进程的进程描述符结构体地址;依据该进程描述符地址,读取出存储在虚拟机内存中的进程列表,解析出进程pid以及名称等关键信息;将进程信息保存为进程列表输出至隐藏进程对比检测模块;同时借助在宿主机及虚拟机内部实现的socket通信接口从目标虚拟机中获取一份通过ps命令得到的进程列表,并输出至隐藏进程对比检测模块;

(五)隐藏进程对比检测模块:此模块用于将可信进程追踪模块获取的可信进程列表以及非可信进程列表获取模块输出的非可信进程列表进行对比,检测出当前虚拟机中的隐藏进程;在宿主机用户空间中从内核空间读取出可信进程追踪模块存储的可信进程列表;将可信进程列表与非可信进程列表获取模块输出的非可信进程列表进行对比检测,并将检测结果输出至系统框架程序提供的用户界面;

(六)系统框架程序:用于实现各子模块的集成和数据的传递与管理,主要功能包括将包含可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的kvm内核模块插入宿主机内核,以及对各子模块的调用;提供用户界面,将用户输入的虚拟机域名传递至非可信进程列表获取模块,将隐藏进程对比检测模块的检测结果输出至用户界面。

上述各模块的实现原理及过程如下:

1.可信进程追踪模块的实现

该模块的实现原理如图2所示:

(1)虚拟机进行进程切换时会将新进程的页目录基地址载入cr3寄存器,这个操作涉及到特权指令会产生虚拟机陷入,将系统控制权移交至虚拟机监控器,该模块在此时进行进程的语义重构。

(2)通过虚拟机监控器提供的虚拟机cpu描述符,读取cr3即要被切换变为非运行状态的进程对应的页目录基地址寄存器以及rsp即内核栈指针寄存器的值。这里我们称该进程为当前进程。

(3)linux中用户栈由用户栈stack和进程控制块thread_info结构体组成。rsp指向的是内核堆栈的结尾,rsp和thread_info位于同一个8kb的块当中。通过rsp寄存器的值可以解析出thread_info结构体的地址。

(4)thread_info结构体的第一个成员变量是指向当前进程的进程描述符task_struct的客户机虚拟地址。调用linux内核提供的接口kvm_mmu_gva_to_gpa_read以及kvm_read_guest实现客户机虚拟地址到客户机物理地址的转换以及对thread_info结构体数据的读取,继而得到指向前进程的进程描述符task_struct的客户机虚拟地址。

(5)再次调用linux内核提供的接口kvm_mmu_gva_to_gpa_read实现地址转换,获取task_struct的客户机物理地址。依据目标虚拟机的进程信息项偏移得出进程pid、父进程id、线程组id以及进程名称的客户机物理地址。

(6)调用linux内核提供的接口kvm_read_guest读取出当前进程的pid、父进程id、线程组id以及进程名称,连同页目录基地址,存入位于指向当前虚拟机的虚拟机描述符结构体中由本模块添加的表示目标虚拟机进程列表的“vmm_process”成员变量,同时将页目录基地址存入表示当前进程的“process_now”成员变量,以便终止进程判定模块用作判定数据来源。

(7)每当虚拟机进行进程切换时,重复(2)至(6),不停获取虚拟机内部进程信息。

(8)因为各个虚拟机节点拥有各自对应的kvm结构体,所以进程追踪过程互不干扰;本模块会为所有运行的虚拟机节点维护一张进程列表。

2.进程系统调用捕获模块以及终止进程判定模块的实现

这两个模块实现的大致过程如图3所示,具体实现原理如下:

进程系统调用捕获模块:

(1)在虚拟机启动运行后,通过虚拟机监控器提供的虚拟机cpu描述符,将efer寄存器中的sce位置为0,关闭虚拟机对syscall指令的支持,使得当目标虚拟机内部进程通过syscall指令调用系统调用时,产生未定义指令异常,继而产生虚拟机陷入;本模块利用此时机进行系统掉捕获,在对efer寄存器修改完成后,设置陷阱标记。

(2)在负责处理未定义指令异常的处理程序中,有专门针对syscall指令的代码块。在此代码块中,检查陷阱标记是否存在,如果存在,说明捕获到目标虚拟机内部进程的系统调用,设置捕获标记。

(3)上层的监测点监测到捕获标记后,利用内核接口kvm_register_read读取rax、rdi、rsi寄存器的值作为系统调用信息。

(4)将读取到的系统调用信息以及目标虚拟机对应的虚拟机描述符传输至终止进程判定模块。

终止进程判定模块:

(1)接收到进程系统调用捕获模块传输来的系统调用信息后,首先对系统调用号进行判断。

(2)如果系统调用号对应sys_exit或者sys_exit_group,则根据目标虚拟机描述符结构体中记录的当前进程,将该进程判定为已终止;系统调用号对应sys_exit_group时,要将与调用该系统调用的进程处于同一线程组的进程全部判定为已终止。

(3)如果系统调用号对应sys_wait4,则rdi寄存器为要被终止的目标进程的进程pid,当pid为0时,针对调用该系统调用的进程的子进程,将与调用进程处于同一线程组的所有进程判定为已终止;当pid为-1时,将调用该系统调用的进程的所有子进程判定为已终止;当pid小于-1时,针对调用该系统调用的进程的子进程,将线程组id等于pid绝对值的进程判定为已终止;当pid大于0时,针对调用该系统调用的进程的子进程,将线程组id等于pid的进程判定为已终止。

(4)如果系统调用号对应sys_waitid,则rsi寄存器为要被终止的目标进程的进程pid,rdi寄存器中为idtype;当idtype为0时,将调用该系统调用的进程的所有子进程判定为已终止;当idtype为1时,针对调用该系统调用的进程的子进程,将进程pid等于rsi寄存器值的进程判定为已终止。

(5)如果捕获到的系统调用为sys_kill或者sys_tkill或者sys_tgkill,则rdi寄存器对应要被终止的目标进程的进程pid,rsi寄存器对应向目标进程发出的信号类型;当信号类型表示终止目标进程时,则根据进程pid将对应进程判定为已终止。

(6)将判定结果写入目标虚拟机描述符中的对应进程项。

3.非可信进程列表获取模块的实现

非可信进程列表获取模块的实现原理如图4所示,具体实现过程如下:

(1)虚拟机内省应用申请读取内核符号init_task内容。libvmi通过对应客户机的内核符号表获取内核符号的客户机虚拟地址。

(2)找到客户机虚拟地址所对应的客户机内核页目录,并获取对应的页表。

(3)通过客户机中的页表访问到正确的数据页。

(4)对应的数据页被返回给libvmi。

(5)libvmi将内核符号的数据返回给虚拟机内省应用程序。

(6)这样就得到了init_task的进程描述符task_struct中的内容,其成员变量tasks就是当前虚拟机内存中的进程链表。

(7)通过libvmi接口遍历该进程链表,依次读取出该链表上所有进程的进程pid以及进程名称并进行存储,最终得到一份进程列表。

(8)之后借助预先在虚拟机内部添加的模块,将通过在虚拟机内部执行ps命令获取的进程列表,通过socket接口传输回至主机中的本模块,而本模块再将该列表传输至隐藏进程对比检测模块。

4.隐藏进程对比检测模块的实现

隐藏进程对比检测模块的实现过程如图5所示。实现步骤如下:

(1)由用户输入的虚拟机名称解析出对应虚拟机进程的pid。

(2)将虚拟机名称作为参数传入非可信进程列表获取模块,调用非可信进程列表获取模块获取针对目标虚拟机的非可信进程列表。

(3)将虚拟机进程的pid作为参数传入可信进程追踪模块,从虚拟机监控器中读取出针对目标虚拟机的可信进程列表。

(4)将可信进程列表与通过libvmi工具获取的非可信进程列表相结合,以进程pid为比对标准,与通过从目标虚拟机内部视角获取的非可信进程列表进行对比检测,最后将检测结果输出至系统框架程序以显示。

5.系统框架程序的实现

系统框架程序完成对可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的部署以及模块调用、参数传递,其实现方法如下:

模块部署:

(1)移除宿主机内核kvm及kvm_intel模块。

(2)将本系统生成的包含可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块的kvm相关内核模块插入宿主机内核;首先插入核心模块kvm.ko,为kvm_intel模块的插入提供依赖支持。

(3)之后插入kvm_intel模块,并关闭虚拟机对扩展页表的支持,使得虚拟机进行进程切换时陷入至虚拟机监控器。

各子模块的调用、参数传递:

(1)完成内核模块插入后,可信进程追踪模块、进程系统调用捕获模块以及终止进程判定模块将自动开始运行。

(2)根据用户的操作执行隐藏进程检测,首先将用户在用户界面输入的虚拟机域名,传递至隐藏进程对比检测模块。

(3)之后调用隐藏进程对比检测模块,读取内核中的可信进程列表,再将虚拟机域名传入非可信进程列表获取模块,得到两份非可信进程列表。

(4)获取隐藏进程对比检测模块对比检测的结果,将其显示在用户界面。

本发明未详细阐述部分均属于本领域公知技术。

以上所述,仅为本发明部分具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域的人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1