一种基于规则库的编译期代码安全检测方法

文档序号:10552744阅读:198来源:国知局
一种基于规则库的编译期代码安全检测方法
【专利摘要】本发明实现了一种基于规则库的编译期代码安全检测方法,具体包括以下内容:将安全漏洞用规则库符号表示,对源代码进行预处理、词法分析、语法分析,由语法分析的结果构建出抽象语法树(Abstract Syntax Tree,AST),遍历AST节点得到所需的信息,将所得信息交付于规则库处理对比,对于错误的代码进行标记及提示,记录编译期的信息及错误成立条件,为后面的动态测试提供辅助信息。本发明采用了静态分析与辅助动态分析相结合的方法,在编译期分析阶段,及时对不安全代码进行高覆盖率检测,并且利用冗余消除技术手段降低检测开销,在辅助动态分析阶段,利用编译期的信息进一步消除漏洞。结合以上两种手段,本发明能够以一种高覆盖率、高准确率、低开销的方式进行检测。
【专利说明】
一种基于规则库的编译期代码安全检测方法
技术领域
[0001 ]本发明属于计算机系统软件领域,更具体地,涉及一种基于规则库的编译期代码安全检测方法。
【背景技术】
[0002]编译器的流程由三部分组成,第一个部分是前端分析器,负责对源代码进行预处理、词法分析、语法分析、语义分析,并且最终生成没有错误的中间代码(IR),第二个部分是中间代码的优化,编译器对中间代码进行优化以提高效率,第三个部分是后端,后端负责将中间代码生成平台相关的二进制代码来执行。
[0003]LLVM是构建编译器(compiler)的框架系统,以C++编写而成,利用其提供的接口可以方便的对程序进行分析优化,本发明中用到的AST就是来自于LLVM的Clang编译器,AST的节点分为3种,分别是声明(dec I )、语句(stmt )、类型(type ),利用这些节点的信息,可以有效的对程序进行分析。
[0004]在这个信息爆炸的时代,安全漏洞带来的问题日益严重,用户的隐私和财产受到极大的威胁,缓冲区溢出、内存泄露、SQL注入等安全漏洞让黑客有机可乘,检测这些系统软件安全漏洞显得迫在眉睫。
[0005]已有一些检测技术能够在一定程度上检测出安全漏洞,但是它们各有优缺点,仍存在一些不足之处。
[0006]程序静态分析技术指的是在不执行源程序的情况下,利用词法分析、语法分析、控制流以及数据流分析等技术手段对程序源代码进行分析,并进一步验证代码是否满足规范和安全。目前的静态分析技术,还有符号执行、抽象解释等方法,能够发现很多动态测试才能发现的缺陷。但是目前的主流的静态分析工具能够报出的缺陷种类只有几百种,并且存在误报率高的问题。
[0007]程序动态分析技术指的是通过具体运行测试程序,检测运行结果与预期结果的差异,分析运行效率、正确性和健壮性等指标。这种方法由三部分组成:构造测试用例,执行程序,分析程序的输出结果。动态分析的缺陷很明显,比较依赖于特定的测试用例,因此检测覆盖率较低,特别地,因为需要对源程序进行真实执行,也存在着高额的运行时开销。
[0008]现有的这些技术可以在一定程度下解决安全漏洞问题,但是静态分析存在误报率较高的问题,动态测试又存在开销太大的问题。

【发明内容】

[0009]针对现有技术的缺陷,本发明的目的在于提供一种基于规则库的编译期代码安全检测方法,旨在解决现有方法中存在的开销过大、误报率高等技术问题。
[0010]为实现上述目的,本发明提供了一种基于规则库的编译期代码安全检测方法,包括以下步骤:
[0011 ] (I)将安全漏洞用规则库符号表示;
[0012](2)对源代码进行预处理、词法分析以及语法分析,根据语法分析的结果构建出没有语法错误的抽象语法树(AST);
[0013](3)利用编译器框架的接口,借助步骤(2)的信息,对AST的节点(node)进行遍历,收集需要检测的安全漏洞的相关信息;其子步骤为:
[OOM] (3-1)对于缓冲区溢出,其规则符号表示为buf [i] (i〈0 | | i>bufsize),buf是一个缓冲区数组,i为缓冲区索引的位置,bufsize为缓冲区大小即数组大小,当索引位置超过数组大小时或者索引位置小于O时,即为缓冲区溢出,获取索引位置i以及缓冲区大小bufsize;
[0015](3-2)由于存在隐式的指针数组操作,通过AST节点信息,找到将数组地址赋给指针的语句,将隐式指针数组操作转换为显示的数组索引操作;
[0016](3-3)由于数组索引操作大量存在于循环之中,获取索引位置i转换为获取循环边界;
[0017](3-4)分别回溯语法树其定义处,找出对应的索引位置信息和缓冲区大小信息;
[0018](4)若步骤(3)没有收集到足够的信息,转到步骤(5).’将步骤(3)收集的信息交给规则库进行对比分析,得出相应的结果信息,对存在安全漏洞的程序代码进行标记,并且给出错误提示信息;流程结束。
[0019](5)对于不能在编译期解决的问题,输出该安全漏洞成立时的条件,辅助之后的动态测试。
[0020]本发明的一个实施例中,所述步骤(I)的规则库提取方式为人为总结,但也可通过机器学习的方式学习出新的漏洞规则。
[0021]本发明的一个实施例中,所述步骤(2)得到源代码的抽象语法树(AST)表示的方法为:使用LLVM-Clang0
[0022]本发明的一个实施例中,所述步骤(3-2)中获取缓冲区溢出中数组索引位置的方法为:通过将隐式的指针数组操作转化为显示的数组索引操作。
[0023]本发明的一个实施例中,所述步骤(3-3)中获取缓冲区溢出中数组索引位置的方法为:由于大多数缓冲区操作集中在循环中,将寻找数组索引位置转化为寻找循环边界的次数。
[0024]本发明的一个实施例中,所述步骤(3-4)中获取缓冲区溢出中缓冲区大小以及索引位置的方法为:回溯语法树,找到数组限定大小以及索引位置信息。
[0025]本发明的一个实施例中,所述步骤(4)给出错误信息方法为:标记代码且给出错误信息,且有通过其他技术手段直接修复错误的可能。
[0026]本发明的一个实施例中,所述步骤(5)给出错误信息方法为:记录编译期的相关信息及错误成立条件,为之后的动态测试提供信息。
[0027]通过本发明所构思的以上技术方案,与现有技术相比,本发明的系统具有以下的优点和技术效果:
[0028]1、由于采用了步骤(I)将软件漏洞提取为规则库,增强了平台的可扩展性。
[0029]2、由于采用了步骤(3-2),程序中的指针操作是大量存在的,将检测指针转换为了统一的显示数组索引操作,降低了检测开销。
[0030]3、由于采用了步骤(3-3),对于一个循环量很大的缓冲区操作来说,将大量的检测操作转为了只检测一次循环边界信息,提高了检测的效率。
[0031]4、由于采用了步骤(4),在编译期就能发现出软件安全漏洞,能够最早的发现错误,将修复的代价降到了最低。
[0032]5、由于采用了步骤(5),可以提供编译期的信息帮助动态测试,大大降低了动态测试的复杂性。
【附图说明】
[0033]图1为本发明基于规则库的编译期代码安全检测方法模块框图;
[0034]图2为本发明基于规则库的编译期代码安全检测方法的流程图;
[0035]图3为本发明基于规则库的编译期代码安全检测方法缓冲区溢出检测原理图。
【具体实施方式】
[0036]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0037]如图1所示,基于规则库的编译期代码安全检测方法由3个部分组成,分别是LLVMClang编译器模块,抽象语法树(AST)遍历,规则库。第一个部分是LLVM Clang编译器模块,这是一个方便程序代码分析的开源编译器框架,利用其提供的接口,我们可以对源代码进行词法分析、语法分析、最后生成没有语法错误的AST。第二个部分是对AST的节点进行遍历,AST的节点分为3种,分别是声明(dec I)、语句(stmt)、类型(type),由编译单元(Translat1nunit)为顶层节点的树组成,遍历到复合语句(CoumpoundStmt ),可以方便的定位到循环节点以及变量的定义处,结合具体的规则在AST上获取相应的信息。第三个部分是规则库,这是安全漏洞的集合,以规则库的形式表现,对第二个部分的信息进行处理分析,给出相应的提示信息。
[0038]如图2所示,基于规则库的编译期代码安全检测方法的包括以下步骤:
[0039](I)将安全漏洞用规则库符号表示,其方法包括人工经验以及机器学习的方法;
[0040](2)对源代码进行预处理、词法分析以及语法分析,根据语法分析的结果构建出没有语法错误的抽象语法树(AST),本步骤借助了 LLVM编译器框架;
[0041](3)利用编译器框架的接口,借助步骤(2)的信息,对AST的节点(node)进行遍历,收集需要检测的安全漏洞的相关信息;其子步骤为:
[0042](3-1)对于缓冲区溢出,其规则符号表示为buf [i] (i〈0 | | i>bufsize),buf是一个缓冲区数组,i为缓冲区索引的位置,bufsize为缓冲区大小即数组大小,当索引位置超过数组大小时或者索引位置小于O时,即为缓冲区溢出,获取索引位置i以及缓冲区大小bufsize;
[0043](3-2)由于存在隐式的指针数组操作,通过AST节点信息,找到将数组地址赋给指针的语句,将隐式指针数组操作转换为显示的数组索引操作;
[0044](3-3)由于数组索引操作大量存在于循环之中,获取索引位置i转换为获取循环边界;在图3中对索引位置j的获取转换为获取loop:j = 20;从而将20次检测变成了一次,且将不能确定的索引位置变量转换成可以解决的循环边界问题;
[0045](3-4)分别回溯语法树其定义处,找出对应的索引位置信息和缓冲区大小信息;
[0046](4)若步骤(3)没有收集到足够的信息,转到步骤(5).’将步骤(3)收集的信息交给规则库进行对比分析,得出相应的结果信息,对存在安全漏洞的程序代码进行标记,并且给出错误提示信息;结合图3的信息,可以发现语句2、语句6和语句8是存在缓冲区溢出的,标记这3处代码,并且输出提示信息数组索引位置超出了数组范围。
[0047](5)对于不能在编译期解决的问题,输出该安全漏洞成立时的条件,辅助之后的动态测试;结合图3的信息,可以发现语句10在编译时是无法解决的,记录编译时的信息以及错误成立的条件:k>10,辅助后面的动态测试。
[0048]本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【主权项】
1.一种基于规则库的编译期代码安全检测方法,其特征在于,包括以下步骤: (1)将安全漏洞用规则库符号表示; (2)对源代码进行预处理、词法分析以及语法分析,根据语法分析的结果构建出没有语法错误的抽象语法树AST ; (3)利用编译器框架的接口,借助步骤(2)的信息,对AST的节点(node)进行遍历,收集需要检测的安全漏洞的相关信息; (4)若步骤(3)没有收集到足够的信息,转到步骤(5);否则将步骤(3)收集的信息交给规则库进行对比分析,得出相应的结果信息,对存在安全漏洞的程序代码进行标记,并且给出错误提示信息;流程结束。 (5)对于不能在编译期解决的问题,输出该安全漏洞成立时的条件,辅助之后的动态测试。2.根据权利要求1所述的方法,其特征在于,所述步骤(3)包括如下子步骤: (3-1)对于缓冲区溢出,其规则符号表示为buf[i](i〈0| |i>bufsize),buf是一个缓冲区数组,i为缓冲区索引的位置,bufsize为缓冲区大小即数组大小,当索引位置超过数组大小时或者索引位置小于O时,即为缓冲区溢出,获取索引位置i以及缓冲区大小bufsize; (3-2)通过AST节点信息,找到将数组地址赋给指针的语句,将隐式指针数组操作转换为显示的数组索引操作; (3-3)获取索引位置i转换为获取循环边界; (3-4)分别回溯语法树其定义处,找出对应的索引位置信息和缓冲区大小信息。3.根据权利要求1或2所述的方法,其特征在于,所述步骤(I)中规则库为人工经验或者机器学习的方法得到。4.根据权利要求1或2所述的方法,其特征在于,所述步骤(2)得到源代码的抽象语法树表示的方法为:使用LLVM-Clang。5.根据权利要求2所述的方法,其特征在于,所述步骤(3-2)中获取缓冲区溢出中数组索引位置的方法为:通过将隐式的指针数组操作转化为显示的数组索引操作。6.根据权利要求2所述的方法,其特征在于,所述步骤(3-3)中获取缓冲区溢出中数组索引位置的方法为:将寻找数组索引位置转化为寻找循环边界的次数。7.根据权利要求2所述的方法,其特征在于,所述步骤(3-4)中获取缓冲区溢出中缓冲区大小以及索引位置的方法为:回溯语法树,找到数组限定大小以及索引位置信息。8.根据权利要求1或2所述的方法,其特征在于,所述步骤(4)给出错误信息方法为:标记代码且给出错误信息,且有通过其他技术手段直接修复错误的可能。9.根据权利要求1或2所述的方法,其特征在于,所述步骤(5)给出错误信息方法为:记录编译期的相关信息及错误成立条件,为之后的动态测试提供信息。
【文档编号】G06F9/45GK105912381SQ201610269945
【公开日】2016年8月31日
【申请日】2016年4月27日
【发明人】金海 , 杜铁, 郑龙, 廖小飞, 邹德清
【申请人】华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1