一种在虚拟机内部的驱动隔离系统与方法

文档序号:6380847阅读:292来源:国知局
专利名称:一种在虚拟机内部的驱动隔离系统与方法
技术领域
本发明属于计算机科学领域,涉及计算机容错技术,特别涉及一种在虚拟机内部的驱动隔离系统与方法。
背景技术
对于高可靠计算机系统来说,操作系统的可靠性显得至关重要,但是由于操作系统的高度复杂性,使得其可靠性仍然是一个至关重要却仍未解决的问题。通过可操作系统的可扩展机制,大量第三方开发的驱动程序可被加载进内核。同时传统操作系统的宏内核架构,使得驱动与内核将运行在相同的地址空间和特权级下,任何驱动程序的故障都可轻易的传递到内核其他部分,严重削弱了系统的可靠性。由于驱动程序所占内核代码量的比例巨大,且常常缺乏完善的测试,使得驱动程序故障成为操作系统崩溃的主要原因。相关研究表明,Linux操作系统中驱动程序的故障是内核其他部分故障的三到七倍,在Windows操作系统下也有类似的结论。近年来,虚拟机技术也被作为解决驱动程序可靠性问题的方法。传统方法是将驱动及其内核都隔离到独立的虚拟机实例中,利用虚拟机实例本身的隔离性来隔离驱动程序。然而,这种方法只是利用虚拟机替代整机来承受可能出现的系统崩溃,从而换取整机的可靠性提高,对于虚拟机中的驱动程序的可靠性并没有提高。如果虚拟机中的驱动程序发生故障则会造成虚拟机实例的故障或崩溃,从而造成虚拟机实例所提供的所有服务中断。另外,每个被隔离的驱动程序运行一个独立的客户机操作系统,同样也造成了较多的性能损失。

