基于函数调用图的并行化安全漏洞检测方法

文档序号:6441212阅读:151来源:国知局
专利名称:基于函数调用图的并行化安全漏洞检测方法
技术领域
本发明涉及一种源代码漏洞的并行检测方法。
背景技术
随着信息技术的发展,计算机软件已经渗透到国民经济的各个领域中,并与人们的生产生活息息相关。软件的安全问题也越来越凸显其重要性,一些关键软件一旦遭到破坏,将会造成行业性乃至全国性的瘫痪。恶意的用户可以针对特定软件的错误,运行恶意的代码从而得到访问非法数据的权限。缓冲区溢出漏洞是目前这类安全漏洞中最主要的一种。恶意的用户可以通过分析程序的输入数据格式,并确定这些数据存放在程序的缓冲区中,这样用户就有可能通过特殊的输入数据,将栈空间的敏感数据覆盖掉,特别的将保存的返回地址替换为用户自己定义的非法代码的地址,这样非法用户就可以控制程序流程、执行非法操作。软件的漏洞可以通过静态方法和动态方法进行检测。静态方法分为一般的静态检测方法和基于完备理论的形式化验证方法,第一类主要是基于程序分析的方法检查代码中可能存在的漏洞;第二类方法则以形式逻辑、自动机理论为基础,验证程序是否具有某种性质。程序分析的方法不能够对程序的所有状态进行穷举,因此精确度欠佳,模型检测可以对所有程序的状态进行穷举,然而为了验证一个短小程序的性质,需要搜索的程序状态可能就非常庞大,因此纯模型检测的方法不能有效地进行漏洞检测。目前比较有效的一种模型检测方法是基于抽象-验证-细化范例的软件模型检测方法,代表工具是加州大学伯克利分校研制的Blast,这种方法能够适当忽略与安全漏洞属性不相关的代码,从而简化了整个验证过程。这不仅可以增加检测出的漏洞数目而且可以减小误报率,提高检测精度。与静态检测方法不同的是,动态检测技术对程序的规模没有限制,可以对大型程序进行检测, 然而明显的不足是动态检测技术对输入的依赖性,只有当特定的输入使程序执行到危险点时,漏洞才会被发现,从而导致误报率较高。单纯的模型检测方法一般不能直接检测程序的漏洞,比如Blast曾借助于kcurd 检测程序中空指针的引用问题,但是不能检测更复杂缓冲区操作的安全性。此外,在检测大规模程序时,模型检测方法会产生状态空间爆炸问题。

发明内容
本发明要解决的技术问题是针对模型检测方法会产生状态空间爆炸问题,提出一种并行化模型检测的方法来对缓冲区溢出漏洞进行验证,目前该方法能够实际地应用于大规模的程序以及嵌入式操作系统模块中,并且具有减少状态空间、低误报率的优点。本发明采用的技术方案是基于函数调用图的并行化安全漏洞检测方法,其特征在于通过分析待检测程序的函数调用关系生成函数调用图,查找出调用图树中的叶节点函数,再启动并行化程序,同时利用模型检测工具完成对叶节点函数的检测,从而判断和分析出安全漏洞以及引发路径。
本发明采用基于函数和多线程的并行优化方法。首先,针对输入的多文件模块同时利用GCC的寄存器传递语言(RTL)特性分析出待检测的模块中各文件里的函数调用关系,此时,生成函数关系调用图。然后,对函数关系调用图进行分析,找到入度为零的函数节点(叶节点)。最后,对叶节点所在的文件进行预处理,启动多线程并利用模型检测工具 BLAST对经过预处理的文件进行可达性验证。整个函数调用图主要分如下几个部分(1)调用图生成模块,此模块完成函数调用关系图的生成,通过生成待检测文件模块的函数的调用关系图,可以方便地从底层函数开始分析和检测,也可以方便地调度整个检测过程;(2)分析调度模块,此模块的任务是在调用图的基础上调度整个检测过程,由于模块文件间的独立性,来自不同调用子树的函数一般具有较小的相关性或者没有相关性,可以方便对此类的函数进行并行检测;(3)预处理模块,此模块主要在GCC的抽象语法树上进行约束分析,建立了一套针对缓冲区溢出漏洞的约束分析机制,为缓冲区增加属性长度信息,不同的缓冲区操作语句对应于不同的属性约束生成,已完成代码插装的过程,然后分析断言assert的分布情况, 为模型检测模块提供基础;(4)检测模块,此模块使用模型检测工具BLAST来完成经过预处理模块处理后的文件,同时检测系统启动多线程进行检测。基于函数和多线程并行化的模型检测最终是一种验证给定的系统是否满足特定的性质的技术。给定一个待检测的系统和系统相关的性质描述,通过模型检测算法的执行, 算法可以证明此系统是否满足给定的性质,如果系统不满足给定的性质,系统会给出以一个包含反例的错误报告,从而检测出一个安全漏洞,所以安全漏洞问题已经成功转化为对错误标签ERROR的可达性问题。


图1为本发明方法实施的结构图解;图2为调用图生成模块的主要算法图3为分析调度模块的主要算法图4为插装前和插装后的代码之间的对比,图4b中下划线标出的为插装代码图5为预处理模块的主要算法图6为Blast对属性约束模型检测的结果,图中所示文件路径可显示漏洞的实际路径,方便程序人员手工查找和确认。
具体实施例方式本发明利用静态分析,通过生成函数关系调用图的方法追踪程序中函数的调用关系,为分析调度模块提供相应的调度信息,然后,在此基础之上通过预处理模块对所需要插装的文件进行处理,最后,通过检测模块实现并行模型检测,以实现对于安全漏洞问题的检测分析,保证了对源代码漏洞的精确检测。结构图如图1。1.调用图生成模块
首先此模块生成待检测软件的函数调用关系图,它可以方便地从底层函数开始分析和检测,也可以方便地调度整个检测过程。在实现的过程中,我们利用了 GCC的寄存器传递语言(RTL)的特征。它是通过在 GCC的前端分析代码中生成抽象语法树(AST),在GCC的后端,把AST编译成RTL语言作为编译成最终代码的过渡。通过分析RTL文件,我们发现函数定义会在RTL文件中生成“;; Function fun-name (fun-name) ”的格式行,其中fun-name是指实际的函数名,在遇到调用函数的时候,RTL文件会生成call的RTL指令,正则表达式给出一般格式为 “ (call.* (fun-name).*) ”,其中,fun-name为调用的函数名。因此,我们得到生成调用图部分的主要算法如图2,算法的主要内容为首先,利用GCC生成RTL文件,RTL进行分析来确定函数的调用关系,然后对于RTL 文件里的每一行进行信息提取,如果有满足“ ;;Function”形式的行,就记录下RTL文件内容所表示的函数名字及其文件名字,并对此函数设置一个标志位,如果有满足(call)形式的行,就把RTL文件信息所表示的主调用函数和被调用函数记录到另一个文件中,以此来保存相应的函数信息,以为分析调度模块提供参考信息。2.分析调度模块在上一步的基础上完成了函数关系调用图的相关操作,分析调度模块的主要任务是分析调用图,在调用图的基础上调度整个检测过程。由于待检测的软件的模块性特征,来自不同调用子树的函数相关性很小或者没有相关性,因此,通过对函数关系调用图的分析, 我们可以对这样的一些函数做并行的检测。一方面,我们还考虑了过程间的敏感传递,也就是被调用者的参数处理会影响调用者的情况,以此,应该从较底层的函数开始检测;另一方面,由于是自底向上的调度检测,而且底层的函数一般分布在不同的模块里,相关性比较小,所以,实现并行相对比较容易。在分析调度中,我们首先分析待测模块信息所生成的函数关系调用图,查找出关系调用图中的叶节点,然后标记好需要检测的函数及其文件,最后调度检测工具对这些待检测的函数和文件进行并行检测。由此,我们得到了分析调度模块的主要算法如图3,算法的主要内容为首先,对于函数调用图的里的每一对主调函数和被调用函数,一个主调函数每调用一个函数,它的出度计数值加1,一个被调函数每次被调用一次它的入度计数值加1 ;然后,查找模块文件里所有出度计数值为0的函数,并标记为叶子节点,加入到叶节点数组中;其次,把所有的叶子节点和叶子节点所在的文件信息存档到特定的叶子集合文件中,以方便利用模型检测工具进行漏洞检测。3.预处理模块预处理模块主要完成代码插装和断言分析的功能。代码插装采用语法制导的方法,在GCC的抽象语法树上进行约束分析,建立了一套针对缓冲区溢出漏洞的约束分析机制,为缓冲区增加属性长度信息,不同的缓冲区操作语句对应于不同的属性约束生成。为描述整个约束分析过程,首先对C语言进行抽象,分析过程非流敏感的,不会处理控制流信息,为简化分析本发明将所关心的C语言语法进行抽象,包括指针变量、整型变量、函数调用、内存分配以及赋值语句。根据这些语法抽象对缓冲区的操作,生成相应的属性处理语句,而生成规则是由xml配置文件给出,该文件将直接指导缓冲区属性模型的建立。图如插装好的代码是可以编译的C语言代码,如图4b。由于并行模型检测的特殊性以及BLAST模型检测工具的局限性,我们对插装后的C语言代码做了相应的变动,即注释掉包含assert 断言的C语言代码行。以方便断言分析时一一激活待检测的assert断言。预处理模块对文件完成插装后,还需要分析断言assert的分布情况,判断出 assert所在的函数,结合分析调度模块给出待检测的函数名和文件名,为模型检测模块提供基础。断言分析在搜索assert的同时,会分析和记录语句所处的作用域,从而分析出函数定义。此预处理模块的具体算法如图5,算法的主要内容为首先,对于所有的叶子节点,逐行读取出叶子节点所在的C语言文件,当追踪到叶子节点函数时,相应地做一个标识,如果叶子节点内有危险点函数,即插装的assert断言, 那么激活这个待检测的断言,并把它保存到一个相应的文件中,以方便模型检测模块进行并行检测。然后,在叶子函数内继续查找,如果再次查找到assert断言,那么依照上面的方法执行,反之,跳出叶子节点,则把标识复位,从而继续追踪其他的叶子节点及其所在的C 语言文件。经过预处理模块处理后得到的每个文件里只包含一个激活的assert断言,以方便模型检测工具进行检测,同时由于叶节点之间相关性相对较小,所以,我们可以启用多线程的方法进行检测经过预处理模块处理后生成的C语言文件。4.检测模块检测模块使用模型检测工具BLAST来检测经过预处理后的C语言文件,同时该模块启动多线程进行检测。检测模块对分析调度模块产生的函数名和断言进行可达性验证, 得到的检测结果还会经过分析调度模块处理。Blast是一个控制流敏感、且支持过程间分析的模型检测工具。由University of California的Thomas A. Henzinger等人开发。Blast对C语言代码的空指针引用错误进行了精确的检查,误报率很低;另外Blast可以进行代码的可达性分析,也就是判断程序是否可以从入口出开始执行并到达某个指定的位置。使用Blast对上一步中所建立的属性模型进行可达性分析。对于属性模型中所生成的属性约束,通过宏替换转变为Blast需要验证的标签(图4b),如果该标签可达,则表明该处存在一个安全漏洞。Blast使用反例制导的方法进行可达性分析,可以将从程序入口到该标签的执行路径记录下来,通过对路径跟踪可以分析出产生安全漏洞的执行路径,方便程序人员手工查找和确认。图6示意所得到的漏洞检测结果,在该结果中显示漏洞路径文件的所在位置及文件名,打开该文件即可看到漏洞路径的具体信息。检测模块的主要思想就是以函数入口进行可达性验证。由于模型检测是以函数为基本单元进行的,相对于从main函数开始的可达性,调用定理证明器查询的次数会相对减少,验证的搜索路径也会相对缩短。此外,基于函数检测的另一个明显好处就是方便并行检测处理,因为模型检测是从叶节点开始的,叶节点函数之间的相关性较小或者没有相关性。 我们这里的并行检测是采用POSIX threads (简称Pthreads)。Pthreads是一套常用在多核平台上进行并行编程的并行库,它充分利用了机器上的多核资源。
权利要求
1.基于函数调用图的并行化安全漏洞检测方法,其特征在于针对漏洞检测过程中的状态空间爆炸问题,通过分析被检测的C程序模块的特征,确定模块内函数之间的调用关系并生成函数关系调用图,从而查找到出度为零的函数(叶子节点)集合及其所在的C语言文件,然后利用预处理技术进行代码插装和断言分析,最后利用模型检测工具对叶子节点进行并行检测。对叶子节点检测完毕后,从函数关系调用图删除叶子节点,重新查找叶子节点,并重复代码插装、断言分析和检测过程,直到检测完整个函数关系调用图。
2.根据权利要求1所述的基于函数调用图的并行化安全漏洞检测方法中模块函数调用关系图的生成,其特征在于利用GCC寄存器传递语言(RTL)的特征,以函数为单位确定函数的调用关系,生成函数关系调用图,同时根据追踪过程记录下每个函数所在的C语言文件。
3.根据权利要求1和2所述的基于函数调用图的并行化安全漏洞检测方法中分析调度模块,其特征在于根据函数关系调用图里所示的内容,找到叶子节点(它是被检测C语言模块中某个C语言文件里的一个被定义的函数,它被待检测模块里的其他函数所调用, 但本身并不调用任何待检测模块里的其他函数),并将叶子节点集合以及叶子节点所在的 C语言文件分别存放在相应的数据结构中。
4.根据权利要求1所述的基于函数调用图的并行化安全漏洞检测方法中预处理模块, 其特征在于通过标准的编译器前端分析,将针对指针、数组的定义、指针引用、数组访问以及危险函数的调用等都添加了缓冲区属性约束的更新与断言信息,如果属性断言或属性性质不成立那么程序流会到达错误标签,从而检测出一个安全漏洞,包含assert断言的待检测C语言文件中每个文件都是可以编译的,并且只包含一个激活的待检测assert断言。
5.根据权利要求1所述的基于函数调用图的并行化安全漏洞检测方法中并行调度模块,其特征在于利用模型检测工具BLAST对预处理后的C语言文件进行检测,由于各叶子节点的相关性较小或者没有相关性的特征,我们使用并行化技术对这些待检测的文件进行模型检测充分利用了多核资源,可以更加快速有效地达到漏洞检测的效果。
全文摘要
本发明涉及一种基于函数调用图的并行化安全漏洞检测方法。本发明通过分析C语言模块里的函数调用关系确定要检测的函数集合,利用预处理技术对其进行插装和assert断言分析,再使用模型检测和并行化技术来检测程序的安全漏洞。主要内容包括生成函数关系调用图,通过对其分析来确定所要检测的C函数信息;利用约束分析技术对C程序源代码中涉及到得缓冲区属性信息进行提取,并利用缓冲区属性信息在变量声明、赋值、函数调用点插入相应的ASSERT语句信息;对插装后的代码作为进行可达性判定,分析程序中的危险点是否存在一条可达性路径来发现源代码中的安全漏洞。本发明结合约束分析的静态检测技术和模型检测以及并行化技术实现对缓冲区溢出等安全漏洞的检测,并且检测精度比一般的静态检测技术要高。
文档编号G06F11/36GK102567200SQ20111041710
公开日2012年7月11日 申请日期2011年12月14日 优先权日2011年12月14日
发明者李康, 王刚, 王欢, 王雷, 陈归 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1