适用于操作系统内核对象地址泄露的检测方法及系统与流程

文档序号:20702549发布日期:2020-05-12 15:55阅读:122来源:国知局
适用于操作系统内核对象地址泄露的检测方法及系统与流程

本发明涉及计算机软件技术领域,具体地,涉及一种适用于操作系统内核对象地址泄露的检测方法及系统。



背景技术:

操作系统内核一直都是攻击者重点关注的攻击对象。本地攻击或者远程攻击,一般都需要知道内核地址的布局从而获得更高的系统权限或窃取私密数据。操作系统内核地址的机密性对于保障操作系统安全不被恶意用户攻击十分重要。在检测操作系统内核安全漏洞的技术中,检测内核对象地址泄露的方法是其中的重要技术之一。

近几年来,检测内核对象地址泄露的方法主要有两大类:检测对未初始化的对象的访问,检测内存越界访问。对未初始化的对象的访问有可能会泄露内核对象地址,当一块内存区域被释放之后重新被分配,过程中没有对该内存区域清零或进行初始化,对该未初始化的对象的访问可以读到该内存区域原来的值,可能会造成内核对象地址的泄露。内存越界访问是另外一种可能泄露内核对象地址的方式,对于越界地址的访问可以非法访问到其他内存地址的值,从而读取到内核对象地址。

这两种内核对象地址泄露的方法都是通过非法的内存操作实现的。目前检测内核对象地址泄露的方法主要基于检测非法的内存操作实现的。

当前的检测方法能检测大部分由于非法的内存操作导致的内核对象地址的泄露,但是其缺点是:这些方法都只能检测非法的内存操作导致的内核对象地址泄露,而不能检测到由于开发者疏忽造成的内核对象地址泄露。

一种检测内核对象地址泄露的方式是跟踪所有内核对象指针的数据流,检查是否通过与内核与用户空间交互的接口泄露到用户空间。这种方法需要跟踪所有内核对象指针,数量庞大,而且由于内核代码中存在大量间接调用函数,传统的数据流和控制流分析方法耗时长,且准确率低,从内核对象地址赋值给指针到该指针传播到用户空间的过程中可能存在大量的间接调用,从而导致分析结果具有较高的假阳性。



技术实现要素:

针对现有技术中的缺陷,本发明的目的是提供一种适用于操作系统内核对象地址泄露的检测方法及系统。

根据本发明提供的一种适用于操作系统内核对象地址泄露的检测方法,包括:

函数接口标记步骤:标记所有内核与用户空间交换数据的函数接口;

数据分析步骤:根据获取的函数接口,通过编译器分析传输到用户空间的数据中是否包含指针:若包含,则进入内核指针判断步骤;若不包含,则表明该数据不泄露内核对象地址,直接返回继续分析下一待分析数据;

内核指针判断步骤:根据当前处理器的特性和内核指针在内核代码中的特点,判断分析得到的指针是否为内核指针:如果是内核指针,则进入地址泄露检测步骤继续执行;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据;

地址泄露检测步骤:通过过滤掉调试专用的上下文,从而检测在非调试环境下是否有内核对象地址泄露到用户空间:若有,则判定存在内核对象地址泄露;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据。

优选地,所述函数接口标记步骤:

采用编译器分析技术或用户标记的方法,标记所有内核与用户空间交换数据的函数接口。

优选地,所述函数接口标记步骤:

借助编译器分析技术,在内核态代码中找到和用户空间交换数据的函数接口或通过用户在源代码中加标记指定。

优选地,所述数据分析步骤:

根据获取的函数接口,通过分析该函数接口的参数或通过用户指定,获取传递到用户空间的数据的起始地址的变量和传递数据的大小,通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针;传递的数据的大小包括:一个固定的常数、一个数值变量;

所述通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针:

根据获取的数据的起始地址的变量和传递数据的大小,储存该数据起始地址的变量是一个指针,通过该指针指向的数据类型和传递数据的大小变量进行数据流分析,得到该指针指向的数据类型以及传递数据的大小,从而判断传递的数据中是否包含指针。

优选地,所述内核指针判断步骤:

所述处理器的特性指:smap处理器特性用途是禁止内核因为自身错误而访问用户空间的数据,以避免内核漏洞所导致的安全隐患;

操作系统内核提供了对这种处理器的特性的支持,如果在内核态访问用户空间的数据,会造成内核出错,默认情况下内核态是不访问空间的数据的;

在处理器开启的情况下,如果一个指针在内核态被解引用,访问了该指针指向位置的数据,则判定该指针一定是内核态指针。

优选地,所述地址泄露检测步骤:

过滤掉所有在调试用选项开启时的上下文:在调试的时候,内核指针的地址是开发者故意传递到用户空间供调试目的用的,通过函数名判断该函数名是否包含调试目的的字眼及源代码信息,从而过滤掉所有调试用的上下文;

所述源代码信息指泄露的地点在调试专用的分支中。

根据本发明提供的一种适用于操作系统内核对象地址泄露的检测系统,包括:

函数接口标记模块:标记所有内核与用户空间交换数据的函数接口;

数据分析模块:根据获取的函数接口,通过编译器分析传输到用户空间的数据中是否包含指针:若包含,则调用内核指针判断模块;若不包含,则表明该数据不泄露内核对象地址,直接返回继续分析下一待分析数据;

内核指针判断模块:根据当前处理器的特性和内核指针在内核代码中的特点,判断分析得到的指针是否为内核指针:如果是内核指针,则进入地址泄露检测模块继续执行;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据;

地址泄露检测模块:通过过滤掉调试专用的上下文,从而检测在非调试环境下是否有内核对象地址泄露到用户空间:若有,则判定存在内核对象地址泄露;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据。

优选地,所述函数接口标记模块:

采用编译器分析技术或用户标记的方法,标记所有内核与用户空间交换数据的函数接口;

所述函数接口标记模块:

借助编译器分析技术,在内核态代码中找到和用户空间交换数据的函数接口或通过用户在源代码中加标记指定。

优选地,所述数据分析模块:

根据获取的函数接口,通过分析该函数接口的参数或通过用户指定,获取传递到用户空间的数据的起始地址的变量和传递数据的大小,通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针;传递的数据的大小包括:一个固定的常数、一个数值变量;

所述通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针:

根据获取的数据的起始地址的变量和传递数据的大小,储存该数据起始地址的变量是一个指针,通过该指针指向的数据类型和传递数据的大小变量进行数据流分析,得到该指针指向的数据类型以及传递数据的大小,从而判断传递的数据中是否包含指针。

优选地,所述内核指针判断模块:

所述处理器的特性指:smap处理器特性用途是禁止内核因为自身错误而访问用户空间的数据,以避免内核漏洞所导致的安全隐患;

操作系统内核提供了对这种处理器的特性的支持,如果在内核态访问用户空间的数据,会造成内核出错,默认情况下内核态是不访问空间的数据的;

在处理器开启的情况下,如果一个指针在内核态被解引用,访问了该指针指向位置的数据,则判定该指针一定是内核态指针;

所述地址泄露检测模块:

过滤掉所有在调试用选项开启时的上下文:在调试的时候,内核指针的地址是开发者故意传递到用户空间供调试目的用的,通过函数名判断该函数名是否包含调试目的的字眼及源代码信息,从而过滤掉所有调试用的上下文;

所述源代码信息指泄露的地点在调试专用的分支中。

与现有技术相比,本发明具有如下的有益效果:

1、本发明能检测无非法内存操作的情况下由于开发者的疏忽造成的内核对象地址泄露的情况。

2、本发明利用内核对象地址在现有的处理器上及内核代码中的行为特性,数据流分析到该指针被解引用即可判断该指针为内核指针,而不需要一直分析到该指针最初创建或赋值的地方,实现复杂度低,工程量小,分析效率和准确性大大提升。

3、本发明自动识别内核代码中调试用的上下文,过滤掉因调试目的而传递到用户空间的内核对象地址,假阳性较低。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为本发明提供的程序分析流程图;

图2为本发明提供的软件实现架构示意图。

具体实施方式

下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。

根据本发明提供的一种适用于操作系统内核对象地址泄露的检测方法,包括:

函数接口标记步骤:标记所有内核与用户空间交换数据的函数接口;

数据分析步骤:根据获取的函数接口,通过编译器分析传输到用户空间的数据中是否包含指针:若包含,则进入内核指针判断步骤;若不包含,则表明该数据不泄露内核对象地址,直接返回继续分析下一待分析数据;

内核指针判断步骤:根据当前处理器的特性和内核指针在内核代码中的特点,判断分析得到的指针是否为内核指针:如果是内核指针,则进入地址泄露检测步骤继续执行;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据;

地址泄露检测步骤:通过过滤掉调试专用的上下文,从而检测在非调试环境下是否有内核对象地址泄露到用户空间:若有,则判定存在内核对象地址泄露;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据。

具体地,所述函数接口标记步骤:

采用编译器分析技术或用户标记的方法,标记所有内核与用户空间交换数据的函数接口。

具体地,所述函数接口标记步骤:

借助编译器分析技术,在内核态代码中找到和用户空间交换数据的函数接口或通过用户在源代码中加标记指定。

具体地,所述数据分析步骤:

根据获取的函数接口,通过分析该函数接口的参数或通过用户指定,获取传递到用户空间的数据的起始地址的变量和传递数据的大小,通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针;传递的数据的大小包括:一个固定的常数、一个数值变量;

所述通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针:

根据获取的数据的起始地址的变量和传递数据的大小,储存该数据起始地址的变量是一个指针,通过该指针指向的数据类型和传递数据的大小变量进行数据流分析,得到该指针指向的数据类型以及传递数据的大小,从而判断传递的数据中是否包含指针。

具体地,所述内核指针判断步骤:

所述处理器的特性指:smap处理器特性用途是禁止内核因为自身错误而访问用户空间的数据,以避免内核漏洞所导致的安全隐患;

操作系统内核提供了对这种处理器的特性的支持,如果在内核态访问用户空间的数据,会造成内核出错,默认情况下内核态是不访问空间的数据的;

在处理器开启的情况下,如果一个指针在内核态被解引用,访问了该指针指向位置的数据,则判定该指针一定是内核态指针。

具体地,所述地址泄露检测步骤:

过滤掉所有在调试用选项开启时的上下文:在调试的时候,内核指针的地址是开发者故意传递到用户空间供调试目的用的,通过函数名判断该函数名是否包含调试目的的字眼及源代码信息,从而过滤掉所有调试用的上下文;

所述源代码信息指泄露的地点在调试专用的分支中。

本发明提供的适用于操作系统内核对象地址泄露的检测系统,可以通过本发明给的适用于操作系统内核对象地址泄露的检测方法的步骤流程实现。本领域技术人员可以将所述适用于操作系统内核对象地址泄露的检测方法,理解为所述适用于操作系统内核对象地址泄露的检测系统的一个优选例。

根据本发明提供的一种适用于操作系统内核对象地址泄露的检测系统,包括:

函数接口标记模块:标记所有内核与用户空间交换数据的函数接口;

数据分析模块:根据获取的函数接口,通过编译器分析传输到用户空间的数据中是否包含指针:若包含,则调用内核指针判断模块;若不包含,则表明该数据不泄露内核对象地址,直接返回继续分析下一待分析数据;

内核指针判断模块:根据当前处理器的特性和内核指针在内核代码中的特点,判断分析得到的指针是否为内核指针:如果是内核指针,则进入地址泄露检测模块继续执行;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据;

地址泄露检测模块:通过过滤掉调试专用的上下文,从而检测在非调试环境下是否有内核对象地址泄露到用户空间:若有,则判定存在内核对象地址泄露;否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据。

具体地,所述函数接口标记模块:

采用编译器分析技术或用户标记的方法,标记所有内核与用户空间交换数据的函数接口;

所述函数接口标记模块:

借助编译器分析技术,在内核态代码中找到和用户空间交换数据的函数接口或通过用户在源代码中加标记指定。

具体地,所述数据分析模块:

根据获取的函数接口,通过分析该函数接口的参数或通过用户指定,获取传递到用户空间的数据的起始地址的变量和传递数据的大小,通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针;传递的数据的大小包括:一个固定的常数、一个数值变量;

所述通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针:

根据获取的数据的起始地址的变量和传递数据的大小,储存该数据起始地址的变量是一个指针,通过该指针指向的数据类型和传递数据的大小变量进行数据流分析,得到该指针指向的数据类型以及传递数据的大小,从而判断传递的数据中是否包含指针。

具体地,所述内核指针判断模块:

所述处理器的特性指:smap处理器特性用途是禁止内核因为自身错误而访问用户空间的数据,以避免内核漏洞所导致的安全隐患;

操作系统内核提供了对这种处理器的特性的支持,如果在内核态访问用户空间的数据,会造成内核出错,默认情况下内核态是不访问空间的数据的;

在处理器开启的情况下,如果一个指针在内核态被解引用,访问了该指针指向位置的数据,则判定该指针一定是内核态指针;

所述地址泄露检测模块:

过滤掉所有在调试用选项开启时的上下文:在调试的时候,内核指针的地址是开发者故意传递到用户空间供调试目的用的,通过函数名判断该函数名是否包含调试目的的字眼及源代码信息,从而过滤掉所有调试用的上下文;

所述源代码信息指泄露的地点在调试专用的分支中。

下面通过优选例,对本发明进行更为具体地说明。

优选例1:

下面结合附图对本发明作进一步说明。

如图1所示,为本发明程序分析的具体流程,完成对内核代码中内核对象地址泄露的检测。下面以一个操作系统内核源程序为例,结合图1对以下内核对象地址泄露检测步骤进行详细描述:

在步骤401中,用户可以选择手动在源程序中指定内核态与用户空间交换数据的函数接口或者通过编译器分析技术自动找到对应接口,然后执行步骤402;

在步骤402中,根据内核态与用户空间交换数据的接口,从参数中识别和获取出传递到用户空间的数据的起始地址变量指针ptr和表示传输大小size,然后执行步骤403;

在步骤403中,根据获取到的指针的类型计算出所有传输到用户空间的对象,如果该指针是指向一个基本类型的指针,则把其指向的变量加入待检查的对象集合中,如果该指针是指向一个数组类型的指针,则把该数组中从起始地址开始到大小为size能覆盖的所有数组元素加入待检查的对象中,如果该指针是一个指向一个结构体类型的指针,则把该结构体从起始地址开始,大小为size能覆盖的所有成员变量加入待检查的对象中,然后执行步骤404;

在步骤404中,从待检查的对象中获取一个未检查的对象;

在步骤405中,对该对象进行类型检查,如果该对象不是指针类型,然后执行步骤406,如果该对象是指针类型,则执行步骤407;

在步骤406中,如果待检查的对象集合里所有对象都被检查过了,结束所有操作。

在步骤407中,通过内核指针在内核代码中的行为判断该指针是否内核指针,如果该指针在smap特性开启时在内核态中解引用了,则该指针为内核指针,如果该指针被赋值为一个内核对象的地址,该指针为内核指针,如果该指针是从用户空间拷贝过来的,该指针不为内核指针,当该指针为内核指针时,然后执行步骤408,当该指针不为内核指针时,然后执行步骤406;

在步骤408中,通过内核中定义的宏或函数名字,判断该指针是否在调试专用的上下文中被拷贝到用户空间,如果不是调试用上下文,则此内核对象地址泄露到用户空间,然后执行步骤409;否则然后执行步骤406;

在步骤409中,报告内核对象地址泄露的位置,然后执行步骤406。

如图2所示,本发明结合编译器分析和内核指针在内核代码中的行为特点,从所有内核态与用户空间交换数据的接口(模块1a、1b)中提取拷贝到用户空间的对象(模块2),内核对象指针识别模块(模块3)负责判断该对象是否为内核指针,调试专用上下文识别模块(模块4)负责判断该拷贝操作是否在调试专用上下文中。

优选例2:

一种适用于操作系统内核对象地址泄露的检测方法。

该方法先采用编译器分析技术或用户标记的方法,标记所有内核与用户空间交换数据的函数接口。

然后通过编译器分析传输到用户空间的数据中是否包含指针,若包含则进入下一步分析,若不包含,则表明该数据不泄露内核对象地址,直接返回继续分析下一待分析数据。

然后根据内核指针的定义和内核对象地址在内核代码中的特点,判断上一步分析得到的指针是否为内核指针,如果是内核指针,则进行下一步分析,否则表明该数据不泄露内核对象地址,直接返回继续分析下一个待分析数据。

最后通过过滤掉调试专用的上下文,从而检测在非调试环境下是否有内核对象地址泄露到用户空间。

上述的对于内核代码分析的过程包括以下步骤:

(1)识别和获取所有内核态与用户空间数据交换的函数接口

(2)识别和获取传递到用户空间的数据的起始地址变量和传递数据的大小

(3)通过数据的起始地址和大小计算传递到用户空间的数据中是否包括指针

(4)判断该指针是否内核指针

(5)过滤掉调试用上下文

所述步骤(1)借助编译器分析技术,在内核态代码中找到和用户空间交换数据的函数接口或通过用户在源代码中加标记指定。

所述步骤(2)中通过步骤(1)中获取的数据交换的函数接口,通过分析该函数接口的参数或用户指定获取传递到用户空间的数据的起始地址的变量和传递数据的大小。传递的数据的大小可以是一个固定的常数也可以是一个数值变量。

所述步骤(3)中计算传递到用户空间的数据是否包含指针,使用的是步骤(2)中获取的数据的起始地址的变量和传递数据的大小,储存该数据起始地址的变量是一个指针,通过该指针指向的数据类型和传递数据的大小变量进行数据流分析(通过数据流分析,计算出该数据和传递数据的大小变量的值),得到该指针指向的数据类型以及传递数据的大小,从而判断传递的数据中是否包含指针。

所述步骤(4)中判断该指针是否内核指针,根据当前处理器的特性和内核指针在内核代码中的特点。smap处理器特性用途是禁止内核因为自身错误而访问用户空间的数据,以避免一些内核漏洞所导致的安全隐患。常见的操作系统内核都提供了对这种特性的支持,如果在内核态访问用户空间的数据,会造成内核出错,默认情况下内核态是不访问空间的数据的。因此,在smap开启的情况下,如果一个指针在内核态被解引用,即访问了该指针指向位置的数据,该指针一定是内核态指针。

所述步骤(5)中过滤掉所有在调试用选项开启时的上下文,在调试的时候,内核指针的地址是开发者故意传递到用户空间供调试目的用的,通过函数名判断该函数名是否包含调试目的的字眼如debug/dbg,及其他源代码信息例如该泄露的地点在调试专用的分支中,从而过滤掉所有调试用的上下文。

一种适用于操作系统内核对象地址泄露的检测方法,软件部分包括识别内核态和用户空间交换数据的接口编译器工具,包括内核对象地址的识别和调试用上下文的识别过滤编译器分析工具。

本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

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