内核钩子函数保护方法、装置、设备以及存储介质与流程

文档序号:17082379发布日期:2019-03-09 00:25阅读:375来源:国知局
内核钩子函数保护方法、装置、设备以及存储介质与流程

本发明涉及计算机安全技术领域,尤其涉及一种内核钩子函数保护方法、装置、设备以及存储介质。



背景技术:

目前,计算机安全受到越来越多的关注。由于计算机系统是复杂的软硬件系统,漏洞的存在几乎是不可避免的,针对各种漏洞的攻击行为为计算机系统带来很大的安全隐患。

其中,内核钩子函数攻击就是攻击者利用size漏洞覆盖内核中钩子函数结构中的钩子函数指针,从而导致恶意代码被执行引发提权。全反夹式(full-nelson)攻击就是一种典型内核钩子函数攻击,通过改变堆上的内核控制依赖数据(函数钩子),劫持了内核控制流,进而调用敏感函数完成提权攻击。目前,已有的内核钩子函数保护方法大致有3种,包括:基于纯软件的hookscout、基于虚拟机技术的hooksafe和利用英特尔(intel)管态模式访问保护机制smap(supervisormodeaccessprevention)的基于硬件的内核钩子函数保护方法。

但是,现有技术针对内核钩子函数的保护方法存在保护方法系统开销大、保护不完备和易于被绕开的缺点。



技术实现要素:

本发明提供一种内核钩子函数保护方法、装置、设备以及存储介质,拟克服现有技术中保护方法系统开销大、保护不完备和易于被绕开的缺点。

第一方面,本发明提供一种内核钩子函数的保护方法,包括:

接收访存指令;其中,所述访存指令用于对钩子函数执行访存操作,且所述访存指令中包含访存信息;

根据所述访存信息和内存访问控制区域,对所述访存指令进行检测,判断所述访存指令为非正常访问指令或者正常访问指令;所述内存访问控制区域为预先配置的存储区域,且所述内存访问控制区域用于存储所述钩子函数的指针;

若所述访存指令是非正常访问指令,则对所述访存指令进行报警。

进一步的,所述方法还包括:

若所述访存指令是正常访问指令,则获取所述内存访问控制区域中存储的所述钩子函数的指针;

根据获取的所述钩子函数的指针,对所述钩子函数进行访问。

在一种具体的实现方式中,所述访存指令的信息包括:所述访存指令的操作码和要访存的地址,则根据所述访存信息和内存访问控制区域,对所述访存指令进行检测,判断所述访存指令为非正常访问指令或者正常访问指令,包括:

若所述地址在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令是预设指令,则所述访存指令为正常访问指令;

若所述地址不在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令是预设指令,则所述访存指令为非正常访问指令;

若所述地址在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令不是预设指令,则所述访存指令为非正常访问指令。

具体的,所述预设指令包括特定读指令和特定写指令。

具体的,接收访存指令之前,所述方法还包括:

配置所述内存访问控制区域;

在所述内存访问控制区域内分配预设大小的空间,并将钩子函数的指针存储在所述内存访问控制区域内分配的空间中,生成空间指针;其中,所述空间指针为指向所述内存访问控制区域内为所述钩子函数分配的空间的指针;

在所述钩子函数的结构体中存入空间指针。

第二方面,本发明提供一种内核钩子函数的保护装置,包括:

接收模块,用于接收访存指令;其中,所述访存指令用于对钩子函数执行访存操作,且所述访存指令中包含访存信息;

判断模块,用于根据所述访存信息和内存访问控制区域,对所述访存指令进行检测,判断所述访存指令为非正常访问指令或者正常访问指令;所述内存访问控制区域为预先配置的存储区域,且所述内存访问控制区域用于存储所述钩子函数的指针;

处理模块,用于若所述访存指令是非正常访问指令,则对所述访存指令进行报警。

在一种具体的实现方式中,所述处理模块还用于:

若所述访存指令是正常访问指令,则获取所述内存访问控制区域中存储的所述钩子函数的指针;

根据获取的所述钩子函数的指针,对所述钩子函数进行访问。

具体的,所述访存指令的信息包括:所述访存指令的操作码和要访存的地址,则所述判断模块具体用于:

若所述地址在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令是预设指令,则所述访存指令为正常访问指令;

若所述地址不在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令是预设指令,则所述访存指令为非正常访问指令;

若所述地址在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令不是预设指令,则所述访存指令为非正常访问指令。

具体的,所述预设指令包括特定读指令和特定写指令。

在一种具体的实现方式中,所述接收访存指令之前,所述处理模块还用于:

配置所述内存访问控制区域;

在所述内存访问控制区域内分配预设大小的空间,并将钩子函数的指针存储在所述内存访问控制区域内分配的空间中,生成空间指针;其中,所述空间指针为指向所述内存访问控制区域内为所述钩子函数分配的空间的指针;

在所述钩子函数的结构体中存入空间指针。

第三方面,本发明提供一种电子设备,包括:存储器、处理器、以及计算机程序,所述计算机程序存储在所述存储器中,所述处理器运行所述计算机程序执行第一方面所述的内核钩子函数的保护方法。

第四方面,本发明提供一种存储介质,包括:可读存储介质和计算机程序,所述计算机程序用于实现第一方面所述的内核钩子函数的保护方法。

本发明实施例提供的一种内核钩子函数的保护方法、装置、电子设备和存储介质,根据对钩子函数的访存指令的信息对访存指令进行检测,确定访存指令为非正常访问指令或者正常访问指令,若访存指令是非正常访问指令,则对访存指令进行报警,实现了通过内存访问控制区域的判断,检测出对内核钩子函数的攻击,能够完整的保护内核钩子函数且难以被绕开,不管攻击者修改钩子函数指向用户空间或者内核代码都能检测出来。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。

图1为本发明实施例提供的一种内核钩子函数的保护方法实施例一的流程示意图;

图2为本发明实施例提供的一种内核钩子函数保护方法实施例二的流程示意图;

图3为本发明实施例提供的一种内核钩子函数的保护方法实施例三的流程示意图;

图4为本发明实施例提供的一种处理器中支持内存访问控制区域的硬件模块设计示意图;

图5为本发明实施例提供的一种内存访问控制区域的访问检测模块的控制逻辑的流程图;

图6为本发明实施例提供的一种内核钩子函数攻击检测流程;

图7为本发明实施例提供的一种内核钩子函数的保护装置的结构示意图;

图8为本发明实施例提供的电子设备的硬件结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

现有技术中,对内核钩子函数的保护方法主要有基于纯软件的、基于虚拟机监视器和基于硬件的三种方法。现有基于纯软件的、基于虚拟机监视器的保护方法主要采用动态收集所有钩子函数的保存位置和钩子函数的合法目标地址,配置动态监控引擎,对钩子函数的保存位置和合法目标地址进行监控。动态监控引擎可以检查对钩子函数进行访存的访存指令所包含的地址是否合法,从而判断钩子函数是否受到攻击。然而,采用动态收集钩子函数保存位置和合法目标地址的方法,收集到的集合很可能不是完整的。同时,动态监控引擎可能会被绕过或者误导,并且,内核中对钩子函数的访问都需要重新定位,并进行相应正确性检查,这些操作导致系统开销较大,对系统性能有较大影响。现有的基于硬件的钩子函数保护方法,是利用intel管态模式访问保护机制使得处于内核态的代码不能够访问或者执行用户空间的数据或者代码,可以用来防御钩子函数攻击。但是也存在保护不完整、可能会被绕过、支持范围小的缺陷。

为克服现有技术的问题,本方案提出一种软件硬件配合的基于内存访问控制区域的内核钩子函数保护方法,可以实现对内核钩子函数的保护。通过软硬件配合来实现内存访问控制区域,将钩子函数指针统一存放到内存访问控制区域,所有对该内存访问控制区域的非正常访问将被检测出来进行攻击报警,从而实现对内核钩子函数的保护;并且本方案设计了专门的硬件支持,相比于软件或者基于虚拟机技术的钩子函数保护方法而言,具有难以绕开的优点。另外,由于本发明主要依赖硬件来进行动态内核钩子函数的攻击检测,具有高性能的特点。本发明能够完整地保护内核钩子函数,不管攻击者修改钩子函数指向用户空间或者内核代码都能检测出来。

下面通过几个具体实施例对该方案进行详细说明。

实施例一:

图1为本发明实施例提供的一种内核钩子函数的保护方法实施例一的流程示意图,如图1所示,内核钩子函数的保护方法的流程示意图可以包括:

s101:接收访存指令。

其中,该访存指令用于对钩子函数执行访存操作,该访存操作包括读操作和写操作。在一种具体的实现方式中,访存信息包括操作码和访存的地址;操作码为预先设置的指示访存指令类型的标识信息;该访存的地址为物理地址或者虚拟地址,较佳的,访存的地址为虚拟地址,以下均以虚拟地址为例进行方案的阐述。

s102:根据上述访存信息和内存访问控制区域,对访存指令进行检测,判断该访存指令为非正常访问指令或者正常访问指令。

在本步骤中,应理解,在执行访问指令之前,需先判断该访存指令是正常访问指令还是非正常访问指令,通过判断识别出对钩子函数有攻击意图的访存指令。

具体的,根据接收到的对钩子函数的访存指令,获取访存信息;并根据该访存信息,确定访存的虚拟地址和操作码;通过判断访存的虚拟地址是否在内存访问控制区域内及根据操作码判断是否为预设指令,确定访存指令为非正常访问指令或者正常访问指令。其中,上述访存指令目的为访问内核钩子函数;上述访存的虚拟地址为访存指令所要访问的目的地址。

具体的,如果访存信息中访存的虚拟地址在内存访问控制区域内,且根据操作码确定访存指令是预设指令,则访存指令为正常访问指令,并且该访存指令为钩子函数的访问指令。

具体的,如果访存信息中访存的虚拟地址在内存访问控制区域内,且根据操作码确定访存指令不是预设指令,则访存指令为非正常访问指令。

或者,如果访存信息中的虚拟地址不在内存访问控制区域内,且根据操作码确定访存指令是预设指令,则访存指令为非正常访问指令。

可选的,如果访存信息中访存的虚拟地址不在内存访问控制区域内,且根据操作码确定访存指令不是预设指令,则访存指令为正常访问指令,但该访存指令可判断为一个非内核钩子函数的普通访存指令。

此处,应理解,上述预设指令即为特定读写指令,包括特定读指令和特定写指令。两类指令只允许访问内存访问控制区域,不能访问其他内存区域,否则报错。

具体的,内存访问控制区域是在内存中配置的一块限制访问存储区域,用来存放内核钩子函数的指针,对该区域只允许采用特定读写指令进行访问;内存访问控制区域为一段连续的地址空间,相应的,根据内存访问控制区域,对访存指令进行检测即是指根据内存访问控制区域的地址空间,对访存指令进行检测;具体的,访存信息中访存的虚拟地址在内存访问控制区域内是指访存的虚拟地址落入内存访问控制区域对应的地址空间之内,而访存的虚拟地址不在内存访问控制区域内是指访存的虚拟地址没有落入内存访问控制区域对应的地址空间内。

s103:若访存指令是非正常访问指令,则对访存指令进行报警。

在一种具体的实现方式中,若访存指令为非正常访问指令,则表明内核钩子函数受到攻击,此时,拒绝执行该访存指令并执行攻击报警操作。报警的具体方式可以是触发处理器指令执行例外,可以是向用户发送告警或者提示等,本方案对此不做要求。

在一种具体的实现方式中,内核钩子函数攻击可以是通过堆溢出的手段,通过覆盖钩子函数结构体的方式来进行。由于钩子函数结构体中包含钩子函数的指针,通过钩子函数的指针能够访问到钩子函数,如果在钩子函数攻击过程中将钩子函数的指针位置覆盖后指向普通访存空间,则采用特定读写指令来读取非内存访问控制区域(即普通访存空间),硬件实现的内存访问控制区域就会判定访存指令为非正常访问指令,处理器将拒绝执行该访存指令并执行报警操作。

本发明实施例提供内核钩子函数的保护方法,预先将内核钩子函数的指针存储至内存访问控制区域,以通过对钩子函数的指针进行保护的方式来保护钩子函数;当接收到对钩子函数进行访问的访存指令时,根据访存指令中包含的访存信息对访存指令进行检测,确定访存指令为非正常访问指令或者正常访问指令,若访存指令是非正常访问指令,则对访存指令进行报警,能够减少内核钩子函数保护的系统开销,具有保护全面和难以绕开的特点。

实施例二:

图2为本发明实施例提供的一种内核钩子函数保护方法实施例二的流程示意图,在实施例一的基础上,图2所示为实施例一中的内核钩子函数的正常访问指令的访问流程,如图2所示,该内核钩子函数的保护方法还包括:

s104:若访存指令是正常访问指令,则获取所述内存访问控制区域中存储的所述钩子函数的指针;根据内存访问控制区域中存储的钩子函数的指针,对钩子函数进行访问。

本发明实施例中,钩子函数的指针是预先配置的指向钩子函数的指针,且该钩子函数的指针存储在内存访问控制区域中,通过上述钩子函数的指针即可访问钩子函数。

在s102步骤中,若确定访存指令是正常访问指令,且为钩子函数的访存指令,则继续执行该访存指令。该访存指令将根据内存访问控制区域中存储的钩子函数的指针,对钩子函数进行访问。而内存访问控制区域是通过配置寄存器预先配置的,具体的配置过程将在下一实施例中详述。

在一种具体的实现方式中,从内存访问控制区域中分配空间,将钩子函数的指针存入该空间中,并将指向内存访问控制区域空间的指针存入钩子函数结构体中。在访问钩子函数的过程中,采用特定读操作指令去读钩子函数结构体中的指针指向的值,该值为真正指向钩子函数的指针;通过该真正指向钩子函数的指针能够访问钩子函数,即可以通过读取该真正指向钩子函数的指针后跳转到钩子函数执行。

上述方案中,应理解,该过程由于采用了特定读写指令访问内存访问控制区域,即为在上述步骤中可确认出的正常的钩子函数的访问指令,因此能够正常调用钩子函数。

具体的,钩子函数的结构体为操作系统内核中的用于保存钩子函数指针的结构体。

本实施例提供的一种内核钩子函数的保护方法,当确认访存指令为正常访问指令后,根据预先配置的对钩子函数进行访问的内存访问控制区域中存储的钩子函数的指针,对钩子函数进行访问,实现了仅允许正常访问指令访问钩子函数,从而避免钩子函数受到恶意攻击。

实施例三:

图3为本发明实施例提供的一种内核钩子函数的保护方法实施例三的流程示意图,在实施例一和实施例二所述方法的具体步骤之前,还包括实施例三所述的步骤。

s201:配置内存访问控制区域。

在本步骤中,通过向内存访问控制区域的配置寄存器对中写入内存访问控制区域的起始地址和长度,在内存中配置内存访问控制区域。

在一种具体的实现方式中,设置内存访问控制区域的配置寄存器,用来配置内存访问控制区域。这些配置寄存器只能在处理器的核心态才能被访问,在用户态不能访问这些配置寄存器,保证了内存访问控制区域的安全性。

进一步地,配置寄存器成对出现,其中一个配置寄存器用于存放内存访问控制区域的起始地址,另一个配置寄存器用于存放内存访问控制区域的长度。采用上述技术方案,配置寄存器成对出现能够保证对内存访问控制区域配置工作的合理性,避免由于一个配置寄存器中位数不够,导致内存访问控制区域配置工作无法顺利完成的问题。

可选的,配置寄存器的数量可以是一对或者多对,这样能支持一个或者多个内存访问控制区域。具体设置多少对配置寄存器,可以根据具体设计情况来定。

可选的,在内存访问控制区域的配置过程中,上述配置寄存器可以由基本输入输出系统(basicinputoutputsystem,bios)或者内核代码来执行对内存访问控制区域的配置任务。

s202:在内存访问控制区域内分配预设大小的空间,并将钩子函数的指针存储在内存访问控制区域内对应的空间,生成空间指针。

在一种具体的实现方式中,对于从内存访问控制区域内分配空间的工作,可以通过分配函数和释放函数来实现,例如:memory_controlled_malloc函数和memory_controlled_free函数。通过调用memory_controlled_malloc函数可以从内存访问控制区域中分配预设大小的空间,该分配空间的预设大小与钩子函数指针的大小相等。当从内存访问控制区域中为钩子函数的指针分配空间成功后,采用特殊写指令(例如sstore)将钩子函数的指针写入到内存访问控制区域的相应空间位置上;其中,该相应空间位置即为通过分配函数在内存访问控制区域中为钩子函数的指针分类的空间地址位置。另外,当在内存访问控制区域内分配的上述空间使用完毕时,应该调用memory_controlled_free函数释放空间。其中,上述空间指针为指向内存访问控制区域内为钩子函数分配的空间的指针。

可选的,分配函数的声明可以为void*memory_cotrolled_malloc(intsize),函数功能为从内存访问控制区域中分配size字节大小的空间。如果分配成功,则返回值为指向被分配空间的指针,否则,返回值为空指针null。

可选的,根据处理器架构不同,钩子函数的指针的大小可以为4字节或者8字节等。

可选的,释放函数的声明可以为voidmemory_controlled_free(void*pointer),函数功能为释放pointer指针指向的内存访问控制区域中的空间。

s203:在钩子函数的结构体中存入空间指针。

在本步骤中,空间指针即为s202步骤中调用分配函数在内存访问控制区域中分配的空间的指针,将该空间指针写入到钩子函数结构体的指针变量中,例如hook_function_memory_controlled_pointer变量。也就是使得钩子函数结构体中的钩子函数指针变量指向内存访问控制区域的空间。

现有技术中,钩子函数结构体为操作系统内核中用于保存钩子函数的指针的结构体。

可选的,本发明实施例中,钩子函数结构体中的hookfuction*hook_function_memory_controlled_pointer变量用于存放空间指针,该空间指针为指向内存访问控制区域中的空间的指针,该内存访问控制区域中的空间中保存有钩子函数的指针。

本实施例提供的一种内核钩子函数的保护方法,在对访存指令进行判断之前,通过配置内存访问控制区域,在内存访问控制区域内分配空间,将钩子函数的指针存储在内存访问控制区域内分配的空间,并将指向该分配的空间的指针作为空间指针;在钩子函数的结构体中存入空间指针,从而使访存指令能够经过判断后,再通过调用空间指针获得钩子函数的指针,进而通过钩子函数的指针访问钩子函数。

在上述实施例的基础上,下面将以软件和硬件结合的角度,以预设指令为特定读指令和特定写指令为例,阐述本发明提供的一种内核钩子函数的保护方法。

实施例四:

内核钩子函数的保护方法可以包括两部分内容:

第一部分,处理器中内存访问控制区域的硬件模块支持;

第二部分,软硬件配合的内核钩子函数攻击检测。

在处理器中增加对内存访问控制区域的硬件支持部分,主要是在处理器中增加对内存访问控制区域的访问控制逻辑,以及增加特定的读写指令支持。内存访问控制区域是内存中的一块限制访问区域,对该区域的访问只允许采用特定读写指令进行。如果对内存访问控制区域的访问操作(读或写)不是来自于特定读写指令,则处理器运行内存访问控制区域的非法访问例外。内存访问控制区域还可以用来存储操作系统内核中的特殊敏感数据,本实施例中主要用来存放钩子函数。

在基于内存访问控制区域的内核钩子函数攻击检测部分,主要将操作系统内核的钩子函数的指针统一存放到内存访问控制区域,如果存在非特定读写指令访问该区域(该区域只允许特定读写指令访问),则判定为内核钩子函数攻击。

下面结合图4、图5、图6进行详细说明。图4为本发明实施例提供的一种处理器中支持内存访问控制区域的硬件模块设计示意图;图5为本发明实施例提供的一种内存访问控制区域的访问检测模块的控制逻辑的流程图;图6为本发明实施例提供的一种内核钩子函数攻击检测流程。

第一部分,处理器中内存访问控制区域的硬件模块设计:

本发明实施例中,将处理器中内存访问控制区域的硬件模块划分为三个部分,如图4所示,分别为:处理器访存模块、内存访问控制区域的访问检测模块以及访问检测报告模块。并配套给出特定读写指令对内存访问控制区域进行访问。

其中,处理器访存模块是处理器中用于执行访存指令的硬件模块;内存访问控制区域的访问检测模块获得处理器访存模块传来的访存指令中包含的访存信息,进行内存访问检测,得到内存访问检测结果;访问检测报告模块根据得到的内存访问检测结果,进行相应的检测报告。

处理器访存模块是处理器中用于执行访存指令的模块。在该模块中主要包含访存指令发射队列、访存专用定点寄存器堆、访存地址生成部件、高速缓冲存储器(cachememory)部件、转换检测缓冲区(translationlookasidebuffer,tlb)部件等部件。该模块主要计算出访存指令要访问的内存数据的虚拟地址,并将虚拟地址根据tlb内容转换成物理地址,然后再根据获得的物理地址发出实际的内存取数请求。处理器访存模块中主要利用处理器设计已有的各个部件,该各个部件的功能为现有技术,在此不做过多描述。本实施例中,处理器访存模块向内存访问控制区域的访问检测模块传递两个信息:一是访存指令的操作码,操作码的格式及位数可以根据具体的处理器架构确定;二是访存指令要访存的虚拟地址,其位数根据具体处理器架构来确定。

内存访问控制区域的访问检测模块从处理器访存模块获得每条访存指令包含的访问信息,进行内存访问控制区域的内存访问检测,并得到内存访问检测结果。访存信息包括操作码和访存的虚拟地址。如图2所示,检测过程如下:

第1步,得到处理器访存模块传送过来的访存指令包含的访存信息;

其中,访存信息中包含访存的虚拟地址和操作码。

第2步,判断访存的虚拟地址是否在内存访问控制区域内,如果是在内存访问控制区域内,则要进一步判断访存指令是否是预设指令,跳到第3步,否则跳到第4步;

第3步,判断访存指令是否是预设指令,如果是预设指令则表明检测结果正常,跳到第6步;如果不是预设指令,则跳到第5步;

第4步,判断访存指令是否是预设指令。由于这一步的访存指令访问的虚拟地址不在内存访问控制区域之内,因此,如果该访存指令是预设指令,则表明预设指令访问的不是内存访问控制区域,按照本发明对特定读指令和特定写指令的定义,这是不允许的,因此跳到第7步;如果不是预设指令的话,则表明检测结果正常,跳到第6步,该过程图中未示出;

第5步,检测结果赋为1,表明有普通访存指令访问了内存访问控制区域,这是不允许的。本次的访存指令是非正常访问指令;

第6步,检测结果赋为0,表明访存指令是正常访问指令;

第7步,检测结果赋为2,表明有预设指令访问的不是内存访问控制区域。按照本发明对特定读指令和特定写指令的定义,这是不允许的。本次的访存指令是非正常访问指令。

访问检测报告模块,主要根据从内存访问控制区域的访问检测模块传来的检测结果,进行报告。如果检测结果为0,则说明访问指令为正常访问指令,无需处理;如果检测结果为1,则说明有普通访存指令访问了内存访问控制区域,表明钩子函数受到了攻击,执行攻击报警操作;如果检测结果为2,则说明有预设指令访问了非内存访问控制区域,表明钩子函数受到了攻击,执行攻击报警操作。报警的具体方式可以触发处理器指令执行例外等,此处不做赘述。

关于内存访问控制区域的配置,本实施例设置内存访问控制区域的配置寄存器,用来配置内存访问控制区域。这些配置寄存器只能在处理器的核心态才能被访问,在用户态不能访问这些配置寄存器,从而确保了内存访问控制区域的安全性。

配置寄存器成对出现,其中一个配置寄存器用于存放内存访问控制区域的起始地址,另一个配置寄存器用于存放内存访问控制区域的长度。

配置寄存器的数量可以是1对或者多对,这样能支持1个或者多个内存访问控制区域。具体设置多少对配置寄存器,可以根据具体设计情况来定。

配套的特定读写指令主要包括特定读指令和特定写指令两类。这两类指令只允许访问内存访问控制区域,不能访问其他内存区域,否则执行报警操作。

可选的,特定读指令可以是sload指令(sloadrt,rs),将rs寄存器中的值作为地址,将存储在内存访问控制区域中该地址对应的数据,读入到rt寄存器中。该条特定读指令读入的数据可以是1个字节、2字节、4字节、8字节等;特定写指令可以是sstore指令(sstorert,rs),将rt寄存器中的值作为地址,将rs中的值写到内存访问控制区域中该地址对应的位置上。可以将rs寄存器中的1个字节、2个字节、4个字节、8个字节等内容写入。(sloadrt,rs)和(sstorert,rs)分别为特定读指令和特定读指令的指令形式。

关于增加新指令,需要在处理器指令集中增加新指令,主要通过在指令编码中增加特定的操作码等来区分新增加指令的类型,并相应修改处理器的指令流水线,使之支持新增指令的执行。

第二部分,软硬件配合的内核钩子函数攻击检测:

本实施例主要通过软硬件配合来进行内核钩子函数攻击检测。在硬件上实现了对内存访问控制区域的支持,通过将内核钩子函数指针统一存放到内存访问控制区域,所有对该内存访问控制区域的非正常访问指令均将被检测出来并报警,从而实现对内核钩子函数的保护。

如图6所示,内核钩子函数的攻击检测流程,主要包括:

s301:配置内存访问控制区域。

本发明实施例中,通过向内存访问控制区域的配置寄存器对中写入内存访问控制区域的起始地址和长度,来进行配置;可以由bios或者内核代码来执行配置任务。

s302:分配内存访问控制区域的空间,并将钩子函数的指针存入该空间。

从内存访问控制区域中分配空间,并将钩子函数的指针存入该空间中。为了实现这个步骤,首先需要在操作系统内核中设计一个内存访问控制区域的分配函数和释放函数memory_controlled_malloc/memory_controlled_free。具体函数的说明如下表1所示。该函数的具体实现与操作系统中已有的内存空间分配和释放函数malloc/free的实现类似。

表1:内存访问控制区域的空间分配及释放函数说明

通过调用memory_controlled_malloc来从内存访问控制区域中分配空间,分配空间大小为钩子函数指针的大小,通常根据处理器架构不同,该分配空间大小可以为4字节或者8字节等。当从内存访问控制区域中分配空间成功后,采用特殊写指令(sstore)将钩子函数指针写入到内存访问控制区域的相应空间位置上。另外,当内存访问控制区域中所分配的空间使用完毕的时候,可以调用memory_controlled_free函数释放上述分配的空间。

s303:将指向内存访问控制区域中所分配的空间的指针,存入到钩子函数结构体中。

将指向内存访问控制区域中所分配的空间的指针,存入到钩子函数结构体中。操作系统内核中的用于保存钩子函数指针的结构体,称为钩子函数结构体。这个结构体的声明通常如下所示。

struct{

…//其他变量

hookfuction*hook_function_memory_controlled_pointer;//指向内存访问控制区域中所分配的空间

…//其他变量

}

在本步骤中,首先调用常见的内存分配函数malloc为钩子函数结构体分配内存空间,然后将上一步骤中调用memory_controlled_malloc将所分配空间的空间指针,写入到钩子函数结构体的hook_function_memory_controlled_pointer变量中。也就是使得钩子函数结构体中包含的钩子函数指针变量指向内存访问控制区域所分配的空间。

s304:系统运行时动态检测钩子函数攻击情况。

运行时调用钩子函数,动态检测钩子函数攻击情况。此步骤中通过软硬件配合来进行,主要依赖硬件来进行钩子函数攻击检测。本发明对内核钩子函数的调用过程做了严格规定,并且与内核开发人员配合,要求内核开发人员按照该规定来进行内核钩子函数的调用,否则就起不到内核钩子函数保护效果。本发明规定内核钩子函数结构体中的指针,必须指向内存访问控制区域内,而在内核控制访问区域中存放真正指向钩子函数的指针。在调用内核钩子函数时,必须采用特定读操作(sload)指令去读钩子函数结构体中的指针指向的值,在读到该值后(该值为真正指向钩子函数的指针),跳转到钩子函数进行执行。

在正常调用钩子函数情况时,从钩子函数结构体中获得的钩子函数指针,是指向内存访问控制区域的,通过采用特定读指令来读取该指针指向的位置,获得真正钩子函数的指针,然后跳转到钩子函数执行。这个过程由于采用了特定读写指令访问内存访问控制区域,能够通过硬件实现的内存访问控制区域的访问检测模块的检查,因此能够正常调用钩子函数。

对于不正常调用钩子函数的情况(也就是受到攻击时),由于内核钩子函数攻击是通过堆溢出等手段,覆盖钩子函数结构体的方式来进行。如果将钩子函数的指针位置覆盖后指向普通访存空间,则采用特定读写指令来读取非内存访问控制区域,硬件实现的内存访问控制区域的访问检测模块就会自动检测出攻击;如果覆盖为特定内存访问控制区域的空间,由于攻击者不能将指向攻击代码的指针写入到内存访问控制访问区域(如果攻击者采用普通内存访问指令读写内存访问控制区域,硬件实现的内存访问控制区域的访问检测模块就会检测出来;如果要采用特定内存访问指令,则必须要处理处理器核心态下代码才能执行,这是很难做到的),因此攻击者最多引导内核执行其他的钩子函数或者非法地址,引起程序运行失败,但不能劫持程序控制流以执行攻击代码,也就是达不到提权的效果,攻击的破坏性就不大。

图7为本发明实施例提供的一种内核钩子函数的保护装置的结构示意图。如图7所示,内核钩子函数的保护装置10包括:

接收模块11,用于接收访存指令;其中,所述访存指令用于对钩子函数执行访存操作,且所述访存指令中包含访存信息;

判断模块12,用于根据所述访存信息和内存访问控制区域,对所述访存指令进行检测,判断所述访存指令为非正常访问指令或者正常访问指令;所述内存访问控制区域为预先配置的存储区域,且所述内存访问控制区域用于存储所述钩子函数的指针;

处理模块13,用于若所述访存指令是非正常访问指令,则对所述访存指令进行报警。

在一种具体的实现方式中,处理模块13还用于:若判断模块判断所述访存指令是正常访问指令,则获取所述内存访问控制区域中存储的所述钩子函数的指针;根据获取的所述钩子函数的指针,对所述钩子函数进行访问。

在一种具体的实现方式中,判断模块12具体用于:

若所述地址在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令是预设指令,则所述访存指令为正常访问指令;

若所述地址不在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令是预设指令,则所述访存指令为非正常访问指令;

若所述地址在所述内存访问控制区域内,且根据所述访存指令的操作码确定所述访存指令不是预设指令,则所述访存指令为非正常访问指令。

具体的,预设指令包括特定读指令和特定写指令。

在一种具体的实现方式中,在接收访存指令之前,处理模块13还用于:

配置所述内存访问控制区域;

在所述内存访问控制区域内分配预设大小的空间,并将钩子函数的指针存储在所述内存访问控制区域内分配的空间中,生成空间指针;其中,所述空间指针为指向所述内存访问控制区域内为所述钩子函数分配的空间的指针;

在所述钩子函数的结构体中存入空间指针。

本实施例提供的装置,可用于执行上述方法的实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。

图8为本发明实施例提供的电子设备的硬件结构示意图,如图8所示,该电子设备20包括:

存储器201,用于存储计算机执行指令;

处理器202,用于执行存储器存储的计算机执行指令,以实现上述实施例中终端设备所执行的各个步骤。具体可以参见前述方法实施例中的相关描述。

可选地,存储器201既可以是独立的,也可以跟处理器202集成在一起。

当存储器201独立设置时,该终端设备还包括总线203,用于连接所述存储器201和处理器202。

本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上所述的内核钩子函数的保护方法。

在本发明所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。上述模块成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例所述方法的部分步骤。

应理解,上述处理器可以是中央处理单元(英文:centralprocessingunit,简称:cpu),还可以是其他通用处理器、数字信号处理器(英文:digitalsignalprocessor,简称:dsp)、专用集成电路(英文:applicationspecificintegratedcircuit,简称:asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。

存储器可能包含高速ram存储器,也可能还包括非易失性存储nvm,例如至少一个磁盘存储器,还可以为u盘、移动硬盘、只读存储器、磁盘或光盘等。

总线可以是工业标准体系结构(industrystandardarchitecture,isa)总线、外部设备互连(peripheralcomponent,pci)总线或扩展工业标准体系结构(extendedindustrystandardarchitecture,eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。

上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。

一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于专用集成电路(applicationspecificintegratedcircuits,简称:asic)中。当然,处理器和存储介质也可以作为分立组件存在于电子设备或主控设备中。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1