发明内容
针对上述缺陷或不足,本发明提供了通过被隔离驱动程序的授权表,实现简单、有效、兼容已有操作系统和驱动程序架构的一种在虚拟机内部的驱动隔离系统与方法。为达到上述目的,本发明提供的在虚拟机内部的驱动隔离系统包括运行于虚拟机用户态的驱动隔离加载模块、虚拟机内核态的内存信息监视模块以及虚拟机管理器内部的内存访问控制模块,其中,所述运行于虚拟机用户态的驱动隔离加载模块将驱动模块文件中监视未定义符号与内存信息监视模块中监视包装函数建立联系,使得驱动以隔离方式运行,并向内存信息监视模块中的隔离控制子模块发出被隔离驱动程序提醒消息,以使得进入内核的驱动为被隔离驱动程序;所述监视未定义符号包括内存管理函数的未定义符号和驱动注册函数的未定义符号;所述虚拟机内核态的内存信息监视模块包括包装函数库、隔离控制子模块以及消息通信子模块,其中,所述包装函数库为虚拟机内核中所监控的函数建立内核包装函数,并为虚拟机内核中驱动接口中的接口函数建立驱动包装函数,以使得被隔离驱动与内核和驱动包装函
8数链接,并进入隔离运行模式;所述内核包装函数包括内存包装函数和注册包装函数,所述内存包装函数是指内核中内存管理函数的包装函数,所述注册包装函数是指内核中驱动注册函数的包装函数;所述隔离控制子模块接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息,建立被隔离驱动程序的相关信息,并指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令,同时,根据需要获取可信任的虚拟机内核的地址范围,注入到内存访问控制模块,并发出设置虚拟机管理器中影子页表的指令;所述可信任的虚拟机内核的地址范围包括虚拟机内核代码和未被隔离的驱动程序代码的内存起始地址及其大小;所述消息通信子模块向内存访问控制模块实时报告被隔离驱动所使用内存信息、可信任的虚拟机内核的地址范围、及发送建立被隔离驱动授权表的指令;所述消息通信子模块被所述包装函数库和所述隔离控制子模块调用;所述内存访问控制模块用于控制被隔离驱动程序写操作,包括授权表管理子模块、页面设置子模块以及缺页处理子模块,其中,所述授权表管理子模块接收所述内存信息监视模块发出的设置被隔离驱动授权表的指令后,设置被隔离驱动程序可写内存范围的授权表,并负责确认写操作地址是否在授权表中;所述页面设置子模块接收所述内存信息监视模块发出的设置虚拟机管理器中影子页表的指令,并根据所述被隔离驱动所在虚拟机的内核空间在虚拟机管理器中所对应的影子页表,将影子页表设置为只读另外,当缺页处理子模块允许写操作时,还接收所述缺页处理子模块发出的允许写操作段的指令,并设置写操作目标地址对应的影子页表,在写操作结束后,重新将影子页表设置为只读;所述缺页处理子模块当被隔离驱动所在虚拟机内核出现写操作时,根据写操作指令的来源和被隔离驱动对应的授权表,判断和控制是否允许进行写操作。运行于虚拟机用户态的驱动隔离加载模块具体用于运行于虚拟机用户态的驱动隔离加载模块,将驱动模块文件中的内存管理函数的未定义符号和驱动注册函数的未定义符号替换为对应的所述内存包装函数和注册包装函数的符号及其符号名;调用虚拟机内核的原模块加载方式加载驱动程序模块,以使驱动程序模块中包装函数符号将自动链接到所述虚拟机内存信息监视模块中的所监控的包装函数,从而完成与内核包装函数建立联系;虚拟机内核的原模块加载方式会调用驱动模块的初始化函数,执行驱动注册,驱动会自动调用已经链接到注册包装函数的驱动注册函数,完成与驱动包装函数建立联系。所述隔离运行模式是指被隔离驱动程序使用的所有内存信息都被实时的捕获,并建立对应的授权表,实现驱动程序隔离运行模式具体包括驱动在加载时,执行驱动注册函数向内核的驱动接口注册驱动程序,将内核中驱动模块各个功能函数的地址赋予驱动接口中的接口函数指针,通过所述驱动隔离加载模块,驱动实际将执行驱动注册函数对应的包装函数,即注册包装函数,从而实现内核对驱动调用过程的监视;所述注册包装函数执行所述虚拟机内核中的原驱动注册函数,并执行驱动接口中接口函数指针的替换操作;所述接口函数指针的替换操作是指将接口函数指针赋值成驱动包装函数的地址,代替原驱动功能函数的地址;驱动程序加载后,驱动接口中的接口函数指针已被驱动包装函数所替换,当内核调用驱动函数时,将执行驱动包装函数,获得驱动所使用的被赋予内存信息和栈内存信息;驱动包装函数记录被赋予内存信息和栈内存信息,并将被赋予内存信息和栈内存信息注入到虚拟机管理器的授权表管理子模块,执行被隔离驱动中的原驱动函数;所述被赋予内存信息包括内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息包括执行驱动程序的进程的栈的内存起始地址及其大小;驱动在运行过程中,调用内存管理函数来分配或释放内存,通过所述驱动隔离加载模块,驱动实际将执行内存管理函数对应的包装函数,即内存包装函数,实现向内核申请分配或释放内存;所述内存包装函数执行所述虚拟机内核中的原内存管理函数,并记录分配或释放的堆内存信息,并将堆内存信息注入到虚拟机管理器的授权表管理子模块;所述堆内存信息包括驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小。所述内存信息监视模块中的隔离控制子模块具体用于I)当接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息时,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出建立被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成只读模式的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的缺页处理子模块,注入所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;2)当捕获驱动进入内核的消息,但没有接收到进入内核的驱动为被隔离驱动的消息时,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;3)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动为被隔离驱动,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出销毁被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中最后一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成可写入模式的指令;4)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动不是被隔离驱动,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围。所述内存访问控制模块中的授权表管理子模块具体用于当被隔离驱动程序加载完成时,接收所述虚拟机中所述隔离管理子模块发出的建立被隔离驱动授权表的指令,并建立被隔离驱动程序可写内存范围的初始授权表;
当被隔离驱动程序运行过程中时,接收所述虚拟机所述包装函数库发出的更新被隔离驱动授权表的指令,并根据所述包装函数实时捕捉的驱动程序所使用的内存信息,更新对应的所述驱动授权表;当被隔离驱动程序运行过程中,发生写操作缺页异常时,接收所述缺页处理子模块的查询授权表指令,并查询写操作地址是否在驱动授权表中;当被隔离驱动程序卸载完成时,接收所述虚拟机中所述隔离管理子模块发出的销毁被隔离驱动授权表的指令,销毁被隔离驱动授权表。所述内存访问控制模块中的页面设置子模块具体用于接收所述内存信息监视模块发出的设置影子页表的只读指令,并根据被隔离驱动为所述虚拟机中第一个被隔离的驱动,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为只读;接收所述内存信息监视模块发出的设置影子页表的可写指令,并根据最后一个被隔离驱动被卸载出所述虚拟机内核,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为可写,防止不必要的缺页异常;当被隔离驱动不是所述虚拟机中第一个加载的被隔离驱动,或最后一个卸载出的被隔离驱动时,直接运行所述驱动程序,不进行整个虚拟机内核空间对应的所有影子页表的设置;当所述缺页处理子模块允许进行写操作时,所述页面设置子模块将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读。所述内存访问控制模块中的缺页处理子模块还用于当写操作是来自可信任的虚拟机内核时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围在被隔离驱动程序对应的授权表中时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围不在被隔离驱动程序对应的授权表中时,跳过写操作指令,结束所述驱动程序并报告错误。一种在虚拟机内部的驱动隔离方法,包括以下步骤在需要隔离驱动程序的虚拟机中加载虚拟机内核态的内存信息监视模块;内存信息监视模块通过所述驱动隔离加载模块加载被隔离驱动程序,将被隔离驱动程序模块中未定义符号与内存信息监视模块中监视包装函数建立联系,使得被隔离驱动在加载之后以隔离方式运行;并向内存信息监视模块中的隔离控制子模块发出被隔离驱动程序提醒消息,以使得进入内核的驱动为被隔离驱动程序;所述监视未定义符号包括内存管理函数的未定义符号和驱动注册函数的未定义符号;隔离控制子模块接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息,建立被隔离驱动程序的相关信息,并指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令,同时,根据需要获取可信任的虚拟机内核的地址范围,注入到内存访问控制模块,并发出设置虚拟机管理器中影子页表的指令;所述可信任的虚拟机内核的地址范围包括虚拟机内核代码和未被隔离的驱动程序代码的内存起始地址及其大小;授权表管理子模块接收到隔离管理子模块发出的建立被隔离驱动授权表的指令后,设置驱动程序可写内存范围的授权表;页面设置子模块接收所述内存信息监视模块发出的设置虚拟机管理器中影子页表的指令,并根据所述被隔离驱动所在虚拟机的内核空间在虚拟机管理器中所对应的影子页表,将影子页表设置为接收所述缺页处理子模块发出的允许写操作段的指令,并设置写操作目标地址对应的影子页表;所述缺页处理子模块接收所述隔离管理子模块发出的可信任内核的地址范围的信息,记录所述虚拟机的可信任内核的地址范围,判断和控制是否允许进行写操作。本发明虚拟机内部的驱动隔离方法如下将被隔离驱动程序模块中未定义符号与内存信息监视模块中监视包装函数建立联系具体包括将运行于虚拟机用户态的驱动模块文件中的内存管理函数的未定义符号和驱动注册函数的未定义符号替换为对应的所述内存包装函数和注册包装函数的符号及其符号名;调用虚拟机内核的原模块加载方式加载驱动程序模块,以使得虚拟机用户态中修改过所监控未定义符号的驱动模块文件在加载之后自动链接到所述虚拟机内存信息监视模块中的所监控的包装函数,从而完成与内核包装函数建立联系;虚拟机内核的原模块加载方式会调用驱动模块的初始化函数,执行驱动注册,驱动会自动调用已经链接到注册包装函数的驱动注册函数,完成与驱动包装函数建立联系;所述实现驱动程序隔离运行模式具体包括驱动在加载时,执行驱动注册函数向内核的驱动接口注册驱动程序,将内核中驱动模块各个功能函数的地址赋予驱动接口中的接口函数指针,通过所述驱动隔离加载模块,驱动实际将执行驱动注册函数对应的包装函数,即注册包装函数,从而实现内核对驱动调用过程的监视;所述注册包装函数执行所述虚拟机内核中的原驱动注册函数,并执行驱动接口中接口函数指针的替换操作;所述接口函数指针的替换操作是指将接口函数指针赋值成驱动包装函数的地址,代替原驱动功能函数的地址;驱动程序加载后,驱动接口中的接口函数指针已被驱动包装函数所替换,当内核调用驱动函数时,将执行驱动包装函数,获得驱动所使用的被赋予内存信息和栈内存信息;驱动包装函数记录被赋予内存信息和栈内存信息,并将被赋予内存信息和栈内存信息注入到虚拟机管理器的授权表管理子模块,执行被隔离驱动中的原驱动函数;所述被赋予内存信息包括内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息包括执行驱动程序的进程的栈的内存起始地址及其大小;驱动在运行过程中,调用内存管理函数来分配或释放内存,通过所述驱动隔离加载模块,驱动实际将执行内存管理函数对应的包装函数,即内存包装函数,实现向内核申请分配或释放内存;所述内存包装函数执行所述虚拟机内核中的原内存管理函数,并记录分
1配或释放的堆内存信息,并将堆内存信息注入到虚拟机管理器的授权表管理子模块;所述堆内存信息包括驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小;指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令具体包括I)当接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息时,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出建立被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成只读模式的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的缺页处理子模块,注入所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;2)当捕获驱动进入内核的消息,但没有接收到进入内核的驱动为被隔离驱动的消息时,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;3)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动为被隔离驱动,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出销毁被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中最后一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成可写入模式的指令;4)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动不是被隔离驱动,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;所述设置驱动程序可写内存范围的授权表,具体包括当被隔离驱动程序加载完成时,接收所述虚拟机中所述隔离管理子模块发出的建立被隔离驱动授权表的指令,并建立被隔离驱动程序可写内存范围的初始授权表;当被隔离驱动程序运行过程中,接收所述虚拟机所述包装函数库发出的更新被隔离驱动授权表的指令,并根据所述包装函数实时捕捉的驱动程序所使用的内存信息,更新对应的所述驱动授权表;当被隔离驱动程序运行过程中,发生写操作缺页异常时,接收所述缺页处理子模块的查询授权表指令,并查询写操作地址是否在驱动授权表中;当被隔离驱动程序卸载完成时,接收所述虚拟机中所述隔离管理子模块发出的销毁被隔离驱动授权表的指令,销毁被隔离驱动授权表;根据所述被隔离驱动所在虚拟机内核空间在虚拟机管理器中所对应影子页表,进行页表设置,具体包括接收所述内存信息监视模块发出的设置影子页表的只读指令,并根据被隔离驱动为所述虚拟机中第一个被隔离的驱动,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为只读;接收所述内存信息监视模块发出的设置影子页表的可写指令,并根据最后一个被隔离驱动被卸载出所述虚拟机内核,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为可写,防止不必要的缺页异常;当被隔离驱动不是所述虚拟机中第一个加载进的被隔离驱动,或最后一个卸载出的被隔离驱动时,直接运行所述驱动程序,不进行整个虚拟机内核空间对应的所有影子页表的设置;当所述缺页处理子模块允许进行写操作时,所述页面设置子模块将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;根据写操作指令的来源和被隔离驱动对应的授权表,判断和控制是否允许进行写操作具体包括当写操作是来自可信任的虚拟机内核时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围在被隔离驱动程序对应的授权表中时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当进行写操作,且写操作的地址范围不在被隔离驱动程序对应的授权表中时,跳过写操作指令,结束所述驱动程序并报告错误。本发明提供了一种在虚拟机内部的驱动隔离系统与方法,通过提供监控虚拟机内部驱动运行情况的内存信息监控模块,该内存信息监控模块以模块形式加载进虚拟机中,无需修改虚拟机内核和虚拟机中的驱动程序,保证本发明与已有内核架构和驱动程序的兼容性。只需通过运行于虚拟机用户态的驱动监视加载模块以隔离加载方式加载被隔离的驱动程序,就可将被隔离驱动和内存信息监视模块建立联系,从而确保虚拟机中被隔离驱动程序内存使用情况被实时获取。本发明利用内存信息监视模块报告的虚拟机内部驱动内存使用情况建立授权表,并设置虚拟机内核空间在虚拟机管理器中所对应影子页表的写保护,建立起驱动程序的隔离运行环境。在虚拟机进行写操作时,结合授权表判断被隔离驱动程序是否具有写权限。通过隔离驱动程序可以避免驱动程序故障破坏虚拟机内核,防止虚拟机内核的崩溃,从而保证虚拟机内核所提供的其他服务(除被隔离驱动程序所提供的服务外)的正常运行。由于本发明中每个被隔离的驱动程序都有一个对应的授权表,使得可在同一虚拟机内部隔离多个驱动程序,无需为每一个被隔离的驱动程序提供一个独立的虚拟机实例,从而降低系统的性能损失。同时,如果驱动以正常方式加载进虚拟机,该驱动将被认为是可信任内核的一部分,并不影响其正常运行,保证了兼容性。


