一种补丁的内核加载方法及装置与流程

文档序号:14518834阅读:126来源:国知局
本发明涉及计算机
技术领域
:,尤其涉及一种补丁的内核加载方法及装置。
背景技术
::在linux系统中,传递内核动态加载依赖于可加载内核模块(lkm,loadablekernelmodules),这是一种区别于一般应用程序的系统级程序,它主要用于扩展linux的内核功能。因为lkm可以动态地加载到内存中,无须重新编译内核。但是,由于lkm提供了公共的内核模块加载接口,这样就暴露了很大的风险,黑客会想法设法将自己的恶意程序加载进内核中执行,用户也会无意中加载一些恶意或不兼容的模块到自己手机,无法保障用户信息的安全。所以,现有技术中在不存在较为合理的补丁的内核加载方法。技术实现要素:鉴于上述问题,本发明提供一种补丁的内核加载方法及装置,以在不依赖于lkm的情况下实现补丁的内核加载。第一方面,本发明提供一种补丁的内核加载方法,包括:通过共享内存区获取来自用户态程序的补丁;对所述补丁进行校验,并在校验成功后,在内核内存区内为所述补丁申请内存;根据所述补丁自带的符号表和内核符号表,对内核符号进行重定义;刷新已申请的内存,并运行所述补丁的初始化函数,使得所述补丁加载到所述已申请的内存中。第二方面,本发明实施例提供一种补丁的内核加载装置,包括:获取单元,用于通过共享内存区获取来自用户态程序的补丁;校验单元,用于对所述补丁进行校验;申请单元,用于在校验成功后,在内核内存区内为所述补丁申请内存;重定义单元,用于根据所述补丁自带的符号表和内核符号表,对内核符号进行重定义;执行单元,用于刷新已申请的内存,并运行所述补丁的初始化函数,使得所述补丁加载到所述已申请的内存中。第三方面,本发明实施例提供一种内核加载引擎,包括:存储器和处理器,其中,存储其中存储有一个或者多个程序指令,所述处理器执行所述程序指令以实现如上述一个或者多个技术方案所述的方法步骤。第四方面,本发明实施例提供一种计算机可读存储介质,所述可读存储介质上存储有程序,所述程序被处理器执行时实现上述一个或者多个技术方案所述的方法步骤。本发明实施例提供的一种补丁的内核加载方法及装置,首先,通过共享内存区获取来自用户态程序的补丁,然后,对补丁进行校验,并在校验成功后,在内核内存区内为补丁申请内存,接着,根据补丁自带的符号表和内核符号表,对内核符号进行重定义,最后,刷新已申请的内存,并运行补丁的初始化函数,使得补丁加载到刷新后的已申请的内存中。可见,在本发明实施例中,对于补丁的内核加载并不依赖于lkm,而是采用一套新的内核加载方法来将补丁加载到内核中,如此,可以对内核漏洞进行热修补,而不依赖于内核配置。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作以简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为相关技术中的lkm加载方法的流程示意图;图2为本发明实施例中的补丁的加载方法的流程示意图;图3为本发明实施例中的补丁的卸载方法的流程示意图;图4为本发明实施例中的内核加载引擎的结构示意图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。在相关技术中,参见图1所示,lkm加载的主要流程如下:s101:加载模块的签名校验;s102:加载模块可执行与可链接格式(elf,executableandlinkableformat)头检验;s103:布置模块并分配相关的内存,把加载模块相关节区复制到最终内存中;s104:查询模块(modules)链表,并将此module对象添加到modules链表中;s105:为节区pcpu(per-cpu变量)分配空间,用于多处理器;s106:找到加载模块所有节区地址,初始化module对象相关指针;s107:检查license和version;s108:根据.modiufo段设置模块信息;s109:符号地址解析,根据模块的符号表,查找系统符号表,更新符号地址;s110:重定义,对模块中的重定义节区做重定义操作;s111:把可选参数从用户空间复制到内核空间,处理用于debug节区;s112:确认是否有重定义符号,并设置模块状态为正在运行;s113:释放临时内存,调用do_init_module开始运行模块。至此,完成了lkm的加载过程。但是由于lkm提供了公共的内核模块加载接口,这样就暴露了很大的风险,黑客会想法设法将自己的恶意程序加载进内核中执行,用户也会无意中加载一些恶意或不兼容的模块到自己手机,无法保障用户信息的安全。为了解决上述问题,本发明实施例提供一种补丁的内核加载方法,该方法应用于安装有linux系统或基于linux的其它系统,如android系统的内核加载引擎。在我们本发明实施例中,可以设定专有的数据结构,专有数据结构包括补丁内容、补丁的内核md5校验值、补丁的签名校验数据等,这种专有数据,就是被攻击者获取,也不能解析获取到任何有用信息,而且攻击者也伪造不出这样的数据,因为我们有多重的安全校验机制,保证加载的补丁安全、可信和可靠。参见图2所示,该补丁的内核加载方法可以包括以下步骤:s201:通过共享内存区获取来自用户态程序的补丁;s202:对补丁进行校验,并在校验成功后,在内核内存区内为补丁申请内存;s203:根据补丁自带的符号表和内核符号表,对内核符号进行定义;s204:刷新已申请的内存,并运行补丁的初始化函数,使得补丁加载到刷新后的已申请的内存中。其中,在s201中,服务器将补丁下发给内核加载引擎,由内核加载引擎内的用户态程序将该补丁写入共享内存区,然后,操作系统可以从共享内存区直接读取上述补丁。需要说明的是,在本发明实施例中,内核态程序与用户态程序共享内核中字符设备的存储空间,即共享内存区,该共享内存区分别与内核态内存区和用户态内存区进行地址映射,使得共享内存区中的一个共享物理地址分别对应有内核态内存区中第一虚拟地址和用户态内存区中第二虚拟地址。接下来,执行s202,执行热补丁内核安全校验机制,对补丁进行校验,此时,内核加载引擎根据补丁的标识,检测补丁是否已经加载;当检测出补丁未加载时,对补丁进行签名校验;在签名校验成功后,对补丁进行解密,获取补丁自带的符号表;根据符号表,验证补丁内核的md5和内核中值是否一致,其中,若一致,则执行加载,反之,则结束加载。如此,便可以实现补丁的精确和安全加载。具体来说,对elf文件的magic、class和machine字段进行校验,只有所有字段匹配才执行安全加载。进一步地,在验证补丁内核的md5和内核中值是否一致之后,上述方法还可以包括:在检验补丁内核的md5和内核中值一致后,校验补丁是否符合可执行与可链接格式elf。在实际应用中,传统的内核动态加载安全校验只包括签名校验和elf文件校验,这种校验机制缺乏对系统兼容性的校验,也缺乏对文件本身信息的隐藏,黑客可以轻易进行逆向分析,还原出源文件,分析出模块逻辑,对系统进行攻击。那么,通过补丁包签名校验机制实现补丁可控和指定加载,同时签名也间接实现了补丁的防纂改和防抵赖,为后面责任划分提供了依据。另外,通过校验补丁的符号表来确保所加载补丁不会导致系统奔溃,且手机中符号表只保存了导出符号地址,lkm模块不能解析未导出的符号地址,对于这类函数补丁,就不能通过lkm进行加载,补丁中自带符号表,可以解决系统中找不到符号的解析问题。同时,我们通过校验补丁id来防止反复加载攻击,通过校验加载参数来防止黑客恶意攻击行为。由上述可知,本发明中涉及的热补丁内核安全校验机制确保所加载的热补丁安全可靠,增加了动态加载攻击的难度,同时提供了lkm加载中不支持的功能点,具有更好的通用性和适用性。在s202中在内核内存区内为补丁申请内存的步骤可以包括:为补丁申请内存,并从共享内存区中将补丁的内容拷贝至已申请的内存;找到加载模块所有节区地址,并初始化模块(module)对象相关指针;为节区pcup分配空间。在实际应用中,加载进内核的程序不是随意申请的地址加载进去就可以,这是不行的,每个cup,比如说arm机器,他有自己的跳转指令空间,他指令跳转的时候,比如说arm,他的存储空间为32m,那么,就只能在32m地址空间之内跳转,如果加载在32m空间以外,这样的话,就导致跳转不过去,就直接失败了,导致手机就死机了。如果想要强制实现,就必须加入长跳转,但加入长跳转会增加开发难度,就是指令必须转换为长跳转指令。因为arm机器一般都是短跳转,短跳转的地址空间跳转是前后16m,所以的话,加载的必须在内核整个代码区。最大不能离开32m空间之内。所以我们实际上借鉴了lkm模块,安卓内核在内核起始地址,内核起始地址预留了16m空间,可以在16m空间中申请内存来做加载。接下来,执行s203,可以包括:查找系统符号表,校验补丁自带的符号表于系统符号表是否一致;如果一致,对重定义节区做重定义操作。最后,执行s204,刷新已申请的内存,并运行补丁的初始化函数。比如,刷新已申请的内存,将补丁加入补丁列表;运行补丁的初始化函数,并清理临时内存。至此,便完成了补丁的内核记载过程。在本发明实施例中,本发明还提供一种补丁的内核卸载方法,参见图3所示,该方法可以包括:s301:参数校验;s302:根据id查找要携带的补丁;s303:判断补丁是否已经卸载;s304:对未卸载的补丁执行卸载操作。本发明实施例提供的一种补丁的内核加载方法,首先,通过共享内存区获取来自用户态程序的补丁,然后,对补丁进行校验,并在校验成功后,在内核内存区内为补丁申请内存,接着,根据补丁自带的符号表和内核符号表,对内核符号进行重定义,最后,刷新已申请的内存,并运行补丁的初始化函数,使得补丁加载到刷新后的已申请的内存中。可见,在本发明实施例中,对于补丁的内核加载并不以来于lkm,而是采用一套新的内核加载方法来将补丁加载到内核中,如此,可以对内核漏洞进行热修补,而不依赖于内核配置。基于同一发明构思,本发明实施例提供一种补丁的内核加载装置,如图4所示,该加载装置400,包括:获取单元401,用于通过共享内存区获取来自用户态程序的补丁;校验单元402,用于对补丁进行校验;申请单元403,用于在校验成功后,在内核内存区内为补丁申请内存;重定义单元404,用于根据补丁自带的符号表和内核符号表,对内核符号进行重定义;执行单元405,用于刷新已申请的内存,并运行补丁的初始化函数,使得补丁加载到刷新后的已申请的内存中。在本发明实施例中,校验单元,用于根据补丁的标识,检测补丁是否已经加载;当检测出补丁未加载时,对补丁进行签名校验;在签名校验成功后,对补丁进行解密,获取补丁自带的符号表;根据符号表,验证补丁内核的md5和内核中值是否一致,其中,若一致,则执行加载,反之,则结束加载。在本发明实施例中,校验单元,还用于在验证补丁内核的md5和内核中值是否一致之后,方法还包括:在检验补丁内核的md5和内核中值一致后,校验补丁是否符合可执行与可链接格式elf。在本发明实施例中,申请单元,用于为补丁申请内存,并从共享内存区中将补丁的内容拷贝至已申请的内存;找到加载模块所有节区地址,并初始化模块对象相关指针;为节区pcup分配空间。在本发明实施例中,重定义单元,用于查找系统符号表,校验补丁自带的符号表于系统符号表是否一致;如果一致,对重定义节区做重定义操作。在本发明实施例中,执行单元,用于刷新已申请的内存,将补丁加入补丁列表;运行补丁的初始化函数,并清理临时内存。这里需要指出的是,以上内核加载装置实施例的描述,与上述加载方法实施例的描述是类似的,具有同加载方法实施例相似的有益效果。对于本发明内核加载装置实施例中未披露的技术细节,请参照本发明加载方法实施例的描述而理解。基于同一发明构思,本发明实施例提供一种内核加载引擎,包括:存储器和处理器,其中,存储其中存储有一个或者多个程序指令,处理器执行程序指令以实现如前述实施例任一项所述的方法步骤。基于同一发明构思,本发明实施例提供一种可读存储介质上存储有程序,程序被处理器执行时实现如前述实施例任一项所述的方法步骤。本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1