内核修复方法和装置转让专利

申请号 : CN201910363099.4

文献号 : CN110110522A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张煜龙包沉浮韦韬

申请人 : 百度在线网络技术(北京)有限公司

摘要 :

本申请公开了内核修复方法和装置。所述方法的一具体实施方式包括:加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的;使用内存安全语言引擎执行所述补丁;接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;执行所请求的修复用接口以修复所述目标函数。实现了内核的热修补与安全性。

权利要求 :

1.一种内核修复方法,其特征在于,所述方法包括:

加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,所述内核中预先植入有热修补框架;

使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;

接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;

执行所请求的修复用接口以修复所述目标函数。

2.根据权利要求1所述的方法,其特征在于,所述执行所请求的修复用接口以修复所述目标函数,包括:在所述目标函数的起始位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查函数的入口参数是否异常。

3.根据权利要求1所述的方法,其特征在于,所述执行所请求的修复用接口以修复所述目标函数:对于所述目标函数调用的函数,在函数的起始位置插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态和/或函数的入口参数是否异常。

4.根据权利要求1所述的方法,其特征在于,所述执行所请求的修复用接口以修复所述目标函数:对于所述目标函数调用的函数,在函数中返回指令前的位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态是否异常。

5.根据权利要求3或4所述的方法,其特征在于,在所述插入对所述补丁提供的检查函数的调用之前,所述执行所请求的修复用接口以修复所述目标函数还包括:确定所述目标函数调用的函数是返回值为执行结果状态的函数。

6.根据权利要求1所述的方法,其特征在于,在所述加载用于对内核中待修复的目标函数进行修复的补丁之前,所述方法还包括:对所述补丁进行签名验证,以确定所述补丁的合法性。

7.根据权利要求1所述的方法,其特征在于,所述热修补框架包括补丁管理模块、补丁执行模块和补丁修复模块;以及所述补丁管理模块加载用于对内核中待修复的目标函数进行修复的补丁;

所述补丁执行模块使用内存安全语言引擎执行上述补丁,以及接收执行补丁过程中调用修复用接口对目标函数进行修复的调用请求;

所述补丁修复模块执行所请求的修复用接口以修复目标函数。

8.根据权利要求6所述的方法,其特征在于,所述热修补框架还包括签名验证模块;以及所述签名验证模块对内核中待修复的目标函数进行修复的补丁之前,对所述补丁进行签名验证,以确定所述补丁的合法性。

9.根据权利要求1所述的方法,其特征在于,所述热修补框架进一步被配置成对补丁执行至少一项功能:加载、执行、停止、卸载、运行状态监控、执行日志记录、限制策略控制。

10.根据权利要求1所述的方法,其特征在于,所述修复用接口通过所述热修补框架的限制策略控制功能进行维护。

11.根据权利要求1所述的方法,其特征在于,所述热修补框架通过以下任一方式植入内核:通过利用已有内核漏洞植入、通过设备厂商预置或动态装载植入;

其中,内核所在的操作系统安装于设备厂商生产的设备中,所述设备包括以下至少一项:智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机、台式计算机。

12.一种内核修复装置,其特征在于,所述装置包括:加载单元,用于加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,所述内核中预先植入有热修补框架;

执行单元,用于使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;

接收单元,用于接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;

修复单元,用于执行所请求的修复用接口以修复所述目标函数。

13.根据权利要求12所述的装置,其特征在于,所述修复单元进一步用于:在所述目标函数的起始位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查函数的入口参数是否异常。

14.根据权利要求12所述的装置,其特征在于,所述修复单元进一步用于:对于所述目标函数调用的函数,在函数的起始位置插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态和/或函数的入口参数是否异常。

15.根据权利要求12所述的装置,其特征在于,所述修复单元进一步用于:对于所述目标函数调用的函数,在函数中返回指令前的位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态是否异常。