图1是一种在虚拟机内部的驱动隔离系统的架构;
图2是一种在虚拟机内部的驱动隔离系统的隔离管理子模块的流程图;图3是一种在虚拟机内部的驱动隔离方法建立隔离运行环境的流程图;图4是一种在虚拟机内部的驱动隔离方法写操作缺页异常处理流程图。
具体实施例方式下面结合附图对本发明做详细描述。参考图I所示,一种在虚拟机内部的驱动隔离系统包括运行于虚拟机用户态的驱动隔离加载模块、虚拟机内核态的内存信息监视模块以及虚拟机管理器内部的内存访问控制模块,其中,所述运行于虚拟机用户态的驱动隔离加载模块将驱动模块中监视未定义符号与内存信息监视模块中监视包装函数建立联系,使得驱动以隔离方式运行,并向内存信息监视模块中的隔离控制子模块发出被隔离驱动程序提醒消息,以使得进入内核的驱动为被隔离驱动程序;所述监视未定义符号包括内存管理函数的未定义符号和驱动注册函数的未定义符号;所述虚拟机内核态的内存信息监视模块包括包装函数库、隔离控制子模块以及消息通信子模块,其中,所述包装函数库为虚拟机内核中所监控的函数建立内核包装函数,并为虚拟机内核中驱动接口中的接口函数建立驱动包装函数,以使得被隔离驱动与内核和驱动包装函数链接,并进入隔离运行模式;所述内核包装函数包括内存包装函数和注册包装函数,所述内存包装函数是指内核中内存管理函数的包装函数,所述注册包装函数是指内核中驱动注册函数的包装函数;所述隔离控制子模块接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息,建立被隔离驱动程序的相关信息,并指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令,同时,根据需要获取可信任的虚拟机内核的地址范围,注入到内存访问控制模块,并发出设置虚拟机管理器中影子页表的指令;所述可信任的虚拟机内核的地址范围包括虚拟机内核代码和未被隔离的驱动程序代码的内存起始地址及其大小;所述消息通信子模块向内存访问控制模块实时报告被隔离驱动所使用内存信息、可信任的虚拟机内核的地址范围、及发送建立被隔离驱动授权表的指令;所述消息通信子模块被所述包装函数库和所述隔离控制子模块调用;所述内存访问控制模块用于控制被隔离驱动程序写操作,包括授权表管理子模块、页面设置子模块以及缺页处理子模块,其中,所述授权表管理子模块接收所述内存信息监视模块发出的设置被隔离驱动授权表的指令后,设置被隔离驱动程序可写内存范围的授权表,并负责确认写操作地址是否在授权表中;所述页面设置子模块接收所述内存信息监视模块发出的设置虚拟机管理器中影子页表的指令,并根据所述被隔离驱动所在虚拟机的内核空间在虚拟机管理器中所对应的影子页表,将影子页表设置为接收所述缺页处理子模块发出的允许写操作段的指令,并设置写操作目标地址对应的影子页表;
所述缺页处理子模块当被隔离驱动所在虚拟机内核出现写操作时,根据写操作指令的来源和被隔离驱动对应的授权表,判断和控制是否允许进行写操作。本发明实施例中,包装函数包括内核包装函数和驱动包装函数,内核包装函数又包括内存包装函数和注册包装函数。驱动包装函数是对驱动接口中的接口函数的包装,注册包装函数是对驱动注册内核函数的包装,内存包装函数内存管理内核函数的包装。对包装函数的命名形式为“包装函数前缀+原函数名”。例如,高端内存的分配函数“vmalloc”对应的包装函数为“monitor_vmalloc”。包装函数与原函数的参数和返回值一致。加载被隔离驱动程序重要是通过查找监视模块中带前缀的包装函数,将驱动模块中的内存管理函数的符号及其符号名替换成带前缀的包装函数的符号及其符号名,然后再加载修改过符号的驱动模块,就可避免驱动模块中的内存管理函数的符号与原函数地址的链接,如图I中VMl的内存管理函数部分的连接线,实箭头表示链接到包装函数地址,空箭头表示链接到原函数地址。例如,驱动程序中的高端内存分配“vmalloc”符号及其符号名,在加载之前会被替换成包装函数“monitor_vmalloc”的符号及其符号名,这样在加载时,驱动程序会就被自动链接到包装函数“monitor_vmalloc”的地址,而不是原函数“vmalloc”的地址。而被隔离驱动中其他内核函数的符号无需修改,并仍按原方式链接。通过监视模块的监视加载方式加载驱动程序,可在无需修改虚拟机内核和驱动程序的情况下监视驱动程序的内存使用情况。通过驱动隔离加载模块处理后,驱动模块中的驱动注册函数和内存管理函数的未定义符号就被链接到注册包装函数和内存包装函数中。但是,驱动接口中的驱动函数还未链接到驱动包装函数,这需要注册包装函数的辅助。注册包装函数并不直接监视驱动所使用的内存信息,其目的就是为了替换驱动接口中的接口函数指针,使其指向驱动包装函数。在驱动隔离加载模块调用内核原驱动加载方式加载驱动模块时,会调用驱动注册函数,此时已经链接到了注册包装函数,执行完注册包装函数,驱动接口中的接口函数就会被链接到驱动包装函数。这样,驱动开始运行后,内核对驱动的所有调用都会被驱动包装函数监视,并记录驱动使用的被授予内存信息和栈内存信息。同样,驱动对内核的内存管理函数的调用,也会被内存包装函数监视,从而记录驱动使用的堆内存信息。其中,需要监视的内存管理函数包括页面的分配/释放函数、内存高速缓存的分配/释放函数、高端内存的分配/释放函数以及其他的专用数据结构的分配/释放函数等。建立虚拟机内被隔离驱动程序对应授权表,是指驱动程序对内存空间所具有的写访问权限的地址集合。授权表记录了驱动程序所具写权限的所有内存起始地址以其大小。授权表在被隔离驱动程序被加载进虚拟机内核时建立,并在驱动运行过程中不断更新。为了加快授权表的查找速度,授权表的各个表项(即被隔离驱动程序可写的各个内存区域),同时以升序链表以及红黑树的形式组织起来。所述消息通信子模块具体会在前两种子模块中被调用。例如,当驱动分配/释放内存时,对应的包装函数就会捕捉到该信息,并通过该子模块实时的报告给内存访问控制模块,以便更新被隔离驱动对应的授权表。另外,对应已经存在被隔离驱动的情况下,又按普通方式加载了其他驱动,即新加载驱动不被隔离,则该子模块会向内存访问控制模块更新可信任的虚拟机内核范围,即将新加载驱动被当作可信任内核的一部分。
16
将运行于虚拟机用户态的驱动隔离加载模块中的内存管理函数的未定义符号和驱动注册函数的未定义符号替换为对应的所述内存包装函数和注册包装函数的符号及其符号名;调用虚拟机内核的原模块加载方式加载驱动程序模块,以使得运行于虚拟机用户态的驱动隔离加载模块驱动程序模块中包装函数符号将自动链接到所述虚拟机内存信息监视模块中的所监控的包装函数,从而完成与内核包装函数建立联系;虚拟机内核的原模块加载方式会调用驱动模块的初始化函数,执行驱动注册,驱动会自动调用已经链接到注册包装函数的驱动注册函数,完成与驱动包装函数建立联系。需要说明的是,除包装过的内存管理函数外的其他具有未定义标志的函数符号无需修改,在加载过程中,并仍按原方式链接到对应的原内核函数。进一步的,所述隔离运行模式是指被隔离驱动程序使用的所有内存信息都被实时的捕获,并建立对应的授权表,实现驱动程序隔离运行模式具体包括驱动在加载时,执行驱动注册函数向内核的驱动接口注册驱动程序,将内核中驱动模块各个功能函数的地址赋予驱动接口中的接口函数指针,通过所述驱动隔离加载模块,驱动实际将执行驱动注册函数对应的包装函数,即注册包装函数,从而实现内核对驱动调用过程的监视;所述注册包装函数执行所述虚拟机内核中的原驱动注册函数,并执行驱动接口中接口函数指针的替换操作;所述接口函数指针的替换操作是指将接口函数指针赋值成驱动包装函数的地址,代替原驱动功能函数的地址; 驱动程序加载后,驱动接口中的接口函数指针已被驱动包装函数所替换,当内核调用驱动函数时,将执行驱动包装函数,获得驱动所使用的被赋予内存信息和栈内存信息;驱动包装函数记录被赋予内存信息和栈内存信息,并将被赋予内存信息和栈内存信息注入到虚拟机管理器的授权表管理子模块,执行被隔离驱动中的原驱动函数;所述被赋予内存信息包括内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息包括执行驱动程序的进程的栈的内存起始地址及其大小;驱动在运行过程中,调用内存管理函数来分配或释放内存,通过所述驱动隔离加载模块,驱动实际将执行内存管理函数对应的包装函数,即内存包装函数,实现向内核申请分配或释放内存;所述内存包装函数执行所述虚拟机内核中的原内存管理函数,并记录分配或释放的堆内存信息,并将堆内存信息注入到虚拟机管理器的授权表管理子模块;所述堆内存信息包括驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小。这样,被隔离驱动程序以隔离模式运行,被隔离驱动程序与内核的交互中所有内存相关的调用都会被所述包装函数库中的包装函数监视,并实时得捕捉驱动程序所使用的内存信息,通知所述授权表管理子模块更新对应的所述驱动授权表。进一步的,所述内存信息监视模块中的隔离控制子模块,捕获驱动进出内核的消息,并接收进入内核驱动为被隔离驱动程序的消息,并向内存访问控制模块发出相应的指令,这些相应的指令具体用于I)当接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息时,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出建立被隔离驱动程序对应授权表的指令;
当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成只读模式的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的缺页处理子模块,注入所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;2)当捕获驱动进入内核的消息,但没有接收到进入内核的驱动为被隔离驱动的消息时,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;3)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动为被隔离驱动,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出销毁被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中最后一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成可写入模式的指令;4)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动不是被隔离驱动,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围。另外,所述授权表是指被隔离驱动程序对虚拟机内核地址空间所具有的写访问权限的地址集合,授权表里的这些地址集合包括三类所述被赋予内存信息,即内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息,即执行驱动程序的进程的栈的内存起始地址及其大小;所述堆内存信息,即驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小。进一步的,所述内存访问控制模块中的授权表管理子模块,提供授权表的建立、更新、查询和销毁等功能,具体包括当被隔离驱动程序加载完成时,接收所述虚拟机中所述隔离管理子模块发出的建立被隔离驱动授权表的指令,并建立被隔离驱动程序可写内存范围的初始授权表;当被隔离驱动程序运行过程中时,接收所述虚拟机所述包装函数库发出的更新被隔离驱动授权表的指令,并根据所述包装函数实时捕捉的驱动程序所使用的内存信息,更新对应的所述驱动授权表;当被隔离驱动程序运行过程中,发生写操作缺页异常时,接收所述缺页处理子模块的查询授权表指令,并查询写操作地址是否在驱动授权表中;被隔离驱动程序卸载完成时,接收所述虚拟机中所述隔离管理子模块发出的销毁被隔离驱动授权表的指令后,销毁被隔离驱动授权表。所述内存访问控制模块中的页面设置子模块,根据所述被隔离驱动所在虚拟机内核空间在虚拟机管理器中所对应影子页表,进行页表设置具体包括接收所述内存信息监视模块发出的设置影子页表的只读指令,并根据被隔离驱动为所述虚拟机中第一个被隔离的驱动,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为只读;接收所述内存信息监视模块发出的设置影子页表的可写指令,并根据最后一个被隔离驱动被卸载出所述虚拟机内核,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为可写,防止不必要的缺页异常;当被隔离驱动不是所述虚拟机中第一个加载的被隔离驱动,或最后一个卸载出的被隔离驱动时,直接运行所述驱动程序,不进行整个虚拟机内核空间对应的所有影子页表的设置;当所述缺页处理子模块允许进行写操作时,所述页面设置子模块将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读。所述内存访问控制模块中的缺页处理子模块,接收并保存所述隔离管理子模块注入的所述虚拟机可信内核空间的地址范围,还用于处理所述虚拟机写操作的缺页异常,具体包括当所述写操作是来自虚拟机中可信任内核,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当所述写操作是来自虚拟机中被隔离的驱动程序,且所述写操作的地址范围在被隔离驱动程序对应的授权表中时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当所述写操作,且所述写操作的地址范围不在被隔离驱动程序对应的授权表中时,跳过写操作指令,结束所述驱动程序并报告错误。一种在虚拟机内部的驱动隔离方法,包括以下步骤第一步,在需要隔离驱动程序的虚拟机中加载虚拟机内核态的内存信息监视模块;第二步,内存信息监视模块通过所述驱动隔离加载模块加载被隔离驱动程序,将被隔离驱动程序模块中未定义符号与内存信息监视模块中监视包装函数建立联系,使得被隔离驱动在加载之后以隔离方式运行;并向内存信息监视模块中的隔离控制子模块发出被隔离驱动程序提醒消息,以使得进入内核的驱动为被隔离驱动程序;所述监视未定义符号包括内存管理函数的未定义符号和驱动注册函数的未定义符号;其中,使得被隔离驱动在加载之后以隔离方式运行具体包括将运行于虚拟机用户态的驱动隔离加载模块中的内存管理函数的未定义符号和驱动注册函数的未定义符号替换为对应的所述内存包装函数和注册包装函数的符号及其符号名;调用虚拟机内核的原模块加载方式加载驱动程序模块,以使得运行于虚拟机用户态的驱动隔离加载模块驱动程序模块中包装函数符号将自动链接到所述虚拟机内存信息监视模块中的所监控的包装函数,从而完成与内核包装函数建立联系;虚拟机内核的原模块加载方式会调用驱动模块的初始化函数,执行驱动注册,驱动会自动调用已经链接到注册包装函数的驱动注册函数,完成与驱动包装函数建立联系。另外,所述实现驱动程序隔离运行模式具体包括驱动在加载时,执行驱动注册函数向内核的驱动接口注册驱动程序,将内核中驱动模块各个功能函数的地址赋予驱动接口中的接口函数指针,通过所述驱动隔离加载模块,驱动实际将执行驱动注册函数对应的包装函数,即注册包装函数,从而实现内核对驱动调用过程的监视;所述注册包装函数执行所述虚拟机内核中的原驱动注册函数,并执行驱动接口中接口函数指针的替换操作;所述接口函数指针的替换操作是指将接口函数指针赋值成驱动包装函数的地址,代替原驱动功能函数的地址;驱动程序加载后,驱动接口中的接口函数指针已被驱动包装函数所替换,当内核调用驱动函数时,将执行驱动包装函数,获得驱动所使用的被赋予内存信息和栈内存信息;驱动包装函数记录被赋予内存信息和栈内存信息,并将被赋予内存信息和栈内存信息注入到虚拟机管理器的授权表管理子模块,执行被隔离驱动中的原驱动函数;所述被赋予内存信息包括内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息包括执行驱动程序的进程的栈的内存起始地址及其大小;驱动在运行过程中,调用内存管理函数来分配或释放内存,通过所述驱动隔离加载模块,驱动实际将执行内存管理函数对应的包装函数,即内存包装函数,实现向内核申请分配或释放内存;所述内存包装函数执行所述虚拟机内核中的原内存管理函数,并记录分配或释放的堆内存信息,并将堆内存信息注入到虚拟机管理器的授权表管理子模块;所述堆内存信息包括驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小。第三步,隔离控制子模块接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息,建立被隔离驱动程序的相关信息,并指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令,同时,根据需要获取可信任的虚拟机内核的地址范围,注入到内存访问控制模块,并发出设置虚拟机管理器中影子页表的指令;所述可信任的虚拟机内核的地址范围包括虚拟机内核代码和未被隔离的驱动程序代码的内存起始地址及其大小;具体的,指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令具体包括I)当接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息时,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出建立被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成只读模式的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的缺页处理子模块,注入所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;2)当捕获驱动进入内核的消息,但没有接收到进入内核的驱动为被隔离驱动的消息时,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;
3)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动为被隔离驱动,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出销毁被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中最后一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成可写入模式的指令;4)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动不是被隔离驱动,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围。第四步,授权表管理子模块接收到隔离管理子模块发出的建立被隔离驱动授权表的指令后,设置驱动程序可写内存范围的授权表;所述设置驱动程序可写内存范围的授权表,具体包括当被隔离驱动程序加载完成时,接收所述虚拟机中所述隔离管理子模块发出的建立被隔离驱动授权表的指令,并建立被隔离驱动程序可写内存范围的初始授权表;当被隔离驱动程序运行过程中,接收所述虚拟机所述包装函数库发出的更新被隔离驱动授权表的指令,并根据所述包装函数实时捕捉的驱动程序所使用的内存信息,更新对应的所述驱动授权表;当被隔离驱动程序运行过程中,发生写操作缺页异常时,接收所述缺页处理子模块的查询授权表指令,并查询写操作地址是否在驱动授权表中。被隔离驱动程序卸载完成时,接收所述虚拟机中所述隔离管理子模块发出的销毁被隔离驱动授权表的指令后,销毁被隔离驱动授权表。第五步,页面设置子模块接收所述内存信息监视模块发出的设置虚拟机管理器中影子页表的指令,并根据所述被隔离驱动所在虚拟机的内核空间在虚拟机管理器中所对应的影子页表,将影子页表设置为接收所述缺页处理子模块发出的允许写操作段的指令,并设置写操作目标地址对应的影子页表;根据所述被隔离驱动所在虚拟机内核空间在虚拟机管理器中所对应影子页表,进行页表设置,具体包括接收所述内存信息监视模块发出的设置影子页表的只读指令,并根据被隔离驱动为所述虚拟机中第一个被隔离的驱动,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为只读;接收所述内存信息监视模块发出的设置影子页表的可写指令,并根据最后一个被隔离驱动被卸载出所述虚拟机内核,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为可写,防止不必要的缺页异常;当被隔离驱动不是所述虚拟机中第一个加载进的被隔离驱动,或最后一个卸载出的被隔离驱动时,直接运行所述驱动程序,不进行整个虚拟机内核空间对应的所有影子页表的设置;当所述缺页处理子模块允许进行写操作时,所述页面设置子模块将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读。第六步,所述缺页处理子模块接收所述隔离管理子模块发出的可信任内核的地址范围的信息,记录所述虚拟机的可信任内核的地址范围,判断和控制是否允许进行写操作。根据写操作指令的来源和被隔离驱动对应的授权表,判断和控制是否允许进行写操作具体包括当写操作是来自可信任的虚拟机内核时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围在被隔离驱动程序对应的授权表中时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当进行写操作,且写操作的地址范围不在被隔离驱动程序对应的授权表中时,跳过写操作指令,结束所述驱动程序并报告错误。参考图2所示,一种在虚拟机内部的驱动隔离系统的隔离管理子模块的流程图,包括下述步骤(I)首先,隔离管理子模块捕捉到驱动进出内核的消息。如果为加载进内核的消息,则执行步骤(2);否则,执行步骤(7)。(2)如果隔离管理子模块还捕捉到标志进入内核的驱动为被隔离驱动的消息,则执行步骤(3);否则,执行步骤(12)。(3)向虚拟机管理器中的授权表管理子模块发出建立被隔离驱动初始授权表的指令。如果被隔离驱动为第一个被隔离的驱动,则执行步骤(4);否则,执行步骤(6)。(4)向虚拟机管理器中的页面设置子模块发出将被隔离驱动程序所在的VM内核空间对应的所有影子页表设置为只读的指令。(5)向虚拟机管理器中的缺页处理子模块注入被隔离驱动所在虚拟机的可信内核的地址范围。(6)建立被隔离驱动的相关隔离信息。(7)查询所有被隔离驱动信息,判断卸载出的驱动是否为被隔离驱动。(8)如果被卸载出的驱动为被隔离驱动的消息,则执行步骤(9);否则,执行步骤(12)。(9)向虚拟机管理器中的授权表管理子模块发出销毁被隔离驱动初始授权表的指令。如果被隔离驱动为最后一个被隔离的驱动,则执行步骤(10);否则,执行步骤(11)。(10)向虚拟机管理器中的页面设置子模块发出将被隔离驱动程序所在的VM内核空间对应的所有影子页表设置为可写的指令,避免不必要的写操作缺页异常。( 11)销毁被隔离驱动的相关隔离信息。(12)向虚拟机管理器中的缺页处理子模块更新被隔离驱动所在虚拟机的可信内核的地址范围。进一步的,参考图3所示,是一种在虚拟机内部的驱动隔离方法建立隔离运行环境的流程图的隔离运行环境的方法,包括下述步骤
(I)首先,在需要隔离驱动的VM (虚拟机)中,加载上述的内存信息监视模块。(2)利用上述驱动隔离加载模块,加载被隔离驱动程序,使被隔离驱动程序与内存信息监视模块中的包装函数库建立联系,从而使驱动以隔离方式运行。(3)内存信息监视模块的隔离管理子模块,通知VMM (内存访问控制模块)相对于VM中被隔离的驱动程序,VMM可信任VM内核的地址范围。(4)内存信息监视模块的隔离管理子模块,通知VMM建立被隔离驱动程序对应的初始内存授权表。(5)内存访问控制模块的授权表管理子模块,在接收到VM发出的建立被隔离驱动授权表的指令后,VMM建立记录驱动程序可写内存范围的授权表。如果被隔离驱动是VM中第一个被隔离的驱动,执行步骤(6);否则,跳转到步骤(7)。(6)内存访问控制模块的页面设置子模块,在接收到VM发出的设置影子页表的指令后,在VMM的影子页表中,将保护被隔离驱动程序所在的VM内核空间对应的所有影子页表设置为只读。这样当VM执行写操作时,就会陷入VMM的缺页异常程序,从而就可判断被隔离驱动程序的写操作是否正确。(7)运行驱动程序,并通过VM内核内存管理函数的包装函数实时得捕捉并通知VMM更新对应的内存授权表。在虚拟机中,被隔离驱动程序仍按照原来的方式运行,无需任何改变,即隔离方式对虚拟机内核和驱动透明。而在内存访问控制模块中,被隔离驱动程序对应内存访问控制模块中的授权表,以及内存访问控制模块中设置的页面写保护,相当于在内存访问控制模块建立起一个被隔离驱动环境的隔离运行环境。隔离运行环境是一种限制权限的环境,它只提供驱动正常运行的最小内存资源。如果被隔离驱动程序出现故障,违反了隔离环境限制,就将触发错误报告。需要说明的是,对其他不包含被隔离驱动的虚拟机实例(如图I中的VM2),本发明不影响它们原有的运行方式。其虚拟机中无需加载任何额外模块,且其内存访问控制模块中对应的影子页表也不会被修改。进一步的,一种在虚拟机内部的驱动隔离方法写操作缺页异常处理流程图,参考图4所示,包括下述步骤(I)当VM执行写操作时,由于VM所对应的VMM的影子页表的写保护,将触发VMM的缺页异常程序。(2) VMM的缺页异常程序判断执行的写操作是来自VM内核还是来自VM中被隔离的驱动程序。如果来自被隔离的驱动程序,跳转到步骤(3);否则,执行步骤(5)。(3)判断写操作的地址范围是否在驱动程序对应的授权表中,如果不是,则执行步骤(4);否则,执行步骤(5)。(4)此时驱动程序的写操作越界,跳过写操作指令,结束并报告错误。(5)如果可以进行写操作,则将写操作地址对应的VMM的影子页表的相应页表项设置为可写。(6)执行写操作。(7)写操作结束后,重新将写操作地址对应的VMM的影子页表的相应页表项设置为只读。
由于保护被隔离驱动程序的虚拟机所对应的影子页表都被设置成了写保护,该虚拟机中的任何写操作都将触发内存访问控制模块的缺页异常。内存访问控制模块的缺页异常将根据虚拟机中隔离管理子模块报告的可信任内核的地址范围来判断写指令的来源。如果来自可信任的虚拟机内核,则允许写操作;如果不是,还需结合被隔离驱动程序的授权表来判断;若在授权表中,则允许,否则,报告错误。当内存访问控制模块允许写操作之后,会开放写操作地址对应的内存访问控制模块的影子页表的相应页表项的写权限,并在数个CPU周期后,重新关闭相应页表项的写权限。
权利要求
1.一种在虚拟机内部的驱动隔离系统,其特征在于包括运行于虚拟机用户态的驱动隔离加载模块、虚拟机内核态的内存信息监视模块以及虚拟机管理器内部的内存访问控制模块,其中,所述运行于虚拟机用户态的驱动隔离加载模块将驱动模块文件中监视未定义符号与内存信息监视模块中监视包装函数建立联系,使得驱动以隔离方式运行,并向内存信息监视模块中的隔离控制子模块发出被隔离驱动程序提醒消息,以使得进入内核的驱动为被隔离驱动程序;所述监视未定义符号包括内存管理函数的未定义符号和驱动注册函数的未定义符号;所述虚拟机内核态的内存信息监视模块包括包装函数库、隔离控制子模块以及消息通信子模块,其中,所述包装函数库为虚拟机内核中所监控的函数建立内核包装函数,并为虚拟机内核中驱动接口中的接口函数建立驱动包装函数,以使得被隔离驱动与内核和驱动包装函数链接,并进入隔离运行模式;所述内核包装函数包括内存包装函数和注册包装函数,所述内存包装函数是指内核中内存管理函数的包装函数,所述注册包装函数是指内核中驱动注册函数的包装函数;所述隔离控制子模块接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息,建立被隔离驱动程序的相关信息,并指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令,同时,根据需要获取可信任的虚拟机内核的地址范围,注入到内存访问控制模块,并发出设置虚拟机管理器中影子页表的指令;所述可信任的虚拟机内核的地址范围包括虚拟机内核代码和未被隔离的驱动程序代码的内存起始地址及其大小;所述消息通信子模块向内存访问控制模块实时报告被隔离驱动所使用内存信息、可信任的虚拟机内核的地址范围、及发送建立被隔离驱动授权表的指令;所述消息通信子模块被所述包装函数库和所述隔离控制子模块调用;所述内存访问控制模块用于控制被隔离驱动程序写操作,包括授权表管理子模块、页面设置子模块以及缺页处理子模块,其中,所述授权表管理子模块接收所述内存信息监视模块发出的设置被隔离驱动授权表的指令后,设置被隔离驱动程序可写内存范围的授权表,并负责确认写操作地址是否在授权表中;所述页面设置子模块接收所述内存信息监视模块发出的设置虚拟机管理器中影子页表的指令,并根据所述被隔离驱动所在虚拟机的内核空间在虚拟机管理器中所对应的影子页表,将影子页表设置为只读另外,当缺页处理子模块允许写操作时,还接收所述缺页处理子模块发出的允许写操作段的指令,并设置写操作目标地址对应的影子页表,在写操作结束后,重新将影子页表设置为只读;所述缺页处理子模块当被隔离驱动所在虚拟机内核出现写操作时,根据写操作指令的来源和被隔离驱动对应的授权表,判断和控制是否允许进行写操作。
2.根据权利要求I所述的一种在虚拟机内部的驱动隔离系统,其特征在于,运行于虚拟机用户态的驱动隔离加载模块具体用于运行于虚拟机用户态的驱动隔离加载模块,将驱动模块文件中的内存管理函数的未定义符号和驱动注册函数的未定义符号替换为对应的所述内存包装函数和注册包装函数的符号及其符号名;调用虚拟机内核的原模块加载方式加载驱动程序模块,以使驱动程序模块中包装函数符号将自动链接到所述虚拟机内存信息监视模块中的所监控的包装函数,从而完成与内核包装函数建立联系;虚拟机内核的原模块加载方式会调用驱动模块的初始化函数,执行驱动注册,驱动会自动调用已经链接到注册包装函数的驱动注册函数,完成与驱动包装函数建立联系。
3.根据权利要求I所述的一种在虚拟机内部的驱动隔离系统,其特征在于,所述隔离运行模式是指被隔离驱动程序使用的所有内存信息都被实时的捕获,并建立对应的授权表,实现驱动程序隔离运行模式具体包括驱动在加载时,执行驱动注册函数向内核的驱动接口注册驱动程序,将内核中驱动模块各个功能函数的地址赋予驱动接口中的接口函数指针,通过所述驱动隔离加载模块,驱动实际将执行驱动注册函数对应的包装函数,即注册包装函数,从而实现内核对驱动调用过程的监视;所述注册包装函数执行所述虚拟机内核中的原驱动注册函数,并执行驱动接口中接口函数指针的替换操作;所述接口函数指针的替换操作是指将接口函数指针赋值成驱动包装函数的地址,代替原驱动功能函数的地址;驱动程序加载后,驱动接口中的接口函数指针已被驱动包装函数所替换,当内核调用驱动函数时,将执行驱动包装函数,获得驱动所使用的被赋予内存信息和栈内存信息;驱动包装函数记录被赋予内存信息和栈内存信息,并将被赋予内存信息和栈内存信息注入到虚拟机管理器的授权表管理子模块,执行被隔离驱动中的原驱动函数;所述被赋予内存信息包括内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息包括执行驱动程序的进程的栈的内存起始地址及其大小;驱动在运行过程中,调用内存管理函数来分配或释放内存,通过所述驱动隔离加载模块,驱动实际将执行内存管理函数对应的包装函数,即内存包装函数,实现向内核申请分配或释放内存;所述内存包装函数执行所述虚拟机内核中的原内存管理函数,并记录分配或释放的堆内存信息,并将堆内存信息注入到虚拟机管理器的授权表管理子模块;所述堆内存信息包括驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小。
4.根据权利要求I所述的一种在虚拟机内部的驱动隔离系统,其特征在于,所述内存信息监视模块中的隔离控制子模块具体用于O当接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息时,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出建立被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成只读模式的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的缺页处理子模块,注入所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;2)当捕获驱动进入内核的消息,但没有接收到进入内核的驱动为被隔离驱动的消息时,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;3)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动为被隔离驱动,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出销毁被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中最后一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成可写入模式的指令;4)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动不是被隔离驱动,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围。
5.根据权利要求I所述的一种在虚拟机内部的驱动隔离系统,其特征在于,所述内存访问控制模块中的授权表管理子模块具体用于当被隔离驱动程序加载完成时,接收所述虚拟机中所述隔离管理子模块发出的建立被隔离驱动授权表的指令,并建立被隔离驱动程序可写内存范围的初始授权表;当被隔离驱动程序运行过程中时,接收所述虚拟机所述包装函数库发出的更新被隔离驱动授权表的指令,并根据所述包装函数实时捕捉的驱动程序所使用的内存信息,更新对应的所述驱动授权表;当被隔离驱动程序运行过程中,发生写操作缺页异常时,接收所述缺页处理子模块的查询授权表指令,并查询写操作地址是否在驱动授权表中;当被隔离驱动程序卸载完成时,接收所述虚拟机中所述隔离管理子模块发出的销毁被隔离驱动授权表的指令,销毁被隔离驱动授权表。
6.根据权利要求I所述的一种在虚拟机内部的驱动隔离系统,其特征在于,所述内存访问控制模块中的页面设置子模块具体用于接收所述内存信息监视模块发出的设置影子页表的只读指令,并根据被隔离驱动为所述虚拟机中第一个被隔离的驱动,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为只读;接收所述内存信息监视模块发出的设置影子页表的可写指令,并根据最后一个被隔离驱动被卸载出所述虚拟机内核,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为可写,防止不必要的缺页异常;当被隔离驱动不是所述虚拟机中第一个加载的被隔离驱动,或最后一个卸载出的被隔离驱动时,直接运行所述驱动程序,不进行整个虚拟机内核空间对应的所有影子页表的设置;当所述缺页处理子模块允许进行写操作时,所述页面设置子模块将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读。
7.根据权利要求I所述的一种在虚拟机内部的驱动隔离系统,其特征在于,所述内存访问控制模块中的缺页处理子模块还用于当写操作是来自可信任的虚拟机内核时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围在被隔离驱动程序对应的授权表中时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围不在被隔离驱动程序对应的授权表中时,跳过写操作指令,结束所述驱动程序并报告错误。
8.根据权利要求I所述一种在虚拟机内部的驱动隔离方法,其特征在于,包括以下步骤在需要隔离驱动程序的虚拟机中加载虚拟机内核态的内存信息监视模块;内存信息监视模块通过所述驱动隔离加载模块加载被隔离驱动程序,将被隔离驱动程序模块中未定义符号与内存信息监视模块中监视包装函数建立联系,使得被隔离驱动在加载之后以隔离方式运行;并向内存信息监视模块中的隔离控制子模块发出被隔离驱动程序提醒消息,以使得进入内核的驱动为被隔离驱动程序;所述监视未定义符号包括内存管理函数的未定义符号和驱动注册函数的未定义符号;隔离控制子模块接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息,建立被隔离驱动程序的相关信息,并指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令,同时,根据需要获取可信任的虚拟机内核的地址范围,注入到内存访问控制模块,并发出设置虚拟机管理器中影子页表的指令;所述可信任的虚拟机内核的地址范围包括虚拟机内核代码和未被隔离的驱动程序代码的内存起始地址及其大小;授权表管理子模块接收到隔离管理子模块发出的建立被隔离驱动授权表的指令后,设置驱动程序可写内存范围的授权表;页面设置子模块接收所述内存信息监视模块发出的设置虚拟机管理器中影子页表的指令,并根据所述被隔离驱动所在虚拟机的内核空间在虚拟机管理器中所对应的影子页表,将影子页表设置为接收所述缺页处理子模块发出的允许写操作段的指令,并设置写操作目标地址对应的影子页表;所述缺页处理子模块接收所述隔离管理子模块发出的可信任内核的地址范围的信息,记录所述虚拟机的可信任内核的地址范围,判断和控制是否允许进行写操作。
9.根据权利要求8所述的一种在虚拟机内部的驱动隔离方法,其特征在于,所述将被隔离驱动程序模块中未定义符号与内存信息监视模块中监视包装函数建立联系具体包括将运行于虚拟机用户态的驱动模块文件中的内存管理函数的未定义符号和驱动注册函数的未定义符号替换为对应的所述内存包装函数和注册包装函数的符号及其符号名;调用虚拟机内核的原模块加载方式加载驱动程序模块,以使得虚拟机用户态中修改过所监控未定义符号的驱动模块文件在加载之后自动链接到所述虚拟机内存信息监视模块中的所监控的包装函数,从而完成与内核包装函数建立联系;虚拟机内核的原模块加载方式会调用驱动模块的初始化函数,执行驱动注册,驱动会自动调用已经链接到注册包装函数的驱动注册函数,完成与驱动包装函数建立联系; 所述实现驱动程序隔离运行模式具体包括驱动在加载时,执行驱动注册函数向内核的驱动接口注册驱动程序,将内核中驱动模块各个功能函数的地址赋予驱动接口中的接口函数指针,通过所述驱动隔离加载模块,驱动实际将执行驱动注册函数对应的包装函数,即注册包装函数,从而实现内核对驱动调用过程的监视;所述注册包装函数执行所述虚拟机内核中的原驱动注册函数,并执行驱动接口中接口函数指针的替换操作;所述接口函数指针的替换操作是指将接口函数指针赋值成驱动包装函数的地址,代替原驱动功能函数的地址;驱动程序加载后,驱动接口中的接口函数指针已被驱动包装函数所替换,当内核调用驱动函数时,将执行驱动包装函数,获得驱动所使用的被赋予内存信息和栈内存信息;驱动包装函数记录被赋予内存信息和栈内存信息,并将被赋予内存信息和栈内存信息注入到虚拟机管理器的授权表管理子模块,执行被隔离驱动中的原驱动函数;所述被赋予内存信息包括内核授权驱动操作的内核数据结构的内存起始地址及其大小;所述栈内存信息包括执行驱动程序的进程的栈的内存起始地址及其大小;驱动在运行过程中,调用内存管理函数来分配或释放内存,通过所述驱动隔离加载模块,驱动实际将执行内存管理函数对应的包装函数,即内存包装函数,实现向内核申请分配或释放内存;所述内存包装函数执行所述虚拟机内核中的原内存管理函数,并记录分配或释放的堆内存信息,并将堆内存信息注入到虚拟机管理器的授权表管理子模块;所述堆内存信息包括驱动程序向所述虚拟机内核申请分配或释放的内存起始地址及其大小;指示消息通信子模块向所述虚拟机管理器内部的内存访问控制模块发送设置被隔离驱动授权表的指令具体包括O当接收运行于虚拟机用户态的驱动隔离加载模块发出的被隔离驱动程序提醒消息时,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出建立被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的页面设置子模块,发出设置虚拟机管理器中影子页表为成只读模式的指令;当被隔离驱动是所述虚拟机中第一个被隔离的驱动时,向内存访问控制模块中的缺页处理子模块,注入所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;2)当捕获驱动进入内核的消息,但没有接收到进入内核的驱动为被隔离驱动的消息时,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;3)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动为被隔离驱动,将执行以下操作向内存访问控制模块中的授权表管理子模块,发出销毁被隔离驱动程序对应授权表的指令;当被隔离驱动是所述虚拟机中最后一个被隔离的驱动时,向内存访问控制模块中的页6面设置子模块,发出设置虚拟机管理器中影子页表为成可写入模式的指令;4)当捕获驱动卸载出内核的消息时,查询已有的被隔离驱动信息,如果发现卸载出的驱动不是被隔离驱动,将执行以下操作向内存访问控制模块中的缺页处理子模块,更新所述被隔离驱动所在虚拟机的可信任内核空间的地址范围;所述设置驱动程序可写内存范围的授权表,具体包括当被隔离驱动程序加载完成时,接收所述虚拟机中所述隔离管理子模块发出的建立被隔离驱动授权表的指令,并建立被隔离驱动程序可写内存范围的初始授权表;当被隔离驱动程序运行过程中,接收所述虚拟机所述包装函数库发出的更新被隔离驱动授权表的指令,并根据所述包装函数实时捕捉的驱动程序所使用的内存信息,更新对应的所述驱动授权表;当被隔离驱动程序运行过程中,发生写操作缺页异常时,接收所述缺页处理子模块的查询授权表指令,并查询写操作地址是否在驱动授权表中;当被隔离驱动程序卸载完成时,接收所述虚拟机中所述隔离管理子模块发出的销毁被隔离驱动授权表的指令,销毁被隔离驱动授权表;根据所述被隔离驱动所在虚拟机内核空间在虚拟机管理器中所对应影子页表,进行页表设置,具体包括接收所述内存信息监视模块发出的设置影子页表的只读指令,并根据被隔离驱动为所述虚拟机中第一个被隔离的驱动,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为只读;接收所述内存信息监视模块发出的设置影子页表的可写指令,并根据最后一个被隔离驱动被卸载出所述虚拟机内核,将被隔离驱动程序所在虚拟机内核空间对应的虚拟机管理器中的影子页表中的所有页表设置为可写,防止不必要的缺页异常;当被隔离驱动不是所述虚拟机中第一个加载进的被隔离驱动,或最后一个卸载出的被隔离驱动时,直接运行所述驱动程序,不进行整个虚拟机内核空间对应的所有影子页表的设置;当所述缺页处理子模块允许进行写操作时,所述页面设置子模块将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;根据写操作指令的来源和被隔离驱动对应的授权表,判断和控制是否允许进行写操作具体包括当写操作是来自可信任的虚拟机内核时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当写操作是来自虚拟机中被隔离的驱动程序,且写操作的地址范围在被隔离驱动程序对应的授权表中时,则通知页面设置子模块,将写操作地址对应的影子页表的相应页表项改为可写,并且执行写操作,在写操作结束后,重新将写操作地址对应的影子页表的相应页表项改为只读;当进行写操作,且写操作的地址范围不在被隔离驱动程序对应的授权表中时,跳过写操作指令,结束所述驱动程序并报告错误。
全文摘要
本发明公开了一种在虚拟机内部的驱动隔离系统与方法,涉及计算机容错技术,通过被隔离驱动程序的授权表,实现简单、有效、兼容已有操作系统和驱动程序架构的基于全虚拟化技术在虚拟机内部隔离驱动程序的系统,一种在虚拟机内部的驱动隔离系统包括运行于虚拟机用户态的驱动隔离加载模块、虚拟机内核态的内存信息监视模块以及虚拟机管理器内部的内存访问控制模块,所述虚拟机内核态的内存信息监视模块包括包装函数库、隔离控制子模块以及消息通信子模块。
文档编号G06F21/50GK102938035SQ20121044275
公开日2013年2月20日 申请日期2012年11月8日 优先权日2012年11月8日
发明者董小社, 郑豪, 张兴军, 王恩东, 辛龙, 张东, 陈宝可, 王强 申请人:西安交通大学, 山东高效能服务器和存储研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1