CN110096871A - 一种基于硬件虚拟化的多核环境进程内核栈保护方法 - Google Patents
一种基于硬件虚拟化的多核环境进程内核栈保护方法 Download PDFInfo
- Publication number
- CN110096871A CN110096871A CN201910391660.XA CN201910391660A CN110096871A CN 110096871 A CN110096871 A CN 110096871A CN 201910391660 A CN201910391660 A CN 201910391660A CN 110096871 A CN110096871 A CN 110096871A
- Authority
- CN
- China
- Prior art keywords
- ept
- stack
- kernel stack
- kernel
- pid
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 220
- 230000008569 process Effects 0.000 title claims abstract description 197
- 230000007246 mechanism Effects 0.000 claims abstract description 6
- 230000006870 function Effects 0.000 claims description 50
- 238000012545 processing Methods 0.000 claims description 41
- 238000001514 detection method Methods 0.000 claims description 9
- 238000013519 translation Methods 0.000 claims description 8
- 238000003780 insertion Methods 0.000 claims description 5
- 230000037431 insertion Effects 0.000 claims description 5
- 238000006243 chemical reaction Methods 0.000 claims description 3
- 238000012423 maintenance Methods 0.000 claims description 3
- 230000001681 protective effect Effects 0.000 abstract description 2
- 230000035945 sensitivity Effects 0.000 abstract description 2
- 230000009471 action Effects 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 125000003367 polycyclic group Chemical group 0.000 description 1
- 238000004886 process control Methods 0.000 description 1
Classifications
-
- 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
- G06F21/53—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 by executing in a restricted environment, e.g. sandbox or secure virtual machine
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
- Computer And Data Communications (AREA)
Abstract
一种基于硬件虚拟化的多核环境进程内核栈保护方法,将保护系统嵌入到虚拟机管理器Hypervisor中,对客户机中的进程内核栈提供完整性保护。本方法在多核环境中,对任意进程的内核栈区域整体提供实时的完整性保护。本方法的保护对象不再局限于部分安全敏感的数据,而是保护进程内核栈上的所有数据内容,包括内核栈上的控制数据和非控制数据;保护方法适用于多核环境,单核环境下也是有效的。本方法不仅可防御来自于进程本地处理器的恶意攻击,而且可以防御来自其它处理器的恶意攻击,防御能力更加全面。此外,本方法的保护机制是连续和实时的,不存在保护间隙,可有效增强系统的安全性。
Description
技术领域
本发明属于进程内核栈完整性保护的技术领域,尤其涉及一种基于硬件虚拟化的多核环境进程内核栈保护方法。
背景技术
进程内核栈是操作系统管理进程、保证其正常运行的重要数据内容之一。在进程间切换以及用户态到内核态的特权级切换时,进程内核栈具有保存和恢复进程上下文状态的重要作用。在理论上,进程间的内核栈应该相互隔离。然而,在Linux等操作系统的实现中,各个进程的内核栈区域间并非互相隔离。因此,就为诸如Return-to-user(返回至用户代码)和Return-to-schedule(返回至调度函数)等攻击提供了条件,这些攻击对进程的正常执行以及系统安全构成了安全威胁。在多核环境中,多个进程可以同时运行,攻击者可以对系统中正在运行的进程发起攻击,使得内核栈完整性保护问题变得更加复杂。硬件辅助虚拟化技术具有管理和监控客户机的能力,常被应用于安全保护工作中。因此,基于硬件虚拟化技术,本发明提出多核环境的进程内核栈保护方案。
发明内容
本发明针对现有技术中的不足,提供一种基于硬件虚拟化的多核环境进程内核栈保护方法。
为实现上述目的,本发明采用以下技术方案:
一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于,将保护系统嵌入到虚拟机管理器Hypervisor中,从而实现对客户机中的进程内核栈的完整性保护;
保护系统中包括内核栈信息库stack_list和基于内核虚拟机KVM;内核栈信息库stack_list存储保护系统全局的数据内容以及客户机中各进程内核栈的信息,包括内核栈基址的客户机物理地址及对应的进程编号pid;KVM是Linux内核中提供虚拟化功能的组件,通过创建并调度多个虚拟CPU即vCPU以提供客户机多核环境的能力,KVM创建和维护扩展页表EPT,以支持实现客户机物理地址的自动地址翻译,EPT是Intel支持内存虚拟化的硬件结构,完成客户机物理地址到实际物理地址的转换;
保护系统的关键操作包括:
1)保护系统初始化:保护系统的初始化操作,包括建立内核栈信息库,以及为每个虚拟CPU分别建立EPT结构;
2)进程创建截获:截获客户机中进程创建事件,将新创建进程的编号及内核栈物理地址传递给保护系统处理;
3)进程切换截获:截获客户机中进程切换事件,将切换出和切换入处理器的进程的编号传递给保护系统处理;
4)进程退出截获:截获客户机中进程退出事件,将退出进程的编号传递给保护系统处理;
5)进程创建处理:保护系统为新创建的内核栈分配物理页框,然后在各个EPT上为其建立地址翻译信息并设置只读权限;
6)进程切换处理:保护系统在EPT结构上设置切换入处理器进程的内核栈的访问权限为可写,切换出的为只读;
7)进程退出处理:保护系统在各个EPT上设置退出进程内核栈的访问权限为只读;
8)攻击行为检测:保护系统根据产生EPT缺页中断的原因,判断是否发生了攻击形式,如果是,则以报警的形式提醒用户。
为优化上述技术方案,采取的具体措施还包括:
进一步地,保护系统初始化操作包括如下步骤:
步骤21:在KVM启动时,设置ept使能变量ept_enable为1,以开启EPT机制,保证保护系统可以正常运行;
步骤22:初始化内核栈信息库;
步骤23:初始化计数器n的值为0;
步骤24:判断当前计数器的值是否小于客户机配置vCPU的个数N,如果是转步骤25,否则转步骤27,结束保护系统初始化操作;
步骤25:为第n个vCPU创建对应的EPT结构的根目录;
步骤26:将计数器n增加1,之后转步骤24再次判断;
步骤27:结束动作。
进一步地,进程创建截获操作是在客户机内核do_fork()函数中,插入对客户机进程创建事件的截获操作,包括如下步骤:
步骤31:获取新创建进程编号pid;
步骤32:获取新创建进程内核栈的客户机物理地址guest_phys;
步骤33:调用Hypercall()函数,中断客户机的执行,将控制流陷入到KVM中进行处理;
步骤34:结束动作。
进一步地,进程切换截获操作是在客户机内核_switch_to_asm代码段中,插入客户机进程切换事件的截获操作,包括如下步骤:
步骤41:根据为_switch_to_asm传入的指向切换入处理器运行进程的task_struct结构体地址的eax寄存器的值,使用task_struct结构体中pid字段距离task_struct结构体起始字节的偏移量获取切换入处理器运行进程的编号prev_pid;
步骤42:采用步骤41的方式,获取切换出处理器进程的编号next_pid;
步骤43:调用Hypercall()函数,将prev_pid和next_pid参数传递给保护系统进行处理;
步骤44:结束动作。
进一步地,进程退出截获操作包括如下步骤:
步骤51:从描述退出进程的task_struct结构体中获取退出进程的编号pid;
步骤52:调用Hypercall()函数,将pid参数传递给保护系统进行处理;
步骤53:结束动作。
进一步地,进程创建处理操作是在截获客户机进程创建事件后,控制流陷入到KVM中进行处理,以此流程完成对客户机进程创建事件的处理,包括如下步骤:
步骤61:初始化一个内核栈信息节点stack_node;
步骤62:将新生成的stack_node节点插入到内核栈信息库stack_list中;
步骤63:为内核栈主动申请物理页框;
步骤64:初始化计数器n的值为0;
步骤65:判断当前计数器的值是否小于客户机配置vCPU的个数N,如果是转步骤66,否则转步骤6a,结束处理进程创建事件的操作;
步骤66:在第n个vCPU对应的EPT结构即EPT_n上设置对内核栈的地址翻译信息,即EPT表项;
步骤67:在EPT_n上检索到步骤66设置的EPT表项,然后在此EPT表项上增加只读的访问权限信息;
步骤68:对第n个EPT结构的TLB进行刷新;
步骤69:将计数器n增加1,之后转步骤65再次判断;
步骤6a:结束动作。
进一步地,进程切换处理操作是在截获客户机进程切换事件后,控制流陷入到KVM中进行处理,以此流程完成对客户机进程切换事件的处理,包括如下步骤:
步骤71:获取发生进程切换的vCPU的编号x;
步骤72:根据切换出处理器运行进程的编号prev_pid在内核栈信息库stack_list中查找得到prev_pid对应的prev_node节点;
步骤73:从prev_node节点中获取切换出处理器进程的内核栈物理地址prev_phys;
步骤74:以prev_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_x结构,检索到prev_phys对应的EPT表项,并在此表项上进行只读权限的设置;
步骤75:根据切换入处理器运行进程的编号next_pid在stack_list中查找得到next_pid对应的next_node节点;
步骤76:从next_node节点中获取切换入处理器进程的内核栈物理地址next_phys;
步骤77:以next_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_x结构,检索到next_phys对应的EPT表项,并在此表项上进行可写权限的设置;
步骤78:以prev_phys和next_phys为参数调用kvm_flush_remote_tlbs_with_address()函数对EPT_x TLB进行选择性刷新;
步骤79:结束动作。
进一步地,进程退出处理操作是在截获客户机进程退出事件后,控制流陷入到KVM中进行处理,以此流程完成对客户机进程退出事件的处理,具体包括如下步骤:
步骤81:根据退出进程的编号pid在stack_list中查找pid对应的stack_node节点;
步骤82:从stack_node节点中获取退出进程内核栈的物理地址guest_phys;
步骤83:初始化计数器n的值为0;
步骤84:判断当前计数器的值是否小于客户机配置vCPU的个数N,如果是转步骤85,否则转步骤88结束处理进程退出事件的操作;
步骤85:以guest_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_n结构,检索到guest_phys对应的EPT表项,并在此表项上进行可写权限的设置;
步骤86:以guest_phys为参数调用kvm_flush_remote_tlbs_with_address()函数对EPT_n TLB进行选择性刷新;
步骤87:将计数器n增加1,之后转步骤84再次判断;
步骤88:结束动作。
进一步地,攻击行为检测操作包括如下步骤:
步骤91:定位到KVM进行EPT缺页中断的处理函数tdp_page_fault()中,tdp_page_fault()函数将根据引起EPT缺页的具体原因,针对性地进行处理;
步骤92:判断引起EPT缺页中断的原因是否是因为写权限不足,如果是转步骤93,否则转步骤95由tdp_page_fault()函数处理;
步骤93:使用引起缺页的客户机物理地址遍历stack_list,判断引起EPT缺页中断的地址是否属于某stack_node所描述的内核栈范围内,如果是转步骤94,否则转步骤95;
步骤94:根据以上检测,确定此处EPT缺页中断是由于攻击行为发生所引起,即保护系统检测到了攻击行为的发生,以报警的形式提醒用户;
步骤95:tdp_page_fault()根据具体EPT缺页原因正常处理;
步骤96:结束动作。
本发明的有益效果是:本发明在多核环境中,对任意进程的内核栈区域整体提供实时的完整性保护。本发明的保护对象不再局限于部分安全敏感的数据,而是保护进程内核栈上的所有数据内容,包括内核栈上的控制数据和非控制数据;保护方法适用于多核环境,单核环境下也是有效的。本发明不仅可防御来自于进程本地处理器的恶意攻击,而且可以防御来自其它处理器的恶意攻击,防御能力更加全面。此外,本发明的保护机制是连续和实时的,不存在保护间隙,可有效增强系统的安全性。
附图说明
附图1是保护系统总体结构示意图。
附图2是保护系统初始化操作流程图。
附图3是进程创建截获操作流程图。
附图4是进程切换截获操作流程图。
附图5是进程退出截获操作流程图。
附图6是进程创建处理操作流程图。
附图7是进程切换处理操作流程图。
附图8是进程退出处理操作流程图。
附图9是攻击行为检测操作流程图。
具体实施方式
现在结合附图对本发明作进一步详细的说明。
附图1是保护系统总体结构示意图。如图1所示,内核栈信息库stack_list存储保护系统全局的数据内容,存储客户机中各进程内核栈的信息,包括内核栈基址的客户机物理地址及对应的进程编号pid。KVM(基于内核虚拟机)是Linux内核中提供虚拟化功能的组件,通过创建并调度多个vCPU(虚拟CPU)以提供客户机多核环境的能力。扩展页表EPT是Intel支持内存虚拟化的硬件结构,完成客户机物理地址到实际物理地址的转换。KVM创建和维护EPT页表,以支持实现客户机物理地址的自动地址翻译。
保护系统的关键操作主要有:(1)保护系统初始化;(2)客户机特定事件截获,包括对客户机进程创建、切换和退出事件的截获;(3)客户机特定事件处理,包括对客户机进程创建、切换和退出事件的处理;(4)攻击行为检测。
在客户机启动时,位于KVM中的保护系统将完成初始化操作,主要包括初始化内核栈信息库stack_list、为客户机各vCPU分别建立独立EPT结构等步骤。
客户机启动之后正常运行,当发生特定事件时会被保护系统使用Hypercall(超级调用)机制所截获,获取到一定的参数后陷入到KVM中进行处理,需要截获的客户机特定事件分别是进程创建、进程切换、进程退出。
成功截获客户机特定事件陷入到KVM后,保护系统将对截获到的各种客户机事件使用不同策略分别进行处理。截获到客户机进程创建时,需要为新创建的内核栈分配页框,在各个EPT上对新创建进程内核栈设置只读的访问权限,刷新EPT TLB(EPT快表)等步骤;截获到客户机进程切换时,在发生切换的vCPU所对应的EPT上,对换入进程内核栈设置可写的访问权限,对换出进程内核栈设置只读的访问权限,并刷新EPT TLB;截获到客户机进程退出时,在各个EPT上对退出进程内核栈设置可写的访问权限,并刷新EPT TLB。保护系统将各种事件处理完毕后,将执行流返回到客户机,使得客户机继续正常运行。
当客户机发生EPT缺页中断时,保护系统的攻击检测操作将会在KVM的EPT缺页中断处理函数tdp_page_fault()进行检测,根据引起缺页的地址及访问权限,判断是否发生了攻击,如果是则产生报警信息。各个操作更加具体的步骤描述如下文所示。
附图2是保护系统初始化操作流程图。此流程可以完成保护系统的初始化操作,共包括8个步骤。步骤20是起始动作。步骤21在KVM启动时,设置ept使能变量ept_enable为1,以开启EPT机制,保证保护系统可以正常运行。步骤22初始化内核栈信息库。内核栈信息库是链表头struct list_head类型的链表stack_list,stack_list记录所有客户机进程内核栈信息,链表中的节点为内核栈信息节点stack_node,节点主要的信息包括进程编号pid和进程内核栈基址的客户机物理地址guest_phys。保护系统调用Linux的INIT_LIST_HEAD_RCU()函数对stack_list链表进行初始化,该函数的功能是初始化一个链表,传入的参数定义的struct list_head*list类型的变量,保护系统为此函数传入的参数为&stack_list。步骤23初始化计数器n的值为0。步骤24判断当前计数器的值是否小于客户机配置vCPU的个数N。如果是转步骤25,否则转步骤27,结束保护系统初始化操作。步骤25为第n个vCPU创建对应的EPT结构的根目录。每个vCPU建立独立的EPT结构,为此,将一维的页表项哈希表mmu_page_hash[]数组修改为二维数组mmu_page_hash[N][],使得各vCPU在初始化时,都可以申请到唯一的EPT根页表页。步骤26将计数器n增加1,之后转步骤24再次判断。步骤27是结束动作。
附图3是进程创建截获操作流程图。此流程可以完成对客户机进程创建事件的截获,在客户机内核do_fork()函数中,插入对客户机进程创建事件的截获操作。共5个步骤。步骤30是起始动作。步骤31获取新创建进程编号pid。步骤32获取新创建进程内核栈的客户机物理地址guest_phys。保护系统从新创建进程的进程控制块task_struct结构中得到内核栈基址的虚拟地址stack,然后调用virt_to_phys宏得到此虚拟地址所对应的guest_phys。Virt_to_phys是Linux内核提供的对于内核直接映区域的虚拟地址得到其物理地址的宏,输入参数为虚拟地址virt,输出为对应的物理地址phys,保护系统为此宏传入的参数为stack,得到的输出为guest_phys。步骤33调用Hypercall()函数,中断客户机的执行,将控制流陷入到KVM中进行处理。Hypercall()是KVM进行超级调用的函数,使用此函数可以使得客户机主动暂停自身的运行并传入参数到Hypervisor中进行处理,输入的参数为要传递给Hypervisor的参数,保护系统传入的参数为pid和guest_phys。步骤34是结束动作。
附图4是进程切换截获操作流程图。此流程可以完成对客户机进程切换事件的截获,在客户机内核_switch_to_asm代码段中,插入客户机进程切换事件的截获操作。共5个步骤。步骤40是起始动作。步骤41根据为_switch_to_asm传入的指向切换入处理器运行进程的task_struct结构体地址的eax寄存器的值,使用task_struct结构体中pid字段距离task_struct结构体起始字节的偏移量获取切换入处理器运行进程的编号prev_pid。步骤42获取切换出处理器进程的编号next_pid,获取方式与步骤41类似。步骤43调用Hypercall()函数,将prev_pid和next_pid参数传递给保护系统进行处理。步骤44是结束动作。
附图5是进程退出截获操作流程图。此流程可以完成对客户机进程退出事件的截获,进程退出截获。共4个步骤。步骤50是起始动作。步骤51从描述退出进程的task_struct结构体中获取退出进程的编号pid。步骤52调用Hypercall()函数,将pid参数传递给保护系统进行处理。步骤53是结束动作。
附图6是进程创建处理操作流程图。在截获客户机进程创建事件后,控制流陷入到KVM中进行处理,以此流程可以完成对客户机进程创建事件的处理。共11个步骤。步骤60是起始动作。步骤61初始化一个内核栈信息节点stack_node。调用kmalloc()申请一个stack_node;根据截获客户机进程创建事件相应的pid和guest_phys参数,对stack_node初始化,设置相应的值。步骤62将新生成的stack_node节点插入到内核栈信息库stack_list中。List_add_rcu()是Linux内核提供的插入一个节点到链表中的函数,输入参数为要插入的节点node和链表头head,保护系统调用此函数,并为此函数传入的参数node为stack_node,head为stack_list。步骤63为内核栈主动申请物理页框。Try_asny_pf()是KVM为某客户机物理页框分配实际物理页框的函数,输入参数为客户机物理页框gfn等,输出为实际分配的页框号为s_pf,保护系统调用此函数,并为此函数传入的参数gfn为guest_phys对应的页框号。步骤64初始化计数器n的值为0。步骤65判断当前计数器的值是否小于客户机配置vCPU的个数N。如果是转步骤66,否则转步骤6a,结束处理进程创建事件的操作。步骤66在第n个vCPU对应的EPT结构即EPT_n上设置对内核栈的地址翻译信息,即EPT表项。_direct_map()函数是进行EPT表项设置的函数,输入参数是需要设置EPT表项的客户机物理地址gpa、为gpa分配的物理页框号hfn等,保护系统调用此函数,并为此函数传入的参数gpa为guest_phys,hfn为s_pf。步骤67在EPT_n上检索到步骤66设置的EPT表项,然后在此EPT表项上增加只读的访问权限信息。For_each_shadow_entry是KVM迭代遍历EPT结构检索到某客户机物理地址对应EPT表项的宏,输入参数为要检索对应EPT表项的客户机物理地址gpa等,保护系统调用此函数,并为此函数传入的参数gpa为guest_phys。步骤68对第n个EPT结构的TLB进行刷新。Kvm_flush_remote_tlbs_with_address()函数是对EPT TLB刷新的优化函数,输入参数为要刷新表项对应的客户机物理页框gfn等,保护系统调用此函数,并为此函数传入的参数gfn为guest_phys对应的页框号。步骤69将计数器n增加1,之后转步骤65再次判断。步骤6a是结束动作。
附图7是进程切换处理操作流程图。在截获客户机进程切换事件后,控制流陷入到KVM中进行处理,以此流程可以完成对客户机进程切换事件的处理。共10个步骤。步骤70是起始动作。步骤71获取发生进程切换的vCPU的编号x。步骤72根据切换出处理器运行进程的编号prev_pid在内核栈信息库stack_list中查找得到prev_pid对应的prev_node节点。步骤73从prev_node节点中获取切换出处理器进程的内核栈物理地址prev_phys。步骤74以prev_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_x结构,检索到prev_phys对应的EPT表项,并在此表项上进行只读权限的设置。步骤75根据切换入处理器运行进程的编号next_pid在stack_list中查找得到next_pid对应的next_node节点。步骤76从next_node节点中获取切换入处理器进程的内核栈物理地址next_phys。步骤77以next_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_x结构,检索到next_phys对应的EPT表项,并在此表项上进行可写权限的设置。步骤78以prev_phys和next_phys为参数调用kvm_flush_remote_tlbs_with_address()函数对EPT_x TLB进行选择性刷新。步骤79是结束动作。
附图8是进程退出处理操作流程图。在截获客户机进程退出事件后,控制流陷入到KVM中进行处理,以此流程可以完成对客户机进程退出事件的处理。共9个步骤。步骤80是起始动作。步骤81根据退出进程的编号pid在stack_list中查找pid对应的stack_node节点。步骤82从stack_node节点中获取退出进程内核栈的物理地址guest_phys。步骤83初始化计数器n的值为0。步骤84判断当前计数器的值是否小于客户机配置vCPU的个数N。如果是转步骤85,否则转步骤88结束处理进程退出事件的操作。步骤85以guest_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_n结构,检索到guest_phys对应的EPT表项,并在此表项上进行可写权限的设置。步骤86以guest_phys为参数调用kvm_flush_remote_tlbs_with_address()函数对EPT_n TLB进行选择性刷新。步骤87将计数器n增加1,之后转步骤84再次判断。步骤88是结束动作。
附图9是攻击行为检测操作流程图。此流程可以完成对客户机攻击行为的检测。共7个步骤。步骤90是起始动作。步骤91定位到KVM进行EPT缺页中断的处理函数tdp_page_fault()中,tdp_page_fault()函数将根据引起EPT缺页的具体原因,针对性地进行处理。步骤92判断引起EPT缺页中断的原因是否是因为写权限不足。如果是转步骤93,否则转步骤95由tdp_page_fault()函数处理。步骤93使用引起缺页的客户机物理地址遍历stack_list,判断引起EPT缺页中断的地址是否属于某stack_node所描述的内核栈范围内。如果是转步骤94,否则转步骤95。步骤94根据以上检测,确定此处EPT缺页中断是由于攻击行为发生所引起,即保护系统检测到了攻击行为的发生,以报警的形式提醒用户。步骤95是tdp_page_fault()根据具体EPT缺页原因正常的处理步骤。步骤96是结束动作。
需要注意的是,发明中所引用的如“上”、“下”、“左”、“右”、“前”、“后”等的用语,亦仅为便于叙述的明了,而非用以限定本发明可实施的范围,其相对关系的改变或调整,在无实质变更技术内容下,当亦视为本发明可实施的范畴。
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (9)
1.一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于,将保护系统嵌入到虚拟机管理器Hypervisor中,从而实现对客户机中的进程内核栈的完整性保护;
保护系统中包括内核栈信息库stack_list和基于内核虚拟机KVM;内核栈信息库stack_list存储保护系统全局的数据内容以及客户机中各进程内核栈的信息,包括内核栈基址的客户机物理地址及对应的进程编号pid;KVM是Linux内核中提供虚拟化功能的组件,通过创建并调度多个虚拟CPU即vCPU以提供客户机多核环境的能力,KVM创建和维护扩展页表EPT,以支持实现客户机物理地址的自动地址翻译,EPT是Intel支持内存虚拟化的硬件结构,完成客户机物理地址到实际物理地址的转换;
保护系统的关键操作包括:
1)保护系统初始化:保护系统的初始化操作,包括建立内核栈信息库,以及为每个虚拟CPU分别建立EPT结构;
2)进程创建截获:截获客户机中进程创建事件,将新创建进程的编号及内核栈物理地址传递给保护系统处理;
3)进程切换截获:截获客户机中进程切换事件,将切换出和切换入处理器的进程的编号传递给保护系统处理;
4)进程退出截获:截获客户机中进程退出事件,将退出进程的编号传递给保护系统处理;
5)进程创建处理:保护系统为新创建的内核栈分配物理页框,然后在各个EPT上为其建立地址翻译信息并设置只读权限;
6)进程切换处理:保护系统在EPT结构上设置切换入处理器进程的内核栈的访问权限为可写,切换出的为只读;
7)进程退出处理:保护系统在各个EPT上设置退出进程内核栈的访问权限为只读;
8)攻击行为检测:保护系统根据产生EPT缺页中断的原因,判断是否发生了攻击形式,如果是,则以报警的形式提醒用户。
2.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:保护系统初始化操作包括如下步骤:
步骤21:在KVM启动时,设置ept使能变量ept_enable为1,以开启EPT机制,保证保护系统可以正常运行;
步骤22:初始化内核栈信息库;
步骤23:初始化计数器n的值为0;
步骤24:判断当前计数器的值是否小于客户机配置vCPU的个数N,如果是转步骤25,否则转步骤27,结束保护系统初始化操作;
步骤25:为第n个vCPU创建对应的EPT结构的根目录;
步骤26:将计数器n增加1,之后转步骤24再次判断;
步骤27:结束动作。
3.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:进程创建截获操作是在客户机内核do_fork()函数中,插入对客户机进程创建事件的截获操作,包括如下步骤:
步骤31:获取新创建进程编号pid;
步骤32:获取新创建进程内核栈的客户机物理地址guest_phys;
步骤33:调用Hypercall()函数,中断客户机的执行,将控制流陷入到KVM中进行处理;
步骤34:结束动作。
4.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:进程切换截获操作是在客户机内核_switch_to_asm代码段中,插入客户机进程切换事件的截获操作,包括如下步骤:
步骤41:根据为_switch_to_asm传入的指向切换入处理器运行进程的task_struct结构体地址的eax寄存器的值,使用task_struct结构体中pid字段距离task_struct结构体起始字节的偏移量获取切换入处理器运行进程的编号prev_pid;
步骤42:采用步骤41的方式,获取切换出处理器进程的编号next_pid;
步骤43:调用Hypercall()函数,将prev_pid和next_pid参数传递给保护系统进行处理;
步骤44:结束动作。
5.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:进程退出截获操作包括如下步骤:
步骤51:从描述退出进程的task_struct结构体中获取退出进程的编号pid;
步骤52:调用Hypercall()函数,将pid参数传递给保护系统进行处理;
步骤53:结束动作。
6.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:进程创建处理操作是在截获客户机进程创建事件后,控制流陷入到KVM中进行处理,以此流程完成对客户机进程创建事件的处理,包括如下步骤:
步骤61:初始化一个内核栈信息节点stack_node;
步骤62:将新生成的stack_node节点插入到内核栈信息库stack_list中;
步骤63:为内核栈主动申请物理页框;
步骤64:初始化计数器n的值为0;
步骤65:判断当前计数器的值是否小于客户机配置vCPU的个数N,如果是转步骤66,否则转步骤6a,结束处理进程创建事件的操作;
步骤66:在第n个vCPU对应的EPT结构即EPT_n上设置对内核栈的地址翻译信息,即EPT表项;
步骤67:在EPT_n上检索到步骤66设置的EPT表项,然后在此EPT表项上增加只读的访问权限信息;
步骤68:对第n个EPT结构的TLB进行刷新;
步骤69:将计数器n增加1,之后转步骤65再次判断;
步骤6a:结束动作。
7.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:进程切换处理操作是在截获客户机进程切换事件后,控制流陷入到KVM中进行处理,以此流程完成对客户机进程切换事件的处理,包括如下步骤:
步骤71:获取发生进程切换的vCPU的编号x;
步骤72:根据切换出处理器运行进程的编号prev_pid在内核栈信息库stack_1ist中查找得到prev_pid对应的prev_node节点;
步骤73:从prev_node节点中获取切换出处理器进程的内核栈物理地址prev_phys;
步骤74:以prev_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_x结构,检索到prev_phys对应的EPT表项,并在此表项上进行只读权限的设置;
步骤75:根据切换入处理器运行进程的编号next_pid在stack_list中查找得到next_pid对应的next_node节点;
步骤76:从next_node节点中获取切换入处理器进程的内核栈物理地址next_phys;
步骤77:以next_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_x结构,检索到next_phys对应的EPT表项,并在此表项上进行可写权限的设置;
步骤78:以prev_phys和next_phys为参数调用kvm_flush_remote_tlbs_with_address()函数对EPT_x TLB进行选择性刷新;
步骤79:结束动作。
8.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:进程退出处理操作是在截获客户机进程退出事件后,控制流陷入到KVM中进行处理,以此流程完成对客户机进程退出事件的处理,具体包括如下步骤:
步骤81:根据退出进程的编号pid在stack_list中查找pid对应的stack_node节点;
步骤82:从stack_node节点中获取退出进程内核栈的物理地址guest_phys;
步骤83:初始化计数器n的值为0;
步骤84:判断当前计数器的值是否小于客户机配置vCPU的个数N,如果是转步骤85,否则转步骤88结束处理进程退出事件的操作;
步骤85:以guest_phys为主要参数使用for_each_shadow_entry宏迭代遍历EPT_n结构,检索到guest_phys对应的EPT表项,并在此表项上进行可写权限的设置;
步骤86:以guest_phys为参数调用kvm_flush_remote_tlbs_with_address()函数对EPT_n TLB进行选择性刷新;
步骤87:将计数器n增加1,之后转步骤84再次判断;
步骤88:结束动作。
9.如权利要求1所述的一种基于硬件虚拟化的多核环境进程内核栈保护方法,其特征在于:攻击行为检测操作包括如下步骤:
步骤91:定位到KVM进行EPT缺页中断的处理函数tdp_page_fault()中,tdp_page_fault()函数将根据引起EPT缺页的具体原因,针对性地进行处理;
步骤92:判断引起EPT缺页中断的原因是否是因为写权限不足,如果是转步骤93,否则转步骤95由tdp_page_fault()函数处理;
步骤93:使用引起缺页的客户机物理地址遍历stack_list,判断引起EPT缺页中断的地址是否属于某stack_node所描述的内核栈范围内,如果是转步骤94,否则转步骤95;
步骤94:根据以上检测,确定此处EPT缺页中断是由于攻击行为发生所引起,即保护系统检测到了攻击行为的发生,以报警的形式提醒用户;
步骤95:tdp_page_fault()根据具体EPT缺页原因正常处理;
步骤96:结束动作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910391660.XA CN110096871B (zh) | 2019-05-10 | 2019-05-10 | 一种基于硬件虚拟化的多核环境进程内核栈保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910391660.XA CN110096871B (zh) | 2019-05-10 | 2019-05-10 | 一种基于硬件虚拟化的多核环境进程内核栈保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110096871A true CN110096871A (zh) | 2019-08-06 |
CN110096871B CN110096871B (zh) | 2021-03-19 |
Family
ID=67447693
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910391660.XA Active CN110096871B (zh) | 2019-05-10 | 2019-05-10 | 一种基于硬件虚拟化的多核环境进程内核栈保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110096871B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110688650A (zh) * | 2019-08-15 | 2020-01-14 | 奇安信安全技术(珠海)有限公司 | 访问请求的监测方法及装置、存储介质、计算机设备 |
WO2021026938A1 (zh) * | 2019-08-15 | 2021-02-18 | 奇安信安全技术(珠海)有限公司 | shellcode的检测方法及装置 |
CN112395609A (zh) * | 2019-08-15 | 2021-02-23 | 奇安信安全技术(珠海)有限公司 | 应用层shellcode的检测方法及装置 |
CN112395610A (zh) * | 2019-08-15 | 2021-02-23 | 奇安信安全技术(珠海)有限公司 | 内核层shellcode的检测方法及装置 |
CN115098244A (zh) * | 2022-05-30 | 2022-09-23 | 荣耀终端有限公司 | 内核栈的分配方法、电子设备、芯片及存储介质 |
CN118012675A (zh) * | 2024-04-10 | 2024-05-10 | 麒麟软件有限公司 | 虚拟化保护GuestOS中断栈的方法、装置及存储介质 |
CN118012675B (zh) * | 2024-04-10 | 2024-06-28 | 麒麟软件有限公司 | 虚拟化保护GuestOS中断栈的方法、装置及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104021344A (zh) * | 2014-05-14 | 2014-09-03 | 南京大学 | 一种用于收集和截获计算机内存行为的蜜罐机制及其方法 |
US20160335436A1 (en) * | 2015-05-15 | 2016-11-17 | Harshawardhan Vipat | Kernel runtime integrity using processor assists |
CN107102888A (zh) * | 2017-04-25 | 2017-08-29 | 华中科技大学 | 一种基于硬件虚拟化技术的共享库隔离保护方法及系统 |
CN108874500A (zh) * | 2018-04-26 | 2018-11-23 | 南京大学 | 一种基于硬件虚拟化技术的应用程序安全保护方法 |
-
2019
- 2019-05-10 CN CN201910391660.XA patent/CN110096871B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104021344A (zh) * | 2014-05-14 | 2014-09-03 | 南京大学 | 一种用于收集和截获计算机内存行为的蜜罐机制及其方法 |
US20160335436A1 (en) * | 2015-05-15 | 2016-11-17 | Harshawardhan Vipat | Kernel runtime integrity using processor assists |
CN107102888A (zh) * | 2017-04-25 | 2017-08-29 | 华中科技大学 | 一种基于硬件虚拟化技术的共享库隔离保护方法及系统 |
CN108874500A (zh) * | 2018-04-26 | 2018-11-23 | 南京大学 | 一种基于硬件虚拟化技术的应用程序安全保护方法 |
Non-Patent Citations (2)
Title |
---|
PINGHAI YUAN等: "Hardware-Assisted Fine-Grained Code-Reuse", 《SPRINGER INTERNATIONAL PUBLISHING SWITZERLAND 2015》 * |
黄啸等: "基于硬件虚拟化的安全高效内核监控模型", 《软件学报》 * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110688650A (zh) * | 2019-08-15 | 2020-01-14 | 奇安信安全技术(珠海)有限公司 | 访问请求的监测方法及装置、存储介质、计算机设备 |
WO2021026938A1 (zh) * | 2019-08-15 | 2021-02-18 | 奇安信安全技术(珠海)有限公司 | shellcode的检测方法及装置 |
CN112395609A (zh) * | 2019-08-15 | 2021-02-23 | 奇安信安全技术(珠海)有限公司 | 应用层shellcode的检测方法及装置 |
CN112395610A (zh) * | 2019-08-15 | 2021-02-23 | 奇安信安全技术(珠海)有限公司 | 内核层shellcode的检测方法及装置 |
CN113646763A (zh) * | 2019-08-15 | 2021-11-12 | 奇安信安全技术(珠海)有限公司 | shellcode的检测方法及装置 |
CN113646763B (zh) * | 2019-08-15 | 2024-02-02 | 奇安信安全技术(珠海)有限公司 | shellcode的检测方法及装置 |
CN110688650B (zh) * | 2019-08-15 | 2024-03-08 | 奇安信安全技术(珠海)有限公司 | 访问请求的监测方法及装置、存储介质、计算机设备 |
CN112395610B (zh) * | 2019-08-15 | 2024-04-16 | 奇安信安全技术(珠海)有限公司 | 内核层shellcode的检测方法及装置 |
CN115098244A (zh) * | 2022-05-30 | 2022-09-23 | 荣耀终端有限公司 | 内核栈的分配方法、电子设备、芯片及存储介质 |
CN115098244B (zh) * | 2022-05-30 | 2024-04-05 | 荣耀终端有限公司 | 内核栈的分配方法、电子设备、芯片及存储介质 |
CN118012675A (zh) * | 2024-04-10 | 2024-05-10 | 麒麟软件有限公司 | 虚拟化保护GuestOS中断栈的方法、装置及存储介质 |
CN118012675B (zh) * | 2024-04-10 | 2024-06-28 | 麒麟软件有限公司 | 虚拟化保护GuestOS中断栈的方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110096871B (zh) | 2021-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110096871A (zh) | 一种基于硬件虚拟化的多核环境进程内核栈保护方法 | |
CN105393255B (zh) | 用于虚拟机中的恶意软件检测的过程评估 | |
CN105593870B (zh) | 用于恶意软件检测的复杂评分 | |
CN105740046B (zh) | 一种基于动态库的虚拟机进程行为监控方法与系统 | |
CN107851153A (zh) | 使用异步自测异常的计算机安全系统及方法 | |
US8347380B1 (en) | Protecting users from accidentally disclosing personal information in an insecure environment | |
CN110851241A (zh) | Docker容器环境的安全防护方法、装置及系统 | |
CN102096786A (zh) | 基于硬件虚拟化的跨平台安全保护系统 | |
CN102663312A (zh) | 一种基于虚拟机的rop攻击检测方法及系统 | |
CN107690645A (zh) | 使用解释器虚拟机的行为恶意软件检测 | |
CN103310152B (zh) | 基于系统虚拟化技术的内核态Rootkit检测方法 | |
US20180248847A1 (en) | System and method for monitoring and protecting an untrusted operating system by means of a trusted operating system | |
CN103632101B (zh) | 一种拦截系统调用的方法和装置 | |
US20200193041A1 (en) | Preventing ransomware from encrypting data elements | |
US10623438B2 (en) | Detecting execution of modified executable code | |
CN102521531B (zh) | 基于硬件虚拟化的密码保护系统 | |
CN105488388A (zh) | 一种基于cpu时空隔离机制实现应用软件行为监控系统的方法 | |
US10503932B2 (en) | Secure mode state data access tracking | |
CN104008329A (zh) | 一种基于虚拟化技术的软件隐私泄露行为检测方法及系统 | |
CN105117649A (zh) | 一种用于虚拟机的防病毒方法与系统 | |
CN109684829A (zh) | 一种虚拟化环境中服务调用监控方法和系统 | |
CN107871079A (zh) | 一种可疑进程检测方法、装置、设备及存储介质 | |
CN102521547B (zh) | 虚拟域内访问控制系统的保护系统 | |
Tang et al. | Secure and efficient in-hypervisor memory introspection using nested virtualization | |
Win et al. | Virtual machine introspection |
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 |