16.根据权利要求14或15所述的装置,其特征在于,所述修复单元还用于:在所述插入对所述补丁提供的检查函数的调用之前,确定所述目标函数调用的函数是返回值为执行结果状态的函数。

17.根据权利要求12所述的装置,其特征在于,所述装置还包括:验证单元,用于在所述加载用于对内核中待修复的目标函数进行修复的补丁之前,对所述补丁进行签名验证,以确定所述补丁的合法性。

18.根据权利要求12所述的装置,其特征在于,所述热修补框架包括补丁管理模块、补丁执行模块和补丁修复模块;以及所述加载单元,用于利用所述补丁管理模块加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,所述内核中预先植入有热修补框架;

执行单元,用于利用所述补丁执行模块使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;

接收单元,用于利用所述补丁执行模块接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;

修复单元,用于利用所述补丁修复模块执行所请求的修复用接口以修复所述目标函数。

19.根据权利要求17所述的装置,其特征在于,所述热修补框架还包括签名验证模块;

以及

所述加载单元,用于利用所述签名验证模块对内核中待修复的目标函数进行修复的补丁之前,对所述补丁进行签名验证,以确定所述补丁的合法性。

20.根据权利要求12所述的装置,其特征在于,所述热修补框架进一步被配置成对补丁执行至少一项功能:加载、执行、停止、卸载、运行状态监控、执行日志记录、限制策略控制。

21.根据权利要求12所述的装置,其特征在于,所述修复用接口通过所述热修补框架的限制策略控制功能进行维护。

22.根据权利要求12所述的装置,其特征在于,所述热修补框架通过以下任一方式植入内核:通过利用已有内核漏洞植入、通过设备厂商预置或动态装载植入;

其中,内核所在的操作系统安装于设备厂商生产的设备中,所述设备包括以下至少一项:智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机、台式计算机。

说明书 :

内核修复方法和装置

[0001] 本申请为申请号为CN201610350050.1、申请日为2016年5月24日、发明名称为“内核修复方法和装置”的中国专利申请的分案申请。

技术领域

[0002] 本申请涉及计算机技术领域,具体涉及信息安全领域,尤其涉及内核修复方法和装置。

背景技术

[0003] 内核漏洞是安卓设备所面临的一个技术问题。目前,尽管大量内核漏洞已被公开,但依然有很多安卓设备得不到及时的更新。黑色产业利用这些漏洞可以攻破设备中设置的加密、指纹、数据隔离等几乎所有的安全保护机制。手机厂商无法像具备安全能力的第三方厂商那样集中力量发现与修复内核漏洞,因此仅仅依赖手机厂商是很难解决这一问题。另外,安卓产业链非常长,内核补丁在通过一系列审核测试后才能到达用户设备,为时已晚。因此,需要让有安全能力的厂商一起和产业链上其他环节的厂商进行合作。
[0004] 然而,安全厂商很难拿到设备源码,也很难对市面上成千上万种设备进行适配,所以亟需一种灵活的机制允许安全厂商不受平台限制插入修补逻辑。此外,灵活则意味着风险,我们同时需要一种约束机制来局限安全厂商的修补能力,防止任意篡改内核逻辑甚至插入后门。

发明内容

[0005] 本申请的目的在于提出一种改进的内核修复方法和装置,来解决以上背景技术部分提到的技术问题。
[0006] 第一方面,本申请提供了一种内核修复方法,所述方法包括:加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,内核中预先植入有热修补框架;使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;执行所请求的修复用接口以修复所述目标函数。
[0007] 在一些实施例中,所述执行所请求的修复用接口以修复所述目标函数,包括:在所述目标函数的起始位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查函数的入口参数是否异常。
[0008] 在一些实施例中,所述执行所请求的修复用接口以修复所述目标函数:对于所述目标函数调用的函数,在函数的起始位置插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态和/或函数的入口参数是否异常。
[0009] 在一些实施例中,所述执行所请求的修复用接口以修复所述目标函数:对于所述目标函数调用的函数,在函数中返回指令前的位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态是否异常。
[0010] 在一些实施例中,在所述插入对所述补丁提供的检查函数的调用之前,所述执行所请求的修复用接口以修复所述目标函数还包括:确定所述目标函数调用的函数是返回值为执行结果状态的函数。
[0011] 在一些实施例中,在所述加载用于对内核中待修复的目标函数进行修复的补丁之前,所述方法还包括:对所述补丁进行签名验证,以确定所述补丁的合法性。
[0012] 在一些实施例中,所述热修补框架包括补丁管理模块、补丁执行模块和补丁修复模块;以及所述补丁管理模块加载用于对内核中待修复的目标函数进行修复的补丁;所述补丁执行模块使用内存安全语言引擎执行上述补丁,以及接收执行补丁过程中调用修复用接口对目标函数进行修复的调用请求;所述补丁修复模块执行所请求的修复用接口以修复目标函数。
[0013] 在一些实施例中,所述热修补框架还包括签名验证模块;以及所述签名验证模块对内核中待修复的目标函数进行修复的补丁之前,对所述补丁进行签名验证,以确定所述补丁的合法性。
[0014] 在一些实施例中,所述热修补框架进一步被配置成对补丁执行至少一项功能:加载、执行、停止、卸载、运行状态监控、执行日志记录、限制策略控制。
[0015] 在一些实施例中,所述修复用接口通过所述热修补框架的限制策略控制功能进行维护。
[0016] 在一些实施例中,所述热修补框架通过以下任一方式植入内核:通过利用已有内核漏洞植入、通过设备厂商预置或动态装载植入;其中,内核所在的操作系统安装于设备厂商生产的设备中,所述设备包括以下至少一项:智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机、台式计算机。
[0017] 第二方面,本申请提供了一种内核修复装置,所述装置包括:加载单元,用于加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,所述内核中预先植入有热修补框架;执行单元,用于使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;接收单元,用于接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;修复单元,用于执行所请求的修复用接口以修复所述目标函数。
[0018] 在一些实施例中,所述修复单元进一步用于:在所述目标函数的起始位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查函数的入口参数是否异常。
[0019] 在一些实施例中,所述修复单元进一步用于:对于所述目标函数调用的函数,在函数的起始位置插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态和/或函数的入口参数是否异常。
[0020] 在一些实施例中,所述修复单元进一步用于:对于所述目标函数调用的函数,在函数中返回指令前的位置,插入对所述补丁提供的检查函数的调用,所述检查函数用于检查执行状态是否异常。
[0021] 在一些实施例中,所述修复单元还用于:在所述插入对所述补丁提供的检查函数的调用之前,确定所述目标函数调用的函数是返回值为执行结果状态的函数。
[0022] 在一些实施例中,所述装置还包括:验证单元,用于在所述加载用于对内核中待修复的目标函数进行修复的补丁之前,对所述补丁进行签名验证,以确定所述补丁的合法性。
[0023] 在一些实施例中,所述热修补框架包括补丁管理模块、补丁执行模块和补丁修复模块;以及所述加载单元,用于利用所述补丁管理模块加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,所述内核中预先植入有热修补框架;执行单元,用于利用所述补丁执行模块使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;接收单元,用于利用所述补丁执行模块接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;修复单元,用于利用所述补丁修复模块执行所请求的修复用接口以修复所述目标函数。
[0024] 在一些实施例中,所述热修补框架还包括签名验证模块;以及所述加载单元,用于利用所述签名验证模块对内核中待修复的目标函数进行修复的补丁之前,对所述补丁进行签名验证,以确定所述补丁的合法性。
[0025] 在一些实施例中,所述热修补框架进一步被配置成对补丁执行至少一项功能:加载、执行、停止、卸载、运行状态监控、执行日志记录、限制策略控制。
[0026] 在一些实施例中,所述修复用接口通过所述热修补框架的限制策略控制功能进行维护。
[0027] 在一些实施例中,所述热修补框架通过以下任一方式植入内核:通过利用已有内核漏洞植入、通过设备厂商预置或动态装载植入;其中,内核所在的操作系统安装于设备厂商生产的设备中,所述设备包括以下至少一项:智能手机、平板电脑、电子书阅读器、MP3播放器、MP4播放器、膝上型便携计算机、台式计算机。
[0028] 本申请提供的内核修复方法和装置,通过内存安全语言引擎执行以内存安全语言或非内存安全语言的内存安全语言子集进行编写的补丁,补丁通过调用内存安全语言引擎提供的修复用接口执行相应的修补,使得通过第三方的安全厂商即可以借助这些修复用接口开发用于修复内核漏洞的补丁,无须考虑适配问题。同时,该方法也尽可能地限制补丁执行时的权限,防止非法人员通过执行补丁任意篡改内核逻辑甚至插入后门,从而实现了内核修补的安全性。

附图说明

[0029] 通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
[0030] 图1是本申请可以应用于其中的示例性系统架构图;
[0031] 图2是根据本申请的内核修复方法的一个实施例的流程图;
[0032] 图3是根据本申请的内核修复方法的又一个实施例的流程图;
[0033] 图4是根据本申请的内核修复装置的一个实施例的结构示意图;
[0034] 图5是适于用来实现本申请实施例的终端设备或服务器的计算机系统的结构示意图。

具体实施方式

[0035] 下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
[0036] 需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
[0037] 图1示出了可以应用本申请的内核修复方法或内核修复装置的实施例的示例性系统架构100。
[0038] 如图1所示,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
[0039] 用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如网页浏览器应用、购物类应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。
[0040] 终端设备101、102、103可以是具有操作系统的各种电子设备,包括但不限于智能手机、平板电脑、电子书阅读器、MP3播放器(Moving Picture Experts Group Audio Layer III,动态影像专家压缩标准音频层面3)、MP4(Moving Picture Experts Group Audio Layer IV,动态影像专家压缩标准音频层面4)播放器、膝上型便携计算机和台式计算机等等。上述操作系统包括但不限于安卓操作系统、Linux操作系统。
[0041] 服务器105可以是提供各种服务的服务器,例如对终端设备101、102、103上所加载的内核补丁提供支持的补丁服务器。补丁服务器可以响应于终端设备101、102、103发送的补丁获取请求,给终端设备101、102、103分发相应的补丁。
[0042] 需要说明的是,本申请实施例所提供的内核修复方法一般由终端设备101、102、103执行,相应地,内核修复装置一般设置于终端设备101、102、103中。
[0043] 应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
[0044] 继续参考图2,示出了根据本申请的内核修复方法的一个实施例的流程200。所述的内核修复方法,包括以下步骤:
[0045] 步骤201,加载用于对内核中待修复的目标函数进行修复的补丁。
[0046] 在本实施例中,内核修复方法运行于其上的电子设备(例如图1所示的终端设备)可以在接收到内核修复的操作请求时,加载用于对内核中待修复的目标函数进行修复的补丁。该补丁可以是预先存储在终端设备本地的,也可以是通过有线连接方式或者无线连接方式从服务器获取到的。上述内核通常可以是Linux等各种操作系统的内核。
[0047] 电子设备的操作系统内核中可以预先植入有用于对补丁执行各种功能的内核热修补框架,该内核热修补框架的植入的方式包括但不限于通过利用已有内核漏洞植入内核、通过手机厂商预置或动态装载植入内核。该热修补框架可以包括多个模块,例如补丁管理模块、补丁执行模块和补丁修复模块。其中,不同的模块可以用于执行不同的步骤。例如,补丁管理模块可以执行步骤201,补丁执行模块可以执行步骤202~203,补丁修复模块执行步骤204。该热修补框架对补丁执行的功能包括但不限于:加载、执行、停止、卸载、运行状态监控、执行日志记录、限制策略控制。
[0048] 需要说明的,上述补丁可以是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的。内存安全语言或非内存安全语言的内存安全语言子集可以是能够避免各类内存错误的语言,内存错误包括但不限于:数组越界、缓冲区溢出、引用空指针、使用未初始化内存、使用或释放已释放的指针或无效、未分配的指针、堆栈耗尽时试图分配更多内存以及在堆栈空间不足时分配超额内存。
[0049] 步骤202,使用内存安全语言引擎执行上述补丁。
[0050] 在本实施例中,电子设备在内核中设置有内存安全语言引擎,该内存安全语言引擎可用于解释执行或编译对以内存安全语言或非内存安全语言的内存安全语言子集进行编写的代码。内存安全语言引擎在执行以内存安全语言或非内存安全语言的内存安全语言子集进行编写的代码时,可以将代码的能力限制在设定的范围内,从而减小安全风险。上述内存安全语言引擎包括但不限于Lua、Luajit等语言引擎。该内存安全语言引擎可以作为上述热修补框架的一个模块存在。在基于步骤201对补丁进行加载后,电子设备可以通过内核中的内存安全语言引擎执行该补丁。
[0051] 可选的,上述内存安全语言引擎可以选用Lua。Lua语言简洁、轻量,以Lua编写的代码很容易和C/C++语言进行互调,很适合集成在内核里。另外Lua虚拟机也能对补丁代码的执行进行限制,使得补丁代码只允许调用Lua引擎所提供的C接口,防止漏洞、后门、攻击逻辑的威胁。
[0052] 步骤203,接收执行补丁过程中调用修复用接口对目标函数进行修复的调用请求。
[0053] 在本实施例中,上述内存安全语言引擎提供了一些修复用接口,这些接口供外部程序进行调用来实现对内核中的函数进行修复的功能。可选的,这些修复用接口可以通过上述热修补框架的限制策略控制功能进行维护。上述补丁中包括调用上述修复用接口的代码,因此上述补丁在执行时可以发起对修复用调用接口的调用请求,从而可以使得电子设备的内存安全语言引擎接收到该调用请求。通常,修复用接口的内部实现具有对内核中的函数中的汇编指令进行操作的权限,这些内部实现封装成能力接口对外提供。补丁中的代码只能通过调用这些能力接口实现,不能直接对内核中的函数进行直接操作,从而实现了对补丁的权限控制。
[0054] 步骤204,执行所请求的修复用接口以修复目标函数。
[0055] 在本实施例中,基于步骤203所接收到的、对修复用调用接口的调用请求,电子设备的内存安全语言引擎可以通过执行所请求的修复用接口对目标函数进行修复。执行修复用接口,即是对修复用接口所对应的函数实现进行执行。该函数实现的具体内容可以是对目标函数执行预设的操作,以对目标函数进行修复。可选的,修复用接口所执行的操作包括但不限于:在目标函数的指定位置插入汇编指令或插入对内存安全语言所写的函数的调用、在目标函数的指定位置修改汇编指令或将原始汇编指令替换成对内存安全语言所写的函数的调用、对设定的调用进行挂钩、对设定的函数实现进行替换。
[0056] 在本实施例的一些可选实现方式中,步骤204在执行一些修复用接口时,可以具体以如下方式实现:在目标函数的起始位置,插入对补丁提供的检查函数的调用,该检查函数可以用于检查目标函数的输入参数是否异常。在本实现方式中,以内存安全语言或非内存安全语言的内存安全语言子集进行编写的上述补丁,提供有在修复过程中用到的检查函数,该检查函数的函数名可以作为调用请求的参数。如此,电子设备可以根据函数名确定所需要调用的检查函数,从而得以顺利在目标函数的起始位置,插入对补丁提供的检查函数的调用。通过回调机制,修复后的目标函数在执行时可调用该检查函数。通常,当检查函数执行时,可以生成用于表征是否存在异常的检查结果,该检查结果可用于指示是否执行目标函数的后续过程。根据检查结果确定是否执行目标函数的后续过程可以通过各种机制实现。例如,检查函数可以负责将该检查结果返回至目标函数,以使目标函数中通过中的语句通过判断检查结果确定是否目标函数的后续过程。又例如,检查函数也可以在确定检查结果指示出现异常时,通过调用内存安全语言提供的、用于终止函数执行的接口,直接从目标函数中跳出到调用该目标函数的函数处,同时还可以将指示异常的检查结果返回给该函数。根据检查结果确定是否执行目标函数的后续过程的方式不限于以上所列出的。
[0057] 以内存安全语言引擎选用Lua为例,对该实现方式进行举例说明。修复用接口在执行内核修复功能时,可以在Lua补丁声明的存在漏洞的目标函数入口处插入回调。修复后的目标函数一旦执行到此,便会调用Lua补丁所实现的检查函数,并将目标内核函数的参数传给该检查函数。检查函数可对输入参数进行检查,返回正常(比如返回0)或异常(比如返回-1)两个值,如果正常,则目标函数照常执行,否则终止目标函数执行,返回异常给目标函数调用者。更具体的,上述插入对检查函数的调用的过程可以通过如下方式实现:首先可以将目标函数的入口处替换成跳转到跳转函数的跳转指令。跳转函数首先负责在跳转后保存现场,所保存的信息包括但不限于寄存器状态、堆栈信息等。接着,跳转函数调用Lua补丁里实现的检查函数,在调用时传入目标函数的入口参数。之后,跳转函数负责在检查函数返回检查结果时恢复现场。如果检查函数返回结果正常,则继续执行目标函数的后续指令,否则中断目标函数的执行。
[0058] 在该实现方式中,通过执行一些修复用接口,可以在目标函数的起始位置处插入用于对目标函数的输入参数是否异常的检查函数的调用,在执行修复后的目标函数时,可以利用检查函数及时对目标函数的入口参数进行检查,以防目标函数的入口参数出现异常而导致执行目标函数时出现信息泄露等风险,实现漏洞修复。
[0059] 在本实施例的一些实现方式中,步骤204在执行一些修复用接口时,可以通过如下方式执行:对于目标函数调用的函数,在函数的起始位置插入对补丁提供的检查函数的调用,该检查函数用于检查执行状态和/或函数的入口参数是否异常。
[0060] 由于目标函数存在漏洞的部分除了存在于起始位置外,还可能存在于其他位置,尤其是在调用其他函数的过程中。对于被调用函数,通常在其入口处会由于入口参数或者执行状态异常而导致目标函数的后续过程出现安全风险。因此,这些修复用接口的功能可以是在被调用函数的起始位置的位置插入对上述补丁提供的检查函数的调用,从而实现对相应的数据进行异常检查。通过与前述实现方式中相同的方法,即可根据该检查函数生成的检查结果决定是否执行目标函数中的后续过程,这里不再赘述。
[0061] 在本实施例的一些实现方式中,步骤204在执行一些修复用接口时,可以通过如下方式执行:对于目标函数调用的函数,在函数中返回指令前的位置,插入对补丁提供的检查函数的调用,检查函数用于检查执行状态是否异常。被目标函数调用的函数也可能在返回执行结果时出现异常,因此这些修复用接口的功能可以是在被调用函数中返回指令前的位置处插入对上述补丁提供的检查函数的调用,从而使得执行修复后的目标函数时能对函数返回前的执行状态是否异常进行检查,以防安全风险。
[0062] 在前述两种实现方式的一些可选实现方式中,步骤404在插入对补丁提供的检查函数的调用之前,还包括:确定目标函数调用的函数是返回值为执行结果状态的函数。在本实施例中,在目标函数中所调用的各个函数中,上述修复用接口所操作的对象限于返回值为执行结果状态的函数。只有返回值为执行结果状态的函数,才允许修复用接口插入对补丁所提供的检查函数的调用,而返回值为普通数值的被调用函数则不允许插入对外部补丁中检查函数的调用,从而防止补丁中的代码通过操作返回值造成内核的安全风险。因此,该实现方式可以进一步提高安全性。
[0063] 同样以上述内存安全语言引擎选用Lua为例对该实现方式进行说明。执行一些修复用接口时,可以是在Lua补丁声明的存在漏洞的目标内核函数中,对返回值为执行结果状态的函数的调用进行挂钩/替换,在其入口或返回前调用Lua补丁所实现的检查函数检查其状态,返回正常(比如返回0)或异常(比如返回-1)两个值。返回值还可以直接返回给目标函数的调用者。具体实现与前述实现基本一致,这里不再赘述。
[0064] 本申请的上述实施例提供的方法,通过内存安全语言引擎执行以内存安全语言或非内存安全语言的内存安全语言子集进行编写的补丁,补丁通过调用内存安全语言引擎提供的修复用接口执行相应的修补,使得通过第三方的安全厂商即可以借助这些修复用接口开发用于修复内核漏洞的补丁,无须考虑适配问题。同时,该方法也尽可能地限制补丁执行时的权限,防止非法人员通过执行补丁任意篡改内核逻辑甚至插入后门,从而实现了内核修补的安全性。
[0065] 进一步参考图3,其示出了内核修复方法的又一个实施例的流程300。该内核修复方法的流程300,包括以下步骤:
[0066] 步骤301,对补丁进行签名验证,以确定补丁的合法性。
[0067] 在本实施例中,在加载补丁前,电子设备可以首先对补丁进行签名验证。该步骤中的签名通常是数字签名,数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。
[0068] 通过对补丁的签名进行验证,可以判断补丁的完整性和来源可靠性。在验证通过后,方可执行后续步骤。在补丁未签名、用不可信证书签名以及补丁内容与签名不一致等情况,则验证不通过,可以弃用相应的补丁。通过对签名的验证,可以确保后续加载的补丁具有合法性。本实施例中,热修补框架还可以包括签名验证模块,该签名验证模块可以执行步骤301。
[0069] 步骤302,加载用于对内核中待修复的目标函数进行修复的补丁。
[0070] 在本实施例中,步骤302的具体操作可以参考图2对应实施例的步骤201,这里不再赘述。
[0071] 步骤303,使用内存安全语言引擎执行补丁。
[0072] 在本实施例中,步骤303的具体操作可以参考图2对应实施例的步骤202,这里不再赘述。
[0073] 步骤304,接收执行补丁过程中调用修复用接口对目标函数进行修复的调用请求。
[0074] 在本实施例中,步骤304的具体操作可以参考图2对应实施例的步骤203,这里不再赘述。
[0075] 步骤305,执行所请求的修复用接口以修复目标函数。
[0076] 在本实施例中,步骤305的具体操作可以参考图2对应实施例的步骤204,这里不再赘述。
[0077] 从图3中可以看出,与图2对应的实施例相比,本实施例中的内核修复方法的流程300突出了对补丁的签名验证,从而确保后续加载并执行的补丁具有合法性,进一步降低安全隐患。
[0078] 进一步参考图4,作为对上述各图所示方法的实现,本申请提供了一种内核修复装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
[0079] 如图4所示,本实施例所述的内核修复装置400包括:加载单元401、执行单元402、接收单元403和修复单元404。其中,加载单元401用于加载用于对内核中待修复的目标函数进行修复的补丁,补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,内核中预先植入有热修补框架;执行单元402用于使用内存安全语言引擎执行补丁,内存安全语言引擎存在于所述热修补框架中;接收单元403用于接收执行补丁过程中调用修复用接口对目标函数进行修复的调用请求,其中,修复用接口是内存安全语言引擎所提供的、用于对函数进行修复的接口;而修复单元404用于执行所请求的修复用接口以修复目标函数。
[0080] 在本实施例中,内核修复装置400的加载单元401、执行单元402、接收单元403和修复单元404的具体操作可以参考图2对应的实现方式,这里不再赘述。
[0081] 在本实施例的一些可选实现方式中,修复单元404进一步用于:在目标函数的起始位置,插入对补丁提供的检查函数的调用,检查函数用于检查函数的入口参数是否异常。该实现方式的具体处理可以参考图2对应实施例中相应的实现方式,这里不再赘述。
[0082] 在本实施例的一些可选实现方式中,修复单元404进一步用于:对于目标函数调用的函数,在函数的起始位置插入对补丁提供的检查函数的调用,检查函数用于检查执行状态和/或函数的入口参数是否异常。该实现方式的具体处理可以参考图2对应实施例中相应的实现方式,这里不再赘述。
[0083] 在本实施例的一些可选实现方式中,修复单元404进一步用于:对于目标函数调用的函数,在函数中返回指令前的位置,插入对补丁提供的检查函数的调用,检查函数用于检查执行状态是否异常。该实现方式的具体处理可以参考图2对应实施例中相应的实现方式,这里不再赘述。
[0084] 在本实施例的一些可选实现方式中,修复单元404还用于:在插入对补丁提供的检查函数的调用之前,确定目标函数调用的函数是返回值为执行结果状态的函数。该实现方式的具体处理可以参考图2对应实施例中相应的实现方式,这里不再赘述。
[0085] 在本实施例的一些可选实现方式中,内核修复装置400还包括:验证单元(未示出),用于在加载用于对内核中待修复的目标函数进行修复的补丁之前,对补丁进行签名验证,以确定补丁的合法性。该实现方式的具体处理可以参考图3对应实施例中的步骤301,这里不再赘述。
[0086] 下面参考图5,其示出了适于用来实现本申请实施例的终端设备或服务器的计算机系统500的结构示意图。
[0087] 如图5所示,计算机系统500包括中央处理单元(CPU)501,其可以根据存储在只读存储器(ROM)502中的程序或者从存储部分508加载到随机访问存储器(RAM)503中的程序而执行各种适当的动作和处理。在RAM 503中,还存储有系统500操作所需的各种程序和数据。CPU 501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口505也连接至总线504。
[0088] 以下部件连接至I/O接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至I/O接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器510上,以便于从其上读出的计算机程序根据需要被安装入存储部分508。
[0089] 特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括有形地包含在机器可读介质上的计算机程序,所述计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分509从网络上被下载和安装,和/或从可拆卸介质511被安装。
[0090] 附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0091] 描述于本申请实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例如,可以描述为:一种处理器包括加载单元、执行单元、接收单元和修复单元。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,加载单元还可以被描述为“加载用于对内核中待修复的目标函数进行修复的补丁的单元”。
[0092] 作为另一方面,本申请还提供了一种非易失性计算机存储介质,该非易失性计算机存储介质可以是上述实施例中所述装置中所包含的非易失性计算机存储介质;也可以是单独存在,未装配入终端中的非易失性计算机存储介质。上述非易失性计算机存储介质存储有一个或者多个程序,当所述一个或者多个程序被一个设备执行时,使得所述设备:加载用于对内核中待修复的目标函数进行修复的补丁,所述补丁是以内存安全语言或非内存安全语言的内存安全语言子集进行编写的,所述内核中预先植入有热修补框架;使用内存安全语言引擎执行所述补丁,所述内存安全语言引擎存在于所述热修补框架中;接收执行所述补丁过程中调用修复用接口对所述目标函数进行修复的调用请求,其中,修复用接口是所述内存安全语言引擎所提供的、用于对函数进行修复的接口;执行所请求的修复用接口以修复所述目标函数。
[0093] 以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。