CN108874500B - 一种基于硬件虚拟化技术的应用程序安全保护方法 - Google Patents
一种基于硬件虚拟化技术的应用程序安全保护方法 Download PDFInfo
- Publication number
- CN108874500B CN108874500B CN201810384703.7A CN201810384703A CN108874500B CN 108874500 B CN108874500 B CN 108874500B CN 201810384703 A CN201810384703 A CN 201810384703A CN 108874500 B CN108874500 B CN 108874500B
- Authority
- CN
- China
- Prior art keywords
- virtual machine
- system call
- machine monitor
- adapter
- interrupt
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45587—Isolation or security of virtual machine instances
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Storage Device Security (AREA)
Abstract
一种基于硬件虚拟化技术的应用程序安全保护方法,可以防御针对应用程序可用性的攻击。通过对转接器的内容与结构进行修改,使得该类方案的结构特征得以隐藏,不易被攻击者识别、发起针对性的可用性攻击。本发明可以消除保护机构在结构上的典型特征,从而避免针对应用程序的可用性攻击威胁。而且,修改过的转接器仅仅是内容与结构上的改变,对系统性能几乎没有影响。因此,本发明可以在不影响系统性能的条件下,减缓应用程序的可用性攻击威胁,提高系统可用性和应用程序的可用性与安全性。
Description
技术领域
本发明属于应用程序安全保护领域,具体涉及一种基于硬件虚拟化技术的应用程序安全保护方法,可实施对应用程序系统调用的安全验证,防御针对应用程序的可用性攻击。
背景技术
现有的基于硬件虚拟化技术的对系统调用进行验证的保护方案,可以保护应用程序的控制流完整性、地址空间完整性与私密性和系统调用的安全性等。但是由于存在结构上的缺陷,攻击者可以通过识别其中转接器的特征进而对应用程序发起针对性的可用性攻击,从而使得应用程序无法正常运行。针对被保护应用程序的可用性攻击是一种现实的威胁。
发明内容
本发明针对现有技术中的不足,提供一种基于硬件虚拟化技术的应用程序安全保护方法,能够有效地防止攻击者的针对应用程序的可用性攻击。
为实现上述目的,本发明采用以下技术方案:
一种基于硬件虚拟化技术的应用程序安全保护方法,涉及的组件包括虚拟机监控器、转接器、参数缓存和自定义库,其特征在于,包括以下步骤:
步骤一、虚拟机监控器初始化:在保护方法保护应用程序之前进行虚拟机监控器的初始化,包括配置VMCS、配置EPT页表、切换EPT;
步骤二、保护应用保护机构初始化:在应用程序成为保护应用之前进行的初始化,包括转接器与参数缓存地址空间分配、填充转接器内容、发起hypercall;
步骤三、系统调用的准备:对于保护应用请求的系统调用,在自定义库中进行系统调用的准备,包括系统调用参数准备、hypercall发起、系统调用结果返回保护应用;
步骤四、系统调用的验证:对于系统调用的请求,在虚拟机监控器中进行系统调用的安全验证,包括地址空间切换、rip通用寄存器赋值、将系统调用结果返回给自定义库;
步骤五、系统调用的实施:经系统调用验证后,转接器进行系统调用的实施,包括发起系统调用、发起hypercall将系统调用结果返回虚拟机监控器;
步骤六、中断事件的截获处理:在保护应用执行过程中发生的中断,由虚拟机监控器进行中断的截获和处理,包括中断截获、rip通用寄存器赋值、从中断返回到保护应用;
步骤七、中断返回的转接:经虚拟机监控器验证属于保护应用中发生的中断事件,由不可信内核的中断处理结束后,由转接器进行中断返回的处理,包括等待中断返回、发起hypercall陷入虚拟机监控器。
为优化上述技术方案,采取的具体措施还包括:
所述步骤一具体包括:
步骤11、配置VMCS的中断异常的自动转发的标志位,允许虚拟机监控器获得中断截获的能力;
步骤12、将VMCS中的Enable EPT位置为1,使得虚拟机监控器以及在其上运行的虚拟机使用EPT页表;
步骤13、创建两张EPT,分别放置在KVM中的KVM_MMU结构体的root_hpa和root_hpa_shadow中,保护方案复用了KVM中的创建EPT的函数,创建了两张EPT页表,其中root_hpa中存储指向不可信内核所在地址空间的EPTP,而root_hpa_shadow中存储指向保护应用所在地址空间的EPTP;
步骤14、选择当前EPT为root_hpa中的EPT,使得在虚拟机监控器和其中的虚拟机启动过程中,系统一直使用不可信地址空间的EPT,直到保护应用的开始执行;
步骤15、接收应用程序调用hypercall传递的转接器与参数缓存的地址,通过在VMexit时读取对应的通用寄存器接收到传递来的地址,虚拟机监控器将地址记录在变量tr与buf中;
步骤16、切换到root_hpa_shadow指向的EPT并返回保护应用,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并将root_hpa的值改为root_hpa_shadow来切换到可信地址空间EPT;
步骤17、结束hypercall处理返回虚拟机,通过在hypercall处理流程之后执行vcpu_run函数,保护应用可以开始在虚拟机的可信地址空间内执行;
步骤18、结束状态,虚拟机监控器的初始化完成。
所述步骤二具体包括:
步骤21、用mmap系统调用为转接器和参数缓存分配地址空间,其中,参数缓存的地址空间在与自定义库约定的固定位置分配,转接器通过在共享库地址空间内分配内存来隐藏其原本的地址空间特征;
步骤22、填写转接器中的中断返回操作程序,其中,首先填写将hypercall参数移动到rax寄存器的movq $2,%rax指令,之后填写VMCALL指令;
步骤23、填写转接器中的系统调用的实施操作程序,其中,首先是伪装的系统调用参数准备指令,其构成与glibc库中该系统调用指令前的参数准备指令相同,用以隐藏转接器的特征,之后填写系统调用指令,之后将系统调用结果保存到rbx通用寄存器的movq %rax,%rbx指令,之后填写movq $3,%rax和VMCALL指令;
步骤24、通过hypercall将转接器与参数缓存地址传递给虚拟机监控器,应用程序将转接器与参数缓存的地址放置在rbx通用寄存器与rcx通用寄存器中,之后主动调用hypercall将参数传递给虚拟机监控器;
步骤25为结束状态,应用程序可以开始保护应用的执行。
所述步骤三具体包括:
步骤31、判断当前系统调用的参数是否多于6个,如果多于6个则执行步骤32,否则执行步骤34;
步骤32、将对应通用寄存器中地址指向的多余参数结构体储存到约定好的参数缓存中;
步骤33、将参数缓存地址存储到之前存储多余参数结构体地址的通用寄存器,通过访问该通用寄存器,不可信内核可以从参数缓存中读取参数;
步骤34、主动调用hypercall陷入虚拟机监控器,将后续处理交给虚拟机监控器;
步骤35、将虚拟机监控器返回的结果返回给调用本API的保护应用,通过读取指定的通用寄存器,自定义库函数可以从虚拟机监控器获得系统调用的结果,并将结果返回给保护应用;
步骤36、结束状态,保护应用获得到了系统调用结果。
所述步骤四具体包括:
步骤41、用初始化时获得的转接器中的系统调用指令地址为VMCS中的rip通用寄存器对应变量赋值,转接器初始化时虚拟机监控器将转接器的地址存储到tr变量中,通过在tr变量上添加一个计算好的偏移量,得到转接器中系统调用指令的地址,通过将其赋给VMCS中的rip通用寄存器对应变量,使得进入虚拟机时会执行转接器中的这条指令;
步骤42、将EPT切换到不可信地址空间EPT,通过将KVM_MMU结构体中的root_hpa_second中的值还原到root_hpa,使得虚拟机使用不可信地址空间EPT;
步骤43、结束hypercall处理,返回虚拟机,通过在hypercall结束之后调用vcpu_run函数,虚拟机开始继续执行;
步骤44、接收到系统调用结果后切换EPT到可信地址空间EPT,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并使用root_hpa_shadow替换root_hpa中的值,虚拟机开始使用可信地址空间EPT;
步骤45、使用系统调用验证函数对系统调用结果进行验证;
步骤46、判断系统调用结果是否正确,如果正确则执行步骤47,否则执行步骤48;
步骤47、将正确结果返回自定义库,通过修改对应的通用寄存器来传递结果;
步骤48、将错误返回给自定义库,通过修改对应的通用寄存器来传递结果;
步骤49、结束状态,系统调用验证结束并将结果返回给自定义库。
所述步骤五具体包括:
步骤51、使用系统调用指令发起系统调用,通过执行之前转接器初始化时写入的系统调用指令,不可信内核开始执行系统调用服务例程;
步骤52、收到系统调用结果后调用hypercall,转接器通过调用hypercall,可以将系统调用结果返回给虚拟机监控器;
步骤53、结束状态,转接器发起系统调用并将返回结果传递给虚拟机监控器。
所述步骤六具体包括:
步骤61、中断产生VM exit,虚拟机监控器截获中断;
步骤62、将产生VM exit时的通用寄存器保存在KVM_MMU中的结构体中,通过读取VMCS中的通用寄存器对应变量并将其复制到结构体中,虚拟机监控器保存了保护应用中的敏感寄存器信息;
步骤63、清空VMCS中的通用寄存器对应变量的值,使得不可信内核无法获得保护应用中的敏感寄存器信息;
步骤64、将转接器的中断返回函数的首地址赋给VMCS中的rip通用寄存器对应变量;
步骤65、切换EPT到不可信地址空间EPT,通过从root_hpa_second中恢复值到root_hpa,虚拟机中开始使用不可信地址空间EPT;
步骤66、使用中断注入函数将截获的中断注入虚拟机,通过KVM本身提供的中断注入函数,虚拟机中的不可信内核将收到中断;
步骤67、中断返回时将保存在KVM_MMU中的通用寄存器写入VMCS对应位置,这样将之前保存的敏感寄存器信息再次还原到VMCS的通用寄存器对应变量中;
步骤68、将EPT切换为可信地址空间EPT,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并将root_hpa_shadow载入到root_hpa,虚拟机将使用可信地址空间EPT;
步骤69、结束hypercall处理,返回虚拟机,通过结束hypercall之后执行vcpu_run函数,虚拟机继续执行;
步骤6a、结束状态,保护应用中发生的中断被处理完毕并继续执行。
所述步骤七具体包括:
步骤71、截获不可信内核的中断返回,通过虚拟机监控器改写的VMCS中的rip通用寄存器对应变量,在不可信内核的中断结束后转接器继续执行;
步骤72、调用hypercall陷入虚拟机监控器,通过调用hypercall产生VM exit,使得虚拟机暂停执行,虚拟机监控器执行hypercall的处理程序;
步骤73、结束状态,转接器成功地截获了中断返回并通知了虚拟机监控器。
本发明的有益效果是:可以消除保护机构在结构上的典型特征,从而避免针对应用程序的可用性攻击威胁。而且,修改过的转接器仅仅是内容与结构上的改变,对系统性能几乎没有影响。因此,可以在不影响系统性能的条件下,减缓应用程序的可用性攻击威胁,提高系统可用性和应用程序的可用性与安全性。
附图说明
图1为应用程序保护方案结构示意图。
图2为虚拟机监控器初始化流程图。
图3为保护应用保护机构初始化流程图。
图4为系统调用的参数准备流程图。
图5为系统调用的验证流程图。
图6为系统调用的实施流程图。
图7为中断事件的截获处理流程图。
图8为中断返回的转接流程图。
具体实施方式
现在结合附图对本发明作进一步详细的说明。
如图1所示,本发明提出一种基于硬件虚拟化技术的应用程序安全保护方法,基于硬件虚拟化技术对系统调用进行安全验证,实施对应用程序的安全保护,可以防御针对应用程序的可用性攻击。采用以下技术方案:隐藏该类方案中转接器暴露给不可信内核的特征来防御针对性的可用性攻击的应用程序保护方案,组件包括虚拟机监控器、转接器、参数缓存、自定义共享库,主要操作包括虚拟机监控器初始化、保护应用保护机构初始化、系统调用的参数准备、系统调用的验证、系统调用的实施、中断事件的截获处理、中断返回的转接等七个关键操作。
一、虚拟机监控器初始化:在保护方案保护应用程序之前进行虚拟机监控器的初始化,其包括配置VMCS、配置EPT页表和切换EPT等。
二、保护应用保护机构初始化:在应用程序成为保护应用之前进行的初始化,其包括转接器与参数缓存地址空间分配、填充转接器内容和发起hypercall等。
三、系统调用的准备:对于保护应用请求的系统调用,在自定义库中进行系统调用的准备。其包括系统调用参数准备、hypercall发起和系统调用结果返回保护应用。
四、系统调用的验证:对于系统调用的请求,在虚拟机监控器中,进行系统调用的安全验证。其包括地址空间切换、rip通用寄存器赋值、将系统调用结果返回给自定义库等。
五、系统调用的实施:经系统调用验证后,转接器进行具体的系统调用的实施,其包括发起系统调用、发起hypercall将系统调用结果返回虚拟机监控器等。
六、中断事件的截获处理:在保护应用执行过程中发生的中断,由虚拟机监控器进行中断的截获和处理,其包括中断截获、rip通用寄存器赋值、从中断返回到保护应用等。
七、中断返回的转接:经虚拟机监控器验证属于保护应用中发生的中断事件,由不可信内核的中断处理结束后,由转接器进行中断返回的处理,其包括等待中断返回、发起hypercall陷入虚拟机监控器等。
虚拟机监控器用于实现保护方案的地址空间隔离和对应用程序的保护。虚拟机监控器通过硬件虚拟化提供的机制来提供两套EPT:可信地址空间EPT与不可信地址空间EPT,以实现保护方案中保护应用与不可信内核的地址空间隔离,保护保护应用和自定义库。虚拟机监控器同时包含系统调用操作和中断处理操作,虚拟机监控器通过硬件虚拟化技术的能力截获中断、其他组件通过虚拟机监控器提供的hypercall与虚拟机监控器进行交流,从而实现了对应用程序的保护。
转接器是在不可信地址空间EPT内的组件,其包含中断返回操作和系统调用操作的程序,作用是在防御针对性的可用性攻击的同时实现不可信内核的中断返回的截获和不可信内核的系统调用过程。参数缓存也是不可信地址空间EPT内的组件,其作用是存储系统调用参数。
自定义共享库是在可信地址空间EPT内的组件,其包含系统调用准备操作的程序,作用是将保护应用的系统调用请求转交虚拟机监控器处理。
系统启动时,需要进行保护方案的初始化,涉及到的组件是虚拟机监控器、保护应用、转接器与参数缓存。在虚拟机监控器的启动过程中,执行虚拟机监控器的初始化操作。通过配置VMCS使虚拟机监控器具有中断截获和地址空间隔离的能力。在虚拟机监控器的初始化操作的过程中,会执行保护应用保护机构初始化操作,以初始化处于不可信地址空间中的转接器和参数缓存。初始化后应用程序保护方案基本初始化完成,应用程序已经做好了以保护应用执行的准备。
保护方案工作时,可对运行中的保护应用实施保护,保证保护应用调用的系统调用安全执行。此外,当保护应用执行过程中发生中断时,虚拟机监控器可以截获并保证处于通用寄存器中的保护应用敏感信息不被不可信内核读取或篡改,它们分别由系统调用过程和中断处理过程来完成。
保护方案中的系统调用过程涉及到虚拟机监控器、保护应用、转接器、参数缓存、不可信内核和自定义库。在保护应用发起系统调用后,执行自定义库中的系统调用准备操作,自定义库进行系统调用相关的准备,将无法通过通用寄存器传递的系统调用参数传递到参数缓存中,并最后将系统调用的结果返回给保护应用。系统调用准备操作的过程中,会执行虚拟机监控器中的系统调用验证操作。虚拟机监控器将控制流传递给转接器,并对转接器返回的系统调用结果进行验证,最后将结果返回给自定义库。在系统调用验证操作的过程中,会执行转接器中的系统调用操作,转接器发起系统调用,并在系统调用结束后将结果返回给虚拟机监控器请求验证。系统调用过程结束后将验证后的系统调用结果返回给保护应用。
保护方案中的中断处理过程涉及到虚拟机监控器、保护应用、转接器和不可信内核。在保护应用工作过程中产生的中断会执行虚拟机监控器中的中断处理操作。虚拟机监控器截获在保护应用执行过程中发生的中断,对敏感的通用寄存器信息给予保护,将中断返回的控制流传递给转接器,最后将中断交给不可信内核处理并等待中断返回。虚拟机监控器的中断处理操作在途中会将中断请求发送给不可信内核。不可信内核在处理完中断请求后,会执行转接器的中断返回操作。转接器截获中断返回的控制流,并通过发起hypercall通知虚拟机监控器中断的结束,可以进行后来的寄存器恢复等操作。中断处理过程结束后保护应用继续正常执行。
图2为虚拟机监控器初始化流程图,该流程为保护方案初始化时由虚拟机监控器完成的操作,包括VMCS配置到最后的切换EPT返回保护应用执行。其作用是为整个保护方案进行运行前的初始化,为应用程序提供进一步初始化的环境。遵循该图的流程,可以完成虚拟机监控器初始化操作。
具体流程如下:步骤10为起始状态。步骤11为配置VMCS的中断异常的自动转发的标志位,这个配置允许虚拟机监控器获得了中断截获的能力,使得后续的对保护应用中发生的中断事件的截获操作成为可能。步骤12是将VMCS中的Enable EPT位置为1,这个配置使得虚拟机监控器以及在其上运行的虚拟机使用EPT页表。步骤13为创建两张EPT,分别放置在KVM中的KVM_MMU结构体的root_hpa和root_hpa_shadow中。保护方案复用了KVM中的创建EPT的函数,创建了两张EPT页表。其中root_hpa中存储指向不可信内核所在地址空间的EPTP,而root_hpa_shadow中存储指向保护应用所在地址空间的EPTP。步骤14为选择当前EPT为root_hpa中的EPT,因此在虚拟机监控器和其中的虚拟机启动过程中,系统一直使用不可信地址空间的EPT,直到保护应用的开始执行。步骤15为接收应用程序调用hypercall传递的转接器与参数缓存的地址,这是由保护应用保护机构初始化流程传递给本流程的,通过在VM exit时读取对应的通用寄存器接收到传递来的地址,虚拟机监控器将地址记录在变量tr与buf中。步骤16为切换到root_hpa_shadow指向的EPT并返回保护应用,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并将root_hpa的值改为root_hpa_shadow来切换到可信地址空间EPT。步骤17为结束hypercall处理返回虚拟机,通过在hypercall处理流程之后执行vcpu_run函数,保护应用可以开始在虚拟机的可信地址空间内执行。步骤18为结束状态至此本操作结束,虚拟机监控器的初始化完成。
图3为保护应用保护机构初始化流程图,该流程为保护方案初始化时由应用程序完成的操作,包括转接器与参数缓存的地址空间分配到发起hypercall等待虚拟机监控器返回。其作用是创建不可信地址空间内的转接器组件和参数缓存组件,并用可以防御针对性的可用性攻击的程序填充转接器。遵循该图的流程,可以完成保护应用保护机构初始化操作。
具体流程如下:步骤20为开始状态。步骤21为用mmap系统调用为转接器和参数缓存分配地址空间。其中,参数缓存的地址空间在与自定义库约定的固定位置分配。为了防御针对性的可用性攻击,转接器通过在共享库地址空间内分配内存来隐藏其原本的地址空间特征。步骤22为填写转接器中的中断返回操作程序。其中首先填写将hypercall参数移动到rax寄存器的movq $2,%rax指令,之后填写VMCALL指令。这段程序表明转接器会调用2号hypercall。步骤23为填写转接器中的系统调用的实施操作程序,其中首先是伪装的系统调用参数准备指令若干,其构成与glibc库中该系统调用指令前的参数准备指令相同,用以隐藏转接器的特征。之后填写系统调用指令(视情况可以选择int 0x80、sysenter和syscall指令)。之后将系统调用结果保存到rbx通用寄存器的movq %rax,%rbx指令,因为接下来的vmcall指令的参数必须放置在rax通用寄存器中,因此需要将系统调用结果转移到rbx通用寄存器中。之后与步骤22类似,填写movq $3,%rax和VMCALL指令,表明转接器会调用3号hypercall。步骤24为通过hypercall将转接器与参数缓存地址传递给虚拟机监控器,应用程序将转接器与参数缓存的地址放置在rbx通用寄存器与rcx通用寄存器中,之后主动调用hypercall将参数传递给虚拟机监控器。步骤25为结束状态,至此本操作结束,应用程序可以开始保护应用的执行。
图4为系统调用的参数准备流程图,该流程为系统调用过程中由自定义库完成的操作,包括系统调用参数的准备到最后的系统调用结果返回保护应用。其作用是对保护应用透明地将保护方案中原本不可信内核无法访问的系统调用参数放置到不可信内核可以访问的参数缓存中,从而兼容性地实现保护应用的系统调用API。遵循该图的流程,可以完成系统调用准备操作。
具体流程如下:步骤30为开始状态。步骤31判断当前系统调用的参数是否多于6个,如果多于6个则执行步骤32,否则执行步骤34。步骤32为将对应通用寄存器中地址指向的多余参数结构体储存到约定好的参数缓存中。步骤33为将参数缓存地址存储到之前存储多余参数结构体地址的通用寄存器,通过访问这个通用寄存器,不可信内核可以从参数缓存中读取参数。步骤34是主动调用hypercall陷入虚拟机监控器,将后续处理交给虚拟机监控器。步骤35为将虚拟机监控器返回的结果返回给调用本API的保护应用。通过读取指定的通用寄存器,自定义库函数可以从虚拟机监控器获得系统调用的结果,并将结果返回给保护应用。步骤36为结束状态,至此本操作结束,保护应用获得到了系统调用结果。
图5为系统调用的验证流程图,该流程为系统调用过程中由虚拟机监控器完成的操作,包括为VMCS中的rip通用寄存器对应变量赋值到最后的系统调用结果返回给自定义库。其作用是将系统调用的工作交给转接器执行,并验证系统调用的结果,保证恶意的系统调用结果不会攻击保护应用。遵循该图的流程,可以完成系统调用验证操作。
具体流程如下:步骤40为开始状态。步骤41为用初始化时获得的转接器中的系统调用指令地址为VMCS中的rip通用寄存器对应变量赋值。之前转接器初始化时虚拟机监控器将转接器的地址存储到了tr变量中,通过在tr变量上添加一个计算好的偏移量即可得到转接器中系统调用指令的地址。通过将其赋给VMCS中的rip通用寄存器对应变量,使得进入虚拟机时会执行转接器中的这条指令。步骤42是将EPT切换到不可信地址空间EPT。通过将KVM_MMU结构体中的root_hpa_second中的值还原到root_hpa,使得虚拟机使用不可信地址空间EPT。步骤43为结束hypercall处理,返回虚拟机。通过在hypercall结束之后调用vcpu_run函数,虚拟机开始继续执行。步骤44为接收到系统调用结果后切换EPT到可信地址空间EPT。通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并使用root_hpa_shadow替换root_hpa中的值,虚拟机开始使用可信地址空间EPT。步骤45为使用系统调用验证函数对系统调用结果进行验证。步骤46为判断系统调用结果是否正确,如果正确则执行步骤47,否则执行步骤48。步骤47为将正确结果返回自定义库,通过修改对应的通用寄存器来传递结果。步骤48为将错误返回给自定义库,通过修改对应的通用寄存器来传递结果。步骤49为结束状态,至此本操作结束,系统调用验证结束并将结果返回给自定义库。
图6为系统调用的实施流程图,该流程为系统调用过程中由转接器完成的操作,包括系统调用发起到最后的系统调用结果返回给虚拟机监控器。其作用是发起保护方案不允许保护应用直接调用的系统调用并请求虚拟机监控器验证结果,遵循该图的流程,可以完成系统调用操作。
具体流程如下:步骤50为开始状态。步骤51为使用系统调用指令发起系统调用。通过执行之前有转接器初始化时写入的系统调用指令,不可信内核开始执行系统调用服务例程。步骤52为收到系统调用结果后调用hypercall,转接器通过调用hypercall,可以将系统调用结果返回给虚拟机监控器。步骤53为结束状态,至此系统调用操作结束,转接器发起系统调用并将返回结果传递给虚拟机监控器。
图7为中断事件的截获流程图,该流程为中断处理过程中由虚拟机监控器完成的操作,包括截获中断到最后的中断返回到保护应用。在保护应用执行过程中可能会有不可信内核发起的恶意中断,旨在偷窥或者修改保护应用通用寄存器的信息。本流程的作用是截获在保护应用执行过程中发生的所有中断,对寄存器进行保护并使不可信内核认为中断发生在转接器的执行过程中。遵循该图的流程,可以完成中断处理操作。
具体流程如下:步骤60为开始状态。步骤61为中断产生VM exit,虚拟机监控器截获中断。由于初始化时关闭了中断异常的自动向量转发,虚拟机监控器在检查VM exit原因后截获到了保护应用中发生的中断。步骤62为将产生VM exit时的通用寄存器保存在KVM_MMU中的结构体中。通过读取VMCS中的通用寄存器对应变量并将其复制到结构体中,虚拟机监控器保存了保护应用中的敏感寄存器信息。步骤63为清空VMCS中的通用寄存器对应变量的值,这样不可信内核无法获得保护应用中的敏感寄存器信息。步骤64为将转接器的中断返回函数的首地址赋给VMCS中的rip通用寄存器对应变量。步骤65为切换EPT到不可信地址空间EPT,通过从root_hpa_second中恢复值到root_hpa,虚拟机中开始使用不可信地址空间EPT。步骤66为使用中断注入函数将截获的中断注入虚拟机。通过KVM本身提供的中断注入函数,虚拟机中的不可信内核将收到中断。步骤67为中断返回时将保存在KVM_MMU中的通用寄存器写入VMCS对应位置,这样将之前保存的敏感寄存器信息再次还原到VMCS的通用寄存器对应变量中。步骤68为将EPT切换为可信地址空间EPT。通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并将root_hpa_shadow载入到root_hpa,虚拟机将使用可信地址空间EPT。步骤69为结束hypercall处理,返回虚拟机。通过结束hypercall之后执行vcpu_run函数,虚拟机继续执行。步骤6a为结束状态,至此本操作结束,保护应用中发生的中断被处理完毕并继续执行。
图8为中断返回的转接流程图,该流程为中断处理过程中由转接器完成的操作,包括中断返回截获到最后的中断返回给虚拟机监控器。其作用是伪装成中断发生时的执行程序,并在之后的中断返回时通知虚拟机监控器恢复保护应用的执行环境。遵循该图的流程,可以完成中断返回操作。
具体流程如下:步骤70为开始状态。步骤71为截获不可信内核的中断返回。通过虚拟机监控器之前改写的VMCS中的rip通用寄存器对应变量,在不可信内核的中断结束后转接器继续执行。步骤72为调用hypercall陷入虚拟机监控器。通过调用hypercall产生VMexit,使得虚拟机暂停执行,虚拟机监控器执行hypercall的处理程序。步骤73为结束状态,至此本操作结束,转接器成功地截获了中断返回并通知了虚拟机监控器。
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (8)
1.一种基于硬件虚拟化技术的应用程序安全保护方法,涉及的组件包括虚拟机监控器、转接器、参数缓存和自定义库,其特征在于,包括以下步骤:
步骤一、虚拟机监控器初始化:在保护方法保护应用程序之前进行虚拟机监控器的初始化,包括配置VMCS、配置EPT页表、切换EPT;
步骤二、保护应用保护机构初始化:在应用程序成为保护应用之前进行的初始化,包括转接器与参数缓存地址空间分配、填充转接器内容、发起hypercall;
步骤三、系统调用的准备:对于保护应用请求的系统调用,在自定义库中进行系统调用的准备,包括系统调用参数准备、hypercall发起、系统调用结果返回保护应用;
步骤四、系统调用的验证:对于系统调用的请求,在虚拟机监控器中进行系统调用的安全验证,包括地址空间切换、rip通用寄存器赋值、将系统调用结果返回给自定义库;
步骤五、系统调用的实施:经系统调用验证后,转接器进行系统调用的实施,包括发起系统调用、发起hypercall将系统调用结果返回虚拟机监控器;
步骤六、中断事件的截获处理:在保护应用执行过程中发生的中断,由虚拟机监控器进行中断的截获和处理,包括中断截获、rip通用寄存器赋值、从中断返回到保护应用;
步骤七、中断返回的转接:经虚拟机监控器验证属于保护应用中发生的中断事件,由不可信内核的中断处理结束后,由转接器进行中断返回的处理,包括等待中断返回、发起hypercall陷入虚拟机监控器。
2.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤一具体包括:
步骤11、配置VMCS的中断异常的自动转发的标志位,允许虚拟机监控器获得中断截获的能力;
步骤12、将VMCS中的Enable EPT位置为1,使得虚拟机监控器以及在其上运行的虚拟机使用EPT页表;
步骤13、创建两张EPT,分别放置在KVM中的KVM_MMU结构体的root_hpa和root_hpa_shadow中,保护方案复用了KVM中的创建EPT的函数,创建了两张EPT页表,其中root_hpa中存储指向不可信内核所在地址空间的EPTP,而root_hpa_shadow中存储指向保护应用所在地址空间的EPTP;
步骤14、选择当前EPT为root_hpa中的EPT,使得在虚拟机监控器和其中的虚拟机启动过程中,系统一直使用不可信地址空间的EPT,直到保护应用的开始执行;
步骤15、接收应用程序调用hypercall传递的转接器与参数缓存的地址,通过在VMexit时读取对应的通用寄存器接收到传递来的地址,虚拟机监控器将地址记录在变量tr与buf中;
步骤16、切换到root_hpa_shadow指向的EPT并返回保护应用,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并将root_hpa的值改为root_hpa_shadow来切换到可信地址空间EPT;
步骤17、结束hypercall处理返回虚拟机,通过在hypercall处理流程之后执行vcpu_run函数,保护应用开始在虚拟机的可信地址空间内执行;
步骤18、结束状态,虚拟机监控器的初始化完成。
3.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤二具体包括:
步骤21、用mmap系统调用为转接器和参数缓存分配地址空间,其中,参数缓存的地址空间在与自定义库约定的固定位置分配,转接器通过在共享库地址空间内分配内存来隐藏其原本的地址空间特征;
步骤22、填写转接器中的中断返回操作程序,其中,首先填写将hypercall参数移动到rax寄存器的movq $2,%rax指令,之后填写VMCALL指令;
步骤23、填写转接器中的系统调用的实施操作程序,其中,首先是伪装的系统调用参数准备指令,其构成与glibc库中系统调用指令前的参数准备指令相同,用以隐藏转接器的特征,之后填写系统调用指令,之后填写将系统调用结果保存到rbx通用寄存器的movq %rax,%rbx指令,之后填写movq $3,%rax和VMCALL指令;
步骤24、通过hypercall将转接器与参数缓存地址传递给虚拟机监控器,应用程序将转接器与参数缓存的地址放置在rbx通用寄存器与rcx通用寄存器中,之后主动调用hypercall将参数传递给虚拟机监控器;
步骤25、结束状态,应用程序开始保护应用的执行。
4.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤三具体包括:
步骤31、判断当前系统调用的参数是否多于6个,如果多于6个则执行步骤32,否则执行步骤34;
步骤32、将对应通用寄存器中地址指向的多余参数结构体储存到约定好的参数缓存中;
步骤33、将参数缓存地址存储到之前存储多余参数结构体地址的通用寄存器,通过访问该通用寄存器,不可信内核从参数缓存中读取参数;
步骤34、主动调用hypercall陷入虚拟机监控器,将后续处理交给虚拟机监控器;
步骤35、将虚拟机监控器返回的结果返回给调用本API的保护应用,通过读取指定的通用寄存器,自定义库函数从虚拟机监控器获得系统调用的结果,并将结果返回给保护应用;
步骤36、结束状态,保护应用获得到了系统调用结果。
5.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤四具体包括:
步骤41、用初始化时获得的转接器中的系统调用指令地址为VMCS中的rip通用寄存器对应变量赋值,转接器初始化时虚拟机监控器将转接器的地址存储到tr变量中,通过在tr变量上添加一个计算好的偏移量,得到转接器中系统调用指令的地址,通过将其赋给VMCS中的rip通用寄存器对应变量,使得进入虚拟机时会执行转接器中的这条指令;
步骤42、将EPT切换到不可信地址空间EPT,通过将KVM_MMU结构体中的root_hpa_second中的值还原到root_hpa,使得虚拟机使用不可信地址空间EPT;
步骤43、结束hypercall处理,返回虚拟机,通过在hypercall结束之后调用vcpu_run函数,虚拟机开始继续执行;
步骤44、接收到系统调用结果后切换EPT到可信地址空间EPT,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并使用root_hpa_shadow替换root_hpa中的值,虚拟机开始使用可信地址空间EPT;
步骤45、使用系统调用验证函数对系统调用结果进行验证;
步骤46、判断系统调用结果是否正确,如果正确则执行步骤47,否则执行步骤48;
步骤47、将正确结果返回自定义库,通过修改对应的通用寄存器来传递结果;
步骤48、将错误返回给自定义库,通过修改对应的通用寄存器来传递结果;
步骤49、结束状态,系统调用验证结束并将结果返回给自定义库。
6.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤五具体包括:
步骤51、使用系统调用指令发起系统调用,通过执行之前转接器初始化时写入的系统调用指令,不可信内核开始执行系统调用服务例程;
步骤52、收到系统调用结果后调用hypercall,转接器通过调用hypercall,将系统调用结果返回给虚拟机监控器;
步骤53、结束状态,转接器发起系统调用并将返回结果传递给虚拟机监控器。
7.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤六具体包括:
步骤61、中断产生VM exit,虚拟机监控器截获中断;
步骤62、将产生VM exit时的通用寄存器保存在KVM_MMU中的结构体中,通过读取VMCS中的通用寄存器对应变量并将其复制到结构体中,虚拟机监控器保存了保护应用中的敏感寄存器信息;
步骤63、清空VMCS中的通用寄存器对应变量的值,使得不可信内核无法获得保护应用中的敏感寄存器信息;
步骤64、将转接器的中断返回函数的首地址赋给VMCS中的rip通用寄存器对应变量;
步骤65、切换EPT到不可信地址空间EPT,通过从root_hpa_second中恢复值到root_hpa,虚拟机中开始使用不可信地址空间EPT;
步骤66、使用中断注入函数将截获的中断注入虚拟机,通过KVM本身提供的中断注入函数,虚拟机中的不可信内核将收到中断;
步骤67、中断返回时将保存在KVM_MMU中的通用寄存器写入VMCS对应位置,这样将之前保存的敏感寄存器信息再次还原到VMCS的通用寄存器对应变量中;
步骤68、将EPT切换为可信地址空间EPT,通过将KVM_MMU结构体中的root_hpa备份到root_hpa_second并将root_hpa_shadow载入到root_hpa,虚拟机将使用可信地址空间EPT;
步骤69、结束hypercall处理,返回虚拟机,通过结束hypercall之后执行vcpu_run函数,虚拟机继续执行;
步骤6a、结束状态,保护应用中发生的中断被处理完毕并继续执行。
8.如权利要求1所述的一种基于硬件虚拟化技术的应用程序安全保护方法,其特征在于:所述步骤七具体包括:
步骤71、截获不可信内核的中断返回,通过虚拟机监控器改写的VMCS中的rip通用寄存器对应变量,在不可信内核的中断结束后转接器继续执行;
步骤72、调用hypercall陷入虚拟机监控器,通过调用hypercall产生VM exit,使得虚拟机暂停执行,虚拟机监控器执行hypercall的处理程序;
步骤73、结束状态,转接器成功地截获了中断返回并通知了虚拟机监控器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810384703.7A CN108874500B (zh) | 2018-04-26 | 2018-04-26 | 一种基于硬件虚拟化技术的应用程序安全保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810384703.7A CN108874500B (zh) | 2018-04-26 | 2018-04-26 | 一种基于硬件虚拟化技术的应用程序安全保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108874500A CN108874500A (zh) | 2018-11-23 |
CN108874500B true CN108874500B (zh) | 2022-10-18 |
Family
ID=64326811
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810384703.7A Active CN108874500B (zh) | 2018-04-26 | 2018-04-26 | 一种基于硬件虚拟化技术的应用程序安全保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108874500B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110096871B (zh) * | 2019-05-10 | 2021-03-19 | 南京大学 | 一种基于硬件虚拟化的多核环境进程内核栈保护方法 |
US11003785B2 (en) | 2019-07-16 | 2021-05-11 | Advanced New Technologies Co., Ltd. | Data transmission method and apparatus in tee systems |
CN110427274B (zh) * | 2019-07-16 | 2020-07-17 | 阿里巴巴集团控股有限公司 | Tee系统中的数据传输方法和装置 |
CN110716791B (zh) * | 2019-09-25 | 2023-01-20 | 北京直客通科技有限公司 | 一种实时虚拟化系统及其执行方法 |
CN110851239B (zh) * | 2019-11-15 | 2023-07-04 | 湖南智领通信科技有限公司 | 一种type-i型硬实时高可靠性全虚拟化方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070074208A1 (en) * | 2005-09-29 | 2007-03-29 | Xiaofeng Ling | Apparatus and method for expedited virtual machine (VM) launch in VM cluster environment |
CN101727351A (zh) * | 2009-12-14 | 2010-06-09 | 北京航空航天大学 | 面向多核平台的虚拟机监控器非对称调度器及其调度方法 |
CN102262557A (zh) * | 2010-05-25 | 2011-11-30 | 运软网络科技(上海)有限公司 | 通过总线架构构建虚拟机监控器的方法及性能服务框架 |
US20160239339A1 (en) * | 2007-10-30 | 2016-08-18 | Vmware, Inc. | Secure identification of execution contexts |
-
2018
- 2018-04-26 CN CN201810384703.7A patent/CN108874500B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070074208A1 (en) * | 2005-09-29 | 2007-03-29 | Xiaofeng Ling | Apparatus and method for expedited virtual machine (VM) launch in VM cluster environment |
US20160239339A1 (en) * | 2007-10-30 | 2016-08-18 | Vmware, Inc. | Secure identification of execution contexts |
CN101727351A (zh) * | 2009-12-14 | 2010-06-09 | 北京航空航天大学 | 面向多核平台的虚拟机监控器非对称调度器及其调度方法 |
CN102262557A (zh) * | 2010-05-25 | 2011-11-30 | 运软网络科技(上海)有限公司 | 通过总线架构构建虚拟机监控器的方法及性能服务框架 |
Non-Patent Citations (2)
Title |
---|
Virtualization I/O optimization based on shared memory;Fengfeng Ning等;《2013 IEEE International Conference on Big Data》;20131223;第70-77页 * |
一种基于虚拟机的安全监测方法;丁顺等;《计算机应用与软件》;20120615;第29卷(第6期);第51-56页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108874500A (zh) | 2018-11-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108874500B (zh) | 一种基于硬件虚拟化技术的应用程序安全保护方法 | |
US11467982B2 (en) | Virtualization-based platform protection technology | |
US11321452B2 (en) | Execution environment virtualization method and apparatus and virtual execution environment access method and apparatus | |
Park et al. | libmpk: Software abstraction for intel memory protection keys (intel {MPK}) | |
US20210124824A1 (en) | Securing secret data embedded in code against compromised interrupt and exception handlers | |
CN110119302B (zh) | 虚拟机监视器以及虚拟可信执行环境构建方法 | |
Barresi et al. | {CAIN}: Silently breaking {ASLR} in the cloud | |
US10204220B1 (en) | Thin hypervisor for native execution of unsafe code | |
CN109923546B (zh) | 虚拟机安全性应用程序的事件过滤 | |
US11061710B2 (en) | Virtual machine exit support by a virtual machine function | |
CN109947666B (zh) | 可信执行环境缓存隔离方法及装置、电子设备和存储介质 | |
US20080201540A1 (en) | Preservation of integrity of data across a storage hierarchy | |
US20080052709A1 (en) | Method and system for protecting hard disk data in virtual context | |
CA2517442A1 (en) | Customized execution environment and operating system capable of supporting same | |
CN106970823B (zh) | 高效的基于嵌套虚拟化的虚拟机安全保护方法及系统 | |
Oliverio et al. | Secure Page Fusion with VUsion: https://www. vusec. net/projects/VUsion | |
US10754943B2 (en) | Virtual machine kernel protection method and apparatus | |
CN110874468A (zh) | 应用程序安全保护方法以及相关设备 | |
CN108920253B (zh) | 一种无代理的虚拟机监控系统和监控方法 | |
CN103996003A (zh) | 一种虚拟化环境中的数据擦除系统及方法 | |
Kwon et al. | ZeroKernel: Secure context-isolated execution on commodity GPUs | |
CN108052415B (zh) | 一种恶意软件检测平台快速恢复方法及系统 | |
Park et al. | Libmpk: software abstraction for Intel memory protection keys | |
US9916262B2 (en) | Least privileged operating system | |
Enomoto et al. | FlushBlocker: Lightweight mitigating mechanism for CPU cache flush instruction based attacks |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |