一种Linux内核轻量级结构化保护方法及装置与流程

文档序号:11276729阅读:177来源:国知局
本发明属于计算机操作系统内核安全
技术领域
:,具体涉及一种基于虚拟化技术针对linux内核的轻量级结构化的保护方法及装置。
背景技术
::随着计算机系统越来越广泛的使用,计算机系统的安全问题被广泛关注。计算机系统的安全有多个层次和方面,而在传统的软件栈中操作系统内核是处于最底层,是整个计算机系统的基础,因此操作系统内核安全尤为重要。linux操作系统内核是极其庞大和复杂的,对其进行全方位保护需要的开销极大,并且保护方案难以实现和确保全面性。已有的技术多是针对抵御特定类型的攻击和防护特定类型的结构,提供单一侧面的内核保护。技术实现要素:本发明要解决的技术问题是以较小的性能代价提升linux内核整体的安全性而不仅仅是某个单一侧面的保护。为了解决上述问题,本发明提出了一种基于虚拟化技术针对linux内核的轻量级结构化的保护方法,包括:将linux内核结构化为两个部分——关键保护结构和非关键保护结构。对关键保护结构进行重点保护,而对非关键保护结构进行可选择性保护。对于linux内核结构化的划分,本发明以linux安全模块(linuxsecuritymodule,lsm)为基础,将其作为关键保护结构的重点,然后以此展开,将与lsm密切相关的结构都作为关键保护结构。这些结构包括lsm框架中的security_hook_heads、各个安全模块中的security_hook_list、系统调用表sys_call_table与ia32_sys_call_table、中断向量表idt_table与debug_idt_table以及trace_idt_table、内核中所有代码和与前述结构相关的页表项。本方法监控针对上述关键保护结构的修改动作。监控的原则包括:通过清除虚拟机扩展页表(extendpagetable,ept)里受保护数据结构相关页表项中的写权限位,防止security_hook_heads、security_hook_list、系统调用表、中断向量表被更改。通过清除ept里内核代码(包括内核模块代码)相关页表项中的写权限位,捕捉对内核代码的更改行为,对更改进行检测。当检测认为符合内核中任意特性对内核代码的修改行为后,模拟指令使对内核代码的修改生效。通过清除与受保护页表项相关的ept里的页表项中的写权限,捕捉对受保护页表项的修改,检查修改是否保证了其映射不被改变以及权限设置满足代码完整性的要求。对经过检查的修改经过指令模拟,完成相应的修改。本发明还提供了一种linux内核轻量级结构化保护装置,包括:启动模块,用于本装置的启动过程和初始化的管理。当linux内核启动完毕且各个启动阶段应该别加载的模块加载完毕之后,本专利提出的装置将以模块的形式进入到内核当中执行。本装置将建立虚拟化的执行环境,然后将当前在物理机上运行的操作系统内核迁移到刚建立的虚拟机中去,接着通过这个虚拟机对操作系统内核进行监控。虚拟机管理模块,用于维护虚拟机的虚拟执行环境,提供本装置到虚拟机的切换,处理虚拟机切换到本装置后的虚拟机状态记录以及根据虚拟机退出原因进行任务分发,维护和更改ept中权限设置。保护结构管理模块,用于记录被保护结构在虚拟机中的虚拟地址和物理地址以及虚拟地址与物理地址的关系,管理被保护结构的增加与删除,维护保护结构与策略函数关系。本发明所述“策略函数”是指保护结构权限违背后需要采取的应对措施,包括但不限于数据策略、代码策略和页表策略。指令解析与模拟模块,用于对机器指令进行解析,辅助策略函数判断指令会对内存产生的修改,模拟指令让指令生效。数据策略模块,用于对被保护的数据变更进行拦截。代码策略模块,用于对被保护的代码变更进行检查,判定修改的合法性,拦截非法的修改,模拟合法的修改以使修改生效。页表策略模块,用于对被保护的页表项变更进行检查,判定修改的合法性,拦截非法的修改,模拟合法的修改以使修改生效。与现有技术相比,本发明的有益效果是:本发明能够以较小的性能代价提升linux内核整体的安全性,而不仅仅是某个单一侧面的保护。本发明将内核保护的范围缩小到了关键保护结构,降低了保护的对象规模,减小了性能开销。同时与已有的技术只针对特定的攻击或者具有特定语义的结构,本发明对代码、数据和控制流的完整性都进行了保护,实现更加全面的防护。附图说明图1是页表项分类示意图;图2是指令更改过程图;图3是安装本发明的系统与原生系统的性能对比图。具体实施方式为使本发明的目的、技术方案和优点表达得更加清楚明白,下面将结合本发明实施实例中的附图,对本发明再作进一步详细的说明。显然,所描述的实施例只是本发明的一部分实例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员凡是采用本发明的设计结构和思想而在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本文是基于针对intelx86_64架构的linux系统的方案,其中所涉及的现有的系统调用、结构、函数、处理器特性、寄存器的名称在本领域均习惯使用英文,对于没有公认中文释义的名称,使用中文反而有可能让本领域技术人员迷惑;且这些名称在linux系统和intel处理器中均有特定含义,技术人员能够明确各名称所表示的内容,而不会产生误解。因此本文中所涉及的linux系统和intel处理器中现有的、无公认中文翻译的名称均使用英文表示。本发明的一个实施例描述关键保护数据的保护方法,对关键保护数据的修改进行拦截;本发明的又一个实施例表述对页表的保护,对正常的页表项修改企图进行检查后模拟指令完成修改动作;本发明的又一个实施例描述内核代码的保护方法,对非法的代码修改企图进行检查后拦截修改以及对正常的代码修改企图进行检查后模拟指令完成修改动作。实施例一、一种对关键保护数据的保护方法,包括:101、在本装置启动阶段,本装置将初始化执行环境,并将关键保护数据和内核代码(包括内核模块代码)在内的关键保护结构的地址范围、相应的ept页表权限与各关键保护结构的策略函数加入到保护结构管理模块中。102、保护结构管理模块获得各个关键保护数据结构和内核代码以及可加载内核模块代码的虚拟地址范围,然后遍历内核页表找到这些虚拟地址范围对应的保护结构的物理地址范围,将这些物理地址范围与各个相关的保护结构关联起来,同时在遍历的过程中找到与关联这些虚拟地址范围与物理地址范围的页表项,并将这些页表项对应的物理地址范围和与之相关的保护结构关联起来。103、保护结构管理模块根据获得的ept页表权限并通过虚拟机管理模块的设置,遍历页表得到的保护结构物理地址范围所对应的ept页表项中的权限。所有的保护结构的ept页表项权限都清除了写权限。当虚拟机中一个对系统调用表的修改发生时,这个修改由于ept中权限设置使得虚拟机切换到宿主机上,从而虚拟机管理模块获得执行。104、虚拟机管理模块从虚拟机控制结构vmcs中获取虚拟机退出原因,然后根据出错原因调用相应的处理函数,从而eptviolation处理函数得以执行。该函数从vmcs获得获取错误发生的物理地址,然后根据物理地址找到对应的保护结构和类型信息,然后调用与保护结构关联的策略函数。系统调用表是属于关键保护数据,因此其策略函数不做任何判定,直接拒绝这次修改,然后通报此次篡改行为。实施例二、一种对页表的保护方法,包括:本实施例在本装置的启动阶段与实施例一中步骤101、102和103相同。根据页表项对应结构的不同,本专利将页表项进行了分类,如图1所示(其中pgd表示全局页目录,pmd表示中间目录,pte表示页表项,pa表示物理地址),包括:代码相关页表项,如果一个页表项参与了到某一个内核代码页(包括内核模块代码页)的地址转换,那么这个页表项就被称为代码相关页表项。代码无关数据相关页表项,如果一个页表项不是代码相关页表项且参与了被保护数据页的地址转换,那么这个页表项便称为代码无关数据相关页表项。受限页表项,如果一个页表页中包含代码相关页表项,那么这个页表页中不为代码相关页表项或是代码无关数据相关页表项的页表项被称为受限页表项。非受限页表项,如果一个页表页中不包含代码相关页表项而包含代码无关数据相关页表项,那么这个页表页中不为代码无关数据相关页表项的页表项被成为非受限页表项。用户相关页表项,如果一个页表项存在于一个pgd中且是用于用户空间地址翻译,那么这个页表项就被称为用户相关页表项。非受控页表项,如果一个页表项不属于上述所有类型,那么这个页表项被成为非受控页表项。除了非受控页表项以外,所有的页表项所在的物理页对应的ept页表项都将清除写权限。当一个非非受控页表项的页表项修改发生时,由于ept中权限设置使得虚拟机切换到宿主机上,虚拟机管理模块获得执行。同步骤104,页表对应的策略函数得以执行。页表策略函数首先根据错误物理地址找到页表项对应的一个或多个保护结构或者报告有对应的保护对象。对于有保护结构对应的页表项,如果任一保护结构是内核代码或是内核模块代码,策略函数认定其为代码相关页表,否则认定为代码无关数据相关页表项。对于没有保护结构对应的页表项,本装置首先根据物理地址范围对应的类型判断页表项是否处于pgd,对于处于pgd中的页表项判断是否属于用户程序使用的用户地址空间,即是页表项是否处于pgd前256项,如果页表项是pgd中的前256项,则页表项为用户相关页表项,否则继续判断该页表项所在页中的其它页表项是否有代码相关页表项,如果有则为受限页表项,否则为非受限页表项。对于代码无关数据相关页表项,本专利确保其保存的下一级物理地址不变以及权限位总是可读、可写、不可执行。对于代码相关页表项,本专利确保其保存的下一级物理地址不变以及权限位可读、可写、可执行。对于受限页表项,本专利确保其权限位可读、可写、不可执行。对于全局页目录表pgd中的用户相关页表项,本专利确保其权限为用户可访问。对非受控页表项,本专利不做任何限制。策略函数通过指令解析与模拟模块得到此次修改期望的结果,然后将之与页表项原始值进行对比。当检查页表项的修改不满足上述要求时,策略函数判定此次修改为非法篡改,并通报篡改行为;当检查页表项的修改满足上述要求时,策略函数根据当前rip寄存器获取代码位置,并从vmcs中获取代码长度,然后交给指令解析与模拟模块。指令解析与模拟模块,将期望的结果真实地写入到页表项对应的物理地址上去。指令模拟成功后,修改虚拟机的rip值成下一条指令的地址,然后虚拟机管理模块将恢复虚拟机执行环境,最后切换虚拟机中执行。实施例三、一种对内核代码的保护方法,包括:本实施例在本装置的启动阶段与实施例一中步骤101、102和103相同。当一个对内核代码的修改发生时,由于ept中权限设置使得虚拟机切换到宿主机上,虚拟机管理模块获得执行。同步骤104,代码策略函数得以执行。代码策略函数从指令解析与模拟模块中得到希望修改的新指令,并将修改提交给若干判定函数进行判定。statickeys判定器判定此次修改是否为内核statickeys特性完成。该判定器在__jump_table中查找,此次修改的位置是否与某个jump_entry结构中的code域里存储的地址相对应。如果不是,则判定器认定此次修改不是合法的;否则,判定器继续对修改的内容进行检查。401、正常的修改过程如图2,因此在指令修改的过程中有三个合法的状态。状态s1表示当前指令为nop指令;状态s2表示当前指令是int3指令;状态s3表示当前指令是jump指令。s1和s3只能通过s2转移得到。s2可以转移到任意状态,包括它自身,也可以从任意状态转移到。当本方法探测到转换前是s1时,本方法检查是否是在首字节写入int3指令。如果是,本方法写入int3指令,并记录这次指令替代。当本方法探测到转换前是s2时,本方法需要检查是否有相关的指令替代被记录过。如果记录表明s2转移到s2,根据记录本方法知道这次指令替换的方向。对于nop指令替换成jump指令,本方法检查替换后的地址是否是jump_entry记录的目标。对于jump指令替换成nop指令,本方法检查替换后的地址是否是nop指令的后半部分。如果记录表明s2转移到s1时,本方法检查待写入的字节是否为nop的首字节。如果记录表明s2转移到s1时,本方法检查写入的字节是否是jump指令的首字节。当本方法探测到转换前是s3时,本方法检查是否首字节写入int3指令。如果检查不被通过,本方法便认为不是合法的修改。kgdb判定器判定此次修改是否为内核kgdb特性完成。该判定器检查新的指令是否为int3指令,如果是,则记录下该次修改的位置和原始指令字节,并判定为合法,否则查找是否记录过该位置的指令修改,在有记录的情况下比较新的指令和记录的指令是否相同,只有在记录且相同的情况下认定修改合法。ftrace判定器判定此次修改是否为内核ftrace特性完成。该判定器首先通过内核符号表查找修改的地址是否处于函数的第一条指令中,如果不是则该判定器认定此次修改非法,否则对修改的内容进行检查。402、本判断与401大致相同,主要是用call指令而不是jump指令。在指令修改的过程中有三个合法的状态。状态s1表示当前指令为nop指令;状态s2表示当前指令是int3指令;状态s3表示当前指令是call指令。s1和s3只能通过s2转移得到。s2可以转移到任意状态,包括它自身,也可以从任意状态转移到。当本方法探测到转换前是s1时,本方法检查是否是在首字节写入int3指令。如果是,本方法写入int3指令,并记录这次指令替代。当本方法探测到转换前是s2时,本方法需要检查是否有相关的指令替代被记录过。如果记录表明s2转移到s2,根据记录本方法知道这次指令替换的方向。对于nop指令替换成call指令,本方法检查替换后的地址是否是预先记录的固定的一族函数地址,该族函数是各个追踪器的追踪函数,如果是,则判定为合法修改。如果不是,则检查地址对应的函数是否是通过跳板函数模板生成的跳板函数。如果不是跳板函数,则判定为非法修改,否则,检查跳板函数中跳转的地址是否是预先记录的固定的一族函数地址,该族函数是各个追踪器的追踪函数。对于call指令替换成nop指令,本方法检查替换后的地址是否是nop指令的后半部分。如果记录表明s2转移到s1时,本方法检查待写入的字节是否为nop的首字节。如果记录表明s2转移到s1时,本方法检查写入的字节是否是call指令的首字节。当本方法探测到转换前是s3时,本方法检查是否首字节写入int3指令。如果检查不被通过,本方法便认为不是合法的修改。kprobes判定器判定此次修改是否为内核kprobes特性完成。kprobes判定器与ftrace判定器类似,区别在于步骤402中的跳板函数模板不同。当一次代码修改被任意一个判定器判定为合法,本方法就认为此次代码修改是合法的,然后交给指令解析和模拟模块进行指令模拟真实地修改代码。本发明的启动时间平均为63.7毫秒,对原始操作系统的性能损耗平均为3%。图3展现了在不同测试中具体的性能对比。本发明也可采用其他设施方式,如通过其它硬件或软件机制替代intelvt-x技术拦截对关键保护结构的修改,并进行如同实施例一、实施例二和实施例三中的检查和模拟过程。当然,本发明不仅局限于上述具体的实现方式,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明的权利要求的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1