虚拟机内存的漏洞修复方法、装置及计算机设备与流程

文档序号:19156567发布日期:2019-11-16 00:52阅读:247来源:国知局
本发明涉及漏洞修复
技术领域
:,特别是涉及虚拟机内存的漏洞修复方法、装置、计算机设备及存储介质。
背景技术
::当前云技术为了充分利用资源,可以在实体设备上安装由虚拟机软件模拟出的一台虚拟机,即逻辑上的服务器,在该虚拟机运行过程中,用户可以像对真实物理机的操作一样对虚拟机进行操作。例如,当检测到虚拟机中出现漏洞时,可以通过升级代码的方式,对该高危漏洞进行修复,但是,完成系统级漏洞修复的前提是关闭或者重新启动该虚拟机,如此便会出现虚拟机间断或者停机的问题;由于虚拟机中同时运行多个应用程序,若关闭或者重新启动该虚拟机,会造成虚拟机业务的中断。针对上述问题,传统的解决方案是直接将漏洞修复补丁注入到内存区域中,修改内存区域中漏洞对应的程序代码。但是由于系统运行环境的多样性以及漏洞的复杂性,直接对现有内存代码进行修改的风险是极高的,一旦出现错误将不可挽回。技术实现要素:基于此,本发明实施例提供了虚拟机内存的漏洞修复方法、装置、计算机设备及存储介质,可以将漏洞补丁加载到影子内存中,无需直接修改现有内存,保证虚拟机业务的正常运行。本发明实施例的内容如下:第一方面,本发明实施例提供一种虚拟机内存的漏洞修复方法,包括以下步骤:确定漏洞代码所在的第一内存区域;将漏洞补丁加载到第二内存区域中,以对所述第二内存区域中的漏洞代码进行漏洞修复;所述第二内存区域为与所述第一内存区域对应的影子内存区域;所述第二内存区域中保存有所述漏洞代码;在所述第二内存区域中的漏洞代码修复完成之后,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码;所述第一代码为第一内存区域中的代码,所述第二代码为经过漏洞修复的所述第二内存区域中的代码。第二方面,本发明实施例提供一种虚拟机内存的漏洞修复装置,包括:区域确定模块,用于确定漏洞代码所在的第一内存区域;漏洞修复模块,用于将漏洞补丁加载到第二内存区域中,以对所述第二内存区域中的漏洞代码进行漏洞修复;所述第二内存区域为与所述第一内存区域对应的影子内存区域;所述第二内存区域中保存有所述漏洞代码;进程控制模块,用于在所述第二内存区域中的漏洞代码修复完成之后,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码;所述第一代码为第一内存区域中的代码,所述第二代码为经过漏洞修复的所述第二内存区域中的代码。第三方面,本发明实施例提供一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:确定漏洞代码所在的第一内存区域;将漏洞补丁加载到第二内存区域中,以对所述第二内存区域中的漏洞代码进行漏洞修复;所述第二内存区域为与所述第一内存区域对应的影子内存区域;所述第二内存区域中保存有所述漏洞代码;在所述第二内存区域中的漏洞代码修复完成之后,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码;所述第一代码为第一内存区域中的代码,所述第二代码为经过漏洞修复的所述第二内存区域中的代码。第四方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:确定漏洞代码所在的第一内存区域;将漏洞补丁加载到第二内存区域中,以对所述第二内存区域中的漏洞代码进行漏洞修复;所述第二内存区域为与所述第一内存区域对应的影子内存区域;所述第二内存区域中保存有所述漏洞代码;在所述第二内存区域中的漏洞代码修复完成之后,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码;所述第一代码为第一内存区域中的代码,所述第二代码为经过漏洞修复的所述第二内存区域中的代码。上述虚拟机内存的漏洞修复方法、装置、计算机设备和存储介质,确定漏洞代码所在的第一内存区域,创建第一内存区域的影子内存区域,在影子内存区域中修复漏洞代码,并控制运行进程运行漏洞修复后的影子内存区域,不需要修改主内存中的代码就能保证虚拟机业务的正常运行。附图说明图1为一个实施例中虚拟机内存的漏洞修复方法的应用环境图;图2为一个实施例中虚拟机内存的漏洞修复方法的流程示意图;图3为一个实施例中虚拟化内存的结构示意图;图4为一个实施例中内存分页的结构示意图;图5为另一个实施例中虚拟化内存的结构示意图;图6为另一个实施例中内存分页的结构示意图;图7为另一个实施例中虚拟机内存的漏洞修复方法的流程示意图;图8为再一个实施例中虚拟机内存的漏洞修复方法的流程示意图;图9为一个实施例中虚拟机内存的漏洞修复装置的结构框图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。本申请提供的虚拟机内存的漏洞修复方法可以应用于如图1所示的计算机设备中。该计算机设备可以是服务器,也可以是终端设备,其内部结构图可以如图1所示。该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和输入装置等。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现虚拟机内存的漏洞修复方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行虚拟机内存的漏洞修复方法。计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等,计算机设备的网络接口用于与外部的终端通过网络连接通信。其中,该计算机设备为服务器时,可以用独立的服务器或者是多个服务器组成的服务器集群来实现;该计算机设备为终端设备时,可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备。本领域技术人员可以理解,图1中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。本发明实施例提供一种虚拟机内存的漏洞修复方法、装置、计算机设备及存储介质。以下分别进行详细说明。在一个实施例中,如图2所示,提供了一种虚拟机内存的漏洞修复方法。以该方法应用于图1中的计算机设备为例进行说明,包括以下步骤:s201、确定漏洞代码所在的第一内存区域。首先对虚拟化技术进行解释:虚拟化(英语:virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的虚拟部分不受现有资源的架设方式、地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。虚拟机是指通过虚拟化技术模拟出的设备,它是利用虚拟化技术模拟的具有完整硬件系统功能的、运行在一个隔离环境中的完整计算机系统。虚拟化内存是虚拟化技术的一部分,它负责为虚拟机提供内存虚拟化,在虚拟机中是感知不到虚拟化内存的存在的,就像真实的物理内存一样使用。进一步地,主内存是虚拟机主要使用的内存,虚拟机中的系统和服务所需要的内存都是从主内存中采用。在运行一段时间后虚拟机可能会发生漏洞,在本发明实施例中虚拟机指的主要是需要修复的目标系统。漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。而虚拟机的应用程序出现漏洞时,这个漏洞往往出现在虚拟化主内存中的特定地址范围内。在一个实施例中,确定漏洞代码所在的第一内存区域的步骤具体可以为:获取虚拟机的漏洞描述信息;根据所述漏洞描述信息,确定漏洞代码所在的第一内存区域。其中,漏洞描述信息指的是能对漏洞所在地址、漏洞严重程度等进行描述的信息。进一步地,漏洞描述信息可以指服务供应商提供的漏洞补丁细节,通过该信息可以确定漏洞的内存地址;另外,如果服务供应商没有提供,可以通过将升级文件(升级文件可以为对现有文件中的漏洞进行修复后得到的文件)和现有文件进行对比来确定。进一步地,计算机设备接收到漏洞描述信息,确定虚拟机主内存中出现漏洞的位置,而该位置对应的地址区域可以作为第一内存区域。当然,在一些实施例中,第一内存区域也可以不是主内存中的区域,例如:可以为主内存之外的外部内存中的区域,在这种情况下,可以在外部内存出现漏洞代码时进行漏洞修复以及内存区域的替换,保证虚拟机运行进程的正常运行。s202、将漏洞补丁加载到第二内存区域中,以对所述第二内存区域中的漏洞代码进行漏洞修复;所述第二内存区域为与所述第一内存区域对应的影子内存区域;所述第二内存区域中保存有所述漏洞代码。其中,漏洞补丁指的是能对漏洞代码进行修复的数据,可以是用于替换的代码,也可以是指示工作人员或者计算机设备进行代码修改的相关数据。可以由服务供应商提供,也可以由管理人员根据漏洞代码编写,还可以按照一定的补丁生成算法生成。对第二内存区域中的漏洞代码进行漏洞修复可以是用漏洞补丁对应的代码替换漏洞代码,也可以是根据漏洞补丁对漏洞代码中出现问题的语句进行修改,还可以是直接将第二内存区域中的代码替换为没有漏洞代码的代码段,还可以是其他的漏洞修复方式。创建第二内存区域的实现过程可以为:确定所述第一内存区域的大小;在外部内存中创建与所述第一内存区域的大小对应的第二内存区域;所述外部内存为虚拟机主内存以外的内存区域;将所述第一内存区域中的目标代码拷贝到所述第二内存区域中;其中,所述目标代码中包含有所述漏洞代码。如图3所示,在主内存区域外申请了一个与第一内存区域大小一致的影子内存区域,作为第二内存区域,并将第一内存区域中的代码(即包含有漏洞代码的目标代码)复制到第二内存区域中,此时第二内存区域中就包含了待修复的漏洞代码。向第二内存区域中加载漏洞补丁,就能通过该漏洞补丁对第二内存区域中的漏洞代码进行修复。由于第二内存区域与第一内存区域大小一致、所包含的代码一致,是第一内存代码的复制,可以理解为第一内存区域的替代区域。因此,将第二内存区域成为第一内存区域的影子内存。进一步地,第二内存区域的大小也可以与第一内存区域不一致,甚至可以只与漏洞代码的地址范围对应。更进一步地,内存区域中可以包含有多个内存分页,而第一内存区域和第二内存区域都可以对应一个、两个甚至多个内存分页。在一些实施例中,一个内存分页也可以对应多个第一内存区域或多个第二内存区域。在本步骤中,计算机设备创建与第一内存区域对应的影子内存区域,得到第二内存区域(也可以称为补丁内存或者漏洞内存),并将漏洞补丁加载到第二内存区域中,对第二内存区域中的漏洞代码进行修复。s203、在所述第二内存区域中的漏洞代码修复完成之后,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码;所述第一代码为第一内存区域中的代码,所述第二代码为经过漏洞修复的所述第二内存区域中的代码。虚拟机在运行过程中会有多个进程在运行,而这些运行进程中会有需要访问第一内存区域的进程。此时可以将这些运行进程中与第一代码相关的信息替换成与第二代码相关的信息,经过这样的操作,这些运行进程就会直接访问第二内存区域,而此时第二内存区域中的代码已经完成了漏洞修复,因此就不需要运行第一内存区域中的漏洞代码了,这样的操作能有效保证运行进程的正常进行。对于前述第二内存区域与漏洞代码的地址范围对应的情况,漏洞修复的具体实现过程可以为:在外部内存中创建一个与漏洞代码b对应的影子内存区域(即补丁内存),将漏洞补丁加载到补丁内存中进行漏洞修复。在之后的步骤中,可以将所述虚拟机的运行进程中漏洞代码b中的代码替换为补丁内存中的代码,使得运行进程所运行的代码都是准确无误的。进一步地,如果第一内存区域中存储有代码之外的业务数据,也可以将这些业务数据复制到第二内存区域中,运行进程在需要读取或写入相应业务数据时,直接访问第二内存区域并对对应的业务数据进行操作。本实施例提供的虚拟机内存的漏洞修复方法,在虚拟机主内存中确定漏洞代码所在的第一内存区域,创建第一内存区域的影子内存区域,在影子内存区域中修复漏洞代码,并控制运行进程运行漏洞修复后的影子内存区域,不需要修改主内存中的代码就能保证虚拟机业务的正常运行,能有效防止直接对现有内存代码进行修改的风险。在一个实施例中,所述控制所述虚拟机的运行进程从运行第一代码变为运行第二代码的步骤,包括:获取所述运行进程的控制寄存器页表;将所述控制寄存器页表中的第一分页挂载到第二分页中;所述第一分页与所述第一内存区域对应,所述第二分页与所述第二内存区域对应。在本实施例中,第一分页可以直接理解为第一内存区域,第二分页可以直接理解为第二内存区域。目前常用的虚拟化内存是通过intel的ept(shadowpagetables扩展页表)技术生成,当然,也可以通过amd的npt技术生成。以ept技术为例,控制寄存器页表可以为cr3(控制寄存器3,代表了进程的内存空间)页表中。进一步地,ept(ept是一种分页映射机制)在原有cr3页表地址映射的基础上,引入了ept页表来实现另一层映射,即在虚拟化环境下内存使用两层的地址转换,实现了gva->gpa->hpa的两次地址转换都由硬件来完成:guest应用程序可见的guest虚拟内存地址(guestvirtualaddress,gva)到客户机物理地址(guestphysicaladdress,gpa)的转换,再从客户机物理地址到宿主机物理地址(hostphysicaladdress,hpa)的转换。进一步地,分页映射就是将整个大的内存划分为一页一页的小内存单元,每一页内存都是可以单独管理的,内存区域就是多个内存分页。通过ept技术生成的虚拟化内存可以如图4所示,在图4中,内存被划分为多个区域,而各个区域作为一个分页,其中401为第一分页,402为第二分页。挂载之前,运行进程在运行过程中访问第一分页401(如图4a),而挂载之后,运行进程变为访问第二分页402(如图4b)。在一些实施例中,对于第一内存区域和第二内存区域对应多个分页的情况,进行挂载时,可以将漏洞代码所在的某个或某些分页进行挂载;而对于一个分页对应多个第一内存区域或多个第二内存区域的情况,进行挂载时,可以将漏洞代码所在的分页进行挂载。即,需要确定漏洞代码所占的分页是哪个或哪些,将这个或这些分页进行挂载即可。具体地,所述将所述控制寄存器页表中的第一分页挂载到第二分页中的步骤,包括:锁定所述第一分页;根据扩展页表技术(即ept技术),将所述运行程序中所述第一分页的地址替换为所述第二分页的地址;解除所述第一分页的锁定。该虚拟机cpu也可以简称为vcpu。其中,第一分页被锁定,即被设置为不可执行。如果在地址替换过程中第一分页被修改,而第二分页也出现故障,则对应的代码就无法被执行,因此通过锁定第一分页的方式能有效保证内存区域中代码的完整性和正确性。在地址替换过程中会修改vcpu状态,因此需要提前保存一份vcpu的上下文信息,在完成地址替换过程之后,可以恢复vcpu上下文的正常运行。进一步地,所述将所述控制寄存器页表中的第一分页挂载到第二分页中的步骤,包括:锁定所述第一分页;保存虚拟机cpu的上下文信息;根据扩展页表技术,将所述运行程序中所述第一分页的地址替换为所述第二分页的地址;解除所述第一分页的锁定。上述实施例提供的虚拟机内存的漏洞修复方法,由于多核多线程的影响,采用直接拷贝的方式可能会影响进程的正常运行,本发明实施例采用ept替换的方式进行修复,由于ept是一种分页映射机制,因此将主内存中漏洞区域的分页替换成影子内存的分页,这样的修改会有效地避免直接拷贝主内存而造成各种同步问题,保证虚拟机进程的正常运行。在一些实施例中,第一分页可以在运行进程稳定一段时间后被释放,即可以用于存储其他的信息;另外,也可以将原先存储在第一分页中的信息保存在硬盘上,以防内存中重复保存不必要的信息,提高内存的利用率。在一个实施例中,所述在外部内存中创建与所述第一内存区域的大小对应的第二内存区域的步骤之后,还包括:在所述外部内存中创建与所述第一内存区域的大小对应的备份内存区域;将所述目标代码拷贝到所述备份内存区域(也可以简称为备份内存)中;拷贝到所述备份内存区域中的目标代码用于对所述第二内存区域进行备份。其中,备份内存区域的大小可以与第一内存区域一致,也可以与第一内存区域不一致,甚至可以只与漏洞代码的地址范围对应。其中,备份内存区域同样也可以理解为影子内存区域,其示意图可以如图5所示。对第二内存区域进行备份的实现过程可以如图6所示。在备份操作之前,运行进程访问第二分页402(如图6a),而备份操作之后,运行进程变为访问第三分页601(如图6b)。备份内存区域中的代码可以进行修复也可以不进行修复,在第二内存区域的代码运行出现故障时运行进程运行备份内存区域中的代码,对于不进行备份内存修复的情况,即可以使得虚拟机恢复到漏洞修复前的状态(可以理解为还原为漏洞修复前的状态),而对于进行备份内存修复的情况,则可以保证所述虚拟机的运行进程所运行代码的正确性和完整性。进一步地,所述控制所述虚拟机的运行进程从运行第一代码变为运行第二代码的步骤之后,还包括:监控所述运行进程对所述第二代码的第一运行状态;若根据所述第一运行状态确定第二代码出现异常,控制所述运行进程从运行第二代码变为运行第三代码;所述第三代码为所述备份内存区域中的代码。更进一步地,所述控制所述虚拟机的运行进程从运行第一代码变为运行第二代码的步骤之后,还包括:监控所述运行进程对所述第二代码的第一运行状态;若根据所述第一运行状态确定第二代码出现异常,将所述漏洞补丁加载到所述备份内存区域中对漏洞代码进行漏洞修复;控制所述运行进程从运行第二代码变为运行第四代码;所述第四代码为经过漏洞修复的所述备份内存区域中的代码。进一步地,在一个实施例中,影子内存区域是主内存的局部拷贝,当需要修复漏洞时,对主内存中的漏洞区域进行两次拷贝生成备份内存和补丁内存。备份内存和补丁内存的功能描述如下:a)备份内存:在修复后出现异常时进行还原。b)补丁内存:漏洞首先在补丁内存中修复,经过漏洞修复的补丁内存与主内存同步。在一些实施例中,如果确定补丁内存中的代码出现异常,且通过备份内存区域中对补丁内存进行了备份修复,则可以释放补丁内存。同时,在运行进程稳定一段时间后,也可以将备份内存释放,而仅保留补丁内存。这样的处理方式能提高虚拟机内存的利用率。上述实施例提供的虚拟机内存的漏洞修复方法,在漏洞修复后,利用ept监控虚拟机的内存访问,从而可以监控漏洞是否修复,如果发生了异常,可以利用备份内存及时进行预警和还原,避免了虚拟机宕机的风险。在一个实施例中,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码的步骤,还包括:创建测试进程;控制所述测试进程运行所述第二代码;获取得到测试进程对所述第二代码的第二运行状态;若根据所述第二运行状态确定漏洞修复成功,控制所述运行进程从运行第一代码变为运行第二代码。本实施例可以理解为对补丁进行测试的过程,该测试会在虚拟机中启动一个测试进程,利用ept将该进程的cr3挂载到影子内存区域上,然后在测试进程中运行测试代码,查看是否产生异常。具体方法如下:a)虚拟机通过createprocess创建测试进程。b)虚拟机管理程序捕获syscall调用,发现是测试进程。c)修改测试进程cr3页表,将漏洞区域的分页挂载到补丁内存对应的分页上,即,将补丁内存应用到测试进程上。d)继续运行测试进程。进一步地,如果补丁测试通过(即根据该第二运行状态确定漏洞修复成功),则可以控制运行进程运行影子内存中的代码;如果补丁测试不通过,则可以重新将漏洞补丁加载到补丁内存中进行漏洞修复,还可以重新获取漏洞补丁以重新加载到补丁内存中进行漏洞修复,并在修复完成后重复补丁测试的过程。由于系统运行的环境是复杂多变的,补丁测试能确认漏洞是否修复,以及这个补丁会不会带来其他的影响。上述实施例,能在漏洞修复完成后,对经过漏洞修复的代码进行测试,这样的处理方式能有效保证运行进程所运行代码的正确性,保证虚拟机业务的正常进行。在一个实施例中,如图7所示,提供一种虚拟机内存的漏洞修复方法,包括以下步骤:s701、获取虚拟机的漏洞描述信息。s702、根据漏洞描述信息,在虚拟机主内存中确定漏洞代码所在的第一内存区域。s703、确定所述第一内存区域的大小。s704、在外部内存中分别创建与第一内存区域的大小对应的第二内存区域和备份内存区域;其中,外部内存为虚拟机主内存以外的内存区域。s705、将第一内存区域中的目标代码分别拷贝到第二内存区域和备份内存区域中;其中,目标代码中包含有该漏洞代码。s706、将漏洞补丁加载到第二内存区域中,以对第二内存区域中的漏洞代码进行漏洞修复。s707、创建测试进程;控制该测试进程运行第二代码;其中,第二代码为经过漏洞修复的第二内存区域中的代码。s708、获取测试进程对第二代码的运行状态。s709、若根据该运行状态确定漏洞修复成功,获取虚拟机的运行进程的cr3页表。s710、锁定与第一内存区域对应的第一分页,并保存虚拟机cpu的上下文信息。s711、根据ept技术,将cr3页表中第一分页挂载到第二分页;解除对第一分页的锁定;其中,第二分页与第二内存区域对应。s712、监控该运行进程对第二代码的运行状态。s713、若根据该运行状态确定第二代码出现异常,将漏洞补丁加载到备份内存区域中对漏洞代码进行漏洞修复。s714、控制该运行进程从运行第二代码变为运行第三代码;其中,第三代码为经过漏洞修复的备份内存区域中的代码。上述实施例,能在漏洞修复完成后,对经过漏洞修复的代码进行测试,这样的处理方式能有效保证运行进程所运行代码的正确性,保证虚拟机业务的正常进行。为了更好地理解上述方法,如图8所示,以下详细阐述一个本发明虚拟机内存的漏洞修复方法的应用实例。s801、定位漏洞:获取服务供应商提供的漏洞补丁信息,通过该信息可以确定漏洞的内存地址,该内存地址所在的区域即为第一分页。如果服务供应商没有提供,可以将升级文件和现有文件进行对比来确定第一分页。s802、创建影子内存:根据第一分页的大小在主内存外申请两块对应第一分页大小的内存区域,将主内存中的第一分页中的代码拷贝到新的两块内存区域中,生成影子内存(包括备份内存和补丁内存),该操作在虚拟机外部完成,并不影响虚拟机运行。s803、导入补丁:将升级文件(带有漏洞补丁)加载到补丁内存中,将其中的漏洞代码进行修复,该操作同样在虚拟机外部完成,并不影响虚拟机运行。s804、补丁测试:在虚拟机中启动一个测试进程,利用ept将该测试进程的cr3挂载到影子内存上,然后在测试进程中运行测试代码,查看是否产生异常。s805、内存替换:当补丁测试通过后,就需要将补丁内存应用到主内存中,此时可以将主内存中第一分页替换成补丁内存的第二分页。这样的修改会有效避免直接修改主内存而造成各种同步问题。具体方法如下:a)在虚拟机管理程序中,查看主内存漏洞区域的ept页表项,即确定第一分页。b)将该ept页表项锁定,设置为不可执行。c)记录vcpu的上下文。d)将该ept项的内存地址替换为补丁内存的地址。e)解除ept项锁定,恢复vcpu上下文。s806、异常监控:在修复后,利用ept监控虚拟机的内存访问,从而可以监控漏洞是否修复,如果发生了异常,则可以执行还原内存的步骤(s807)及时进行预警和内存还原,如果没有发生异常,则继续进行监控。另外,在内存还原之后,可以进行下一轮的漏洞修复过程。本实施例提供的虚拟机内存的漏洞修复方法,通过影子内存技术(即利用虚拟化内存技术(ept)将现有内存进行一份局部拷贝),可以将漏洞补丁完整地从硬盘中加载到影子内存中,无需直接修改现有内存;接着可以利用影子内存在后台进行补丁的可靠性测试,并不会影响当前的系统的运行;最后将影子内存应用到现有内存上,完成漏洞修复;如果修复后的内存出现了异常,则可以利用备份的影子内存迅速还原,不会导致宕机。需要说明的是,对于前述的各方法实施例,为了简便描述,将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。基于与上述实施例中的虚拟机内存的漏洞修复方法相同的思想,本发明还提供虚拟机内存的漏洞修复装置,该装置可用于执行上述虚拟机内存的漏洞修复方法。为了便于说明,虚拟机内存的漏洞修复装置实施例的结构示意图中,仅仅示出了与本发明实施例相关的部分,本领域技术人员可以理解,图示结构并不构成对装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。在一个实施例中,如图9所示,本发明实施例提供一种虚拟机内存的漏洞修复装置,包括区域确定模块901、漏洞修复模块902和进程控制模块903,详细说明如下:区域确定模块901,用于确定漏洞代码所在的第一内存区域。漏洞修复模块902,用于将漏洞补丁加载到第二内存区域中,以对所述第二内存区域中的漏洞代码进行漏洞修复;所述第二内存区域为与所述第一内存区域对应的影子内存区域;所述第二内存区域中保存有所述漏洞代码。进程控制模块903,用于在所述第二内存区域中的漏洞代码修复完成之后,控制所述虚拟机的运行进程从运行第一代码变为运行第二代码;所述第一代码为第一内存区域中的代码,所述第二代码为经过漏洞修复的所述第二内存区域中的代码。本实施例提供的虚拟机内存的漏洞修复装置,在虚拟机主内存中确定漏洞代码所在的第一内存区域,创建第一内存区域的影子内存区域,在影子内存区域中修复漏洞代码,并控制运行进程运行漏洞修复后的影子内存区域,不需要修改主内存中的代码就能保证虚拟机业务的正常运行。在一个实施例中,进程控制模块903,包括:页表获取子模块,用于获取所述运行进程的控制寄存器页表;分页挂载子模块,用于将所述控制寄存器页表中的第一分页挂载到第二分页中;所述第一分页与所述第一内存区域对应,所述第二分页与所述第二内存区域对应。在一个实施例中,分页挂载子模块,包括:分页锁定单元,用于锁定所述第一分页;信息保存单元,用于保存虚拟机cpu的上下文信息;地址替换单元,用于根据扩展页表技术,将所述运行程序中所述第一分页的地址替换为所述第二分页的地址;锁定解除单元,用于解除所述第一分页的锁定。在一个实施例中,虚拟机内存的漏洞修复装置,还包括:区域大小确定模块,用于确定所述第一内存区域的大小;第一区域创建模块,用于在外部内存中创建与所述第一内存区域的大小对应的第二内存区域;所述外部内存为虚拟机主内存以外的内存区域;第一代码拷贝模块,用于将所述第一内存区域中的目标代码拷贝到所述第二内存区域中;其中,所述目标代码中包含有所述漏洞代码。在一个实施例中,虚拟机内存的漏洞修复装置,还包括:第二区域创建模块,用于在所述外部内存中创建与所述第一内存区域的大小对应的备份内存区域;第二代码拷贝模块,用于将所述目标代码拷贝到所述备份内存区域中;拷贝到所述备份内存区域中的目标代码用于对所述第二内存区域进行备份。在一个实施例中,虚拟机内存的漏洞修复装置,还包括:运行状态监控模块,用于监控所述运行进程对所述第二代码的第一运行状态;补丁加载模块,用于若根据所述第一运行状态确定第二代码出现异常,将所述漏洞补丁加载到所述备份内存区域中对漏洞代码进行漏洞修复;进程代码变换模块,用于控制所述运行进程从运行第二代码变为运行第三代码;所述第三代码为经过漏洞修复的所述备份内存区域中的代码。在一个实施例中,进程控制模块903,还包括:测试进程创建子模块,用于创建测试进程;测试进程控制子模块,用于控制所述测试进程运行所述第二代码;运行状态确定子模块,用于获取得到测试进程对所述第二代码的第二运行状态;进程代码变换子模块,用于若根据所述第二运行状态确定漏洞修复成功,控制所述运行进程从运行第一代码变为运行第二代码。需要说明的是,本发明的虚拟机内存的漏洞修复装置与本发明的虚拟机内存的漏洞修复方法一一对应,在上述虚拟机内存的漏洞修复方法的实施例阐述的技术特征及其有益效果均适用于虚拟机内存的漏洞修复装置的实施例中,具体内容可参见本发明方法实施例中的叙述,此处不再赘述,特此声明。此外,上述示例的虚拟机内存的漏洞修复装置的实施方式中,各程序模块的逻辑划分仅是举例说明,实际应用中可以根据需要,例如出于相应硬件的配置要求或者软件的实现的便利考虑,将上述功能分配由不同的程序模块完成,即将所述虚拟机内存的漏洞修复装置的内部结构划分成不同的程序模块,以完成以上描述的全部或者部分功能。在一个实施例中,本申请提供的虚拟机内存的漏洞修复装置可以实现为一种计算机程序的形式,计算机程序可在如图1所示的计算机设备上运行。计算机设备的存储器中可存储组成该虚拟机内存的漏洞修复装置的各个程序模块,比如,图9所示的区域确定模块901、漏洞修复模块902和进程控制模块903。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的虚拟机内存的漏洞修复方法中的步骤。例如,图1所示的计算机设备可以通过如图9所示的虚拟机内存的漏洞修复装置中的区域确定模块901执行s201,可通过漏洞修复模块902执行s202,可通过进程控制模块903执行s203。在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述虚拟机内存的漏洞修复方法的步骤。此处虚拟机内存的漏洞修复方法的步骤可以是上述各个实施例的虚拟机内存的漏洞修复方法中的步骤。在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述虚拟机内存的漏洞修复方法的步骤。此处虚拟机内存的漏洞修复方法的步骤可以是上述各个实施例的虚拟机内存的漏洞修复方法中的步骤。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1