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

技术编号:7523849 阅读:196 留言:0更新日期:2012-07-12 04:51
本发明专利技术涉及一种基于函数调用图的并行化安全漏洞检测方法。本发明专利技术通过分析C语言模块里的函数调用关系确定要检测的函数集合,利用预处理技术对其进行插装和assert断言分析,再使用模型检测和并行化技术来检测程序的安全漏洞。主要内容包括:生成函数关系调用图,通过对其分析来确定所要检测的C函数信息;利用约束分析技术对C程序源代码中涉及到得缓冲区属性信息进行提取,并利用缓冲区属性信息在变量声明、赋值、函数调用点插入相应的ASSERT语句信息;对插装后的代码作为进行可达性判定,分析程序中的危险点是否存在一条可达性路径来发现源代码中的安全漏洞。本发明专利技术结合约束分析的静态检测技术和模型检测以及并行化技术实现对缓冲区溢出等安全漏洞的检测,并且检测精度比一般的静态检测技术要高。

【技术实现步骤摘要】

本专利技术涉及一种源代码漏洞的并行检测方法。
技术介绍
随着信息技术的发展,计算机软件已经渗透到国民经济的各个领域中,并与人们的生产生活息息相关。软件的安全问题也越来越凸显其重要性,一些关键软件一旦遭到破坏,将会造成行业性乃至全国性的瘫痪。恶意的用户可以针对特定软件的错误,运行恶意的代码从而得到访问非法数据的权限。缓冲区溢出漏洞是目前这类安全漏洞中最主要的一种。恶意的用户可以通过分析程序的输入数据格式,并确定这些数据存放在程序的缓冲区中,这样用户就有可能通过特殊的输入数据,将栈空间的敏感数据覆盖掉,特别的将保存的返回地址替换为用户自己定义的非法代码的地址,这样非法用户就可以控制程序流程、执行非法操作。软件的漏洞可以通过静态方法和动态方法进行检测。静态方法分为一般的静态检测方法和基于完备理论的形式化验证方法,第一类主要是基于程序分析的方法检查代码中可能存在的漏洞;第二类方法则以形式逻辑、自动机理论为基础,验证程序是否具有某种性质。程序分析的方法不能够对程序的所有状态进行穷举,因此精确度欠佳,模型检测可以对所有程序的状态进行穷举,然而为了验证一个短小程序的性质,需要搜索的程序状态可能就非常庞大,因此纯模型检测的方法不能有效地进行漏洞检测。目前比较有效的一种模型检测方法是基于抽象-验证-细化范例的软件模型检测方法,代表工具是加州大学伯克利分校研制的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.分析调度模块在上一步的基础上完成了函数关系调用图的相关操作,分析调度模块的主要任务是分析调用图,在调用图的基础上调度整个检测过程。由于待检测的软件的模块性特征,来自不同调用子树的函数相关性很小或者没有相关性,因此,通过对函数关系调用图的分析, 我们可以对这样的一些函数做并行的检测。一方面,我们还考虑了过程间的敏感传递,也就是被调用者的参数处理会影响调用者的情况,以此,应该从较底层的函数开始检测;另一方面,由于是自底向上的调度检测,而且底层的函数一般分布在不同的模块里,相关性比较小,所以,实现并行相对比较容易。在分析调度中,我们首先分析待测模块信息所生成的函数关系调用图,查找出关系调用图中的叶节点,然后标记好需要检测的函数及其文件,最后调度检测工具对这些本文档来自技高网
...

【技术保护点】

【技术特征摘要】

【专利技术属性】
技术研发人员:王雷王刚王欢陈归李康
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术