CN110096871A - 一种基于硬件虚拟化的多核环境进程内核栈保护方法 - Google Patents

一种基于硬件虚拟化的多核环境进程内核栈保护方法 Download PDF

Info

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
Application number
CN201910391660.XA
Other languages
English (en)
Other versions
CN110096871B (zh
Inventor
曾庆凯
杜震
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201910391660.XA priority Critical patent/CN110096871B/zh
Publication of CN110096871A publication Critical patent/CN110096871A/zh
Application granted granted Critical
Publication of CN110096871B publication Critical patent/CN110096871B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring 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/53Monitoring 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:结束动作。
CN201910391660.XA 2019-05-10 2019-05-10 一种基于硬件虚拟化的多核环境进程内核栈保护方法 Active CN110096871B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 南京大学 一种基于硬件虚拟化技术的应用程序安全保护方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Title
PINGHAI YUAN等: "Hardware-Assisted Fine-Grained Code-Reuse", 《SPRINGER INTERNATIONAL PUBLISHING SWITZERLAND 2015》 *
黄啸等: "基于硬件虚拟化的安全高效内核监控模型", 《软件学报》 *

Cited By (12)

* Cited by examiner, † Cited by third party
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