本发明属于漏洞检测研究中的相似性漏洞检测技术领域,更具体地,涉及一种基于程序特征树的漏洞检测方法及系统。
背景技术:
在开发软件时经常会重用现有的代码,这种从现有代码中引入相同或者相似代码段的做法叫做“代码克隆”。代码克隆在大规模软件开发中应用非常多,大量的代码克隆不但会增大整个工程的维护难度,在被克隆代码段有漏洞时也会导致漏洞的扩散。
往往在漏洞补丁发布时代码克隆问题会被忽视,这样就导致了已经发布的漏洞因为代码克隆而发生扩散并且得不到修补。而攻击者就可以根据已经发布的补丁来挖掘代码克隆导致的漏洞,并对整个系统造成影响。因此我们迫切需要一个准确高效的方法来检测代码克隆导致的漏洞的存在。
目前克隆代码检测方法有基于度量、基于文本、基于语法和基于语义四类,其中以基于语义的算法较为准确。该技术主要以程序依赖图(programdependencegraph,pdg)技术为代表,即给定一个程序,根据程序语句之间的数据依赖和控制依赖关系建立一个pdg,该pdg中与漏洞pdg同构的子图所对应的代码段即被判定为克隆代码。与其他几类方法相比,基于pdg的算法从较高的层面来分析源代码,以获得程序的语义信息,所以这种方法可以检测到被打乱顺序但是语义相同的代码段。这几类方法各有优点,其中基于文本和基于语法的方法复杂度低可用于大规模软件,但是缺少语义的支持导致算法的误报率比较高。而基于语义的pdg技术虽然准确率比较高,但是不能处理代码中变量值被修改的问题,这就造成了漏报的发生。另一方面建立pdg和同构子图查找时间复杂度较高,尤其是同构子图的查找已经被证明为npc(npcomplete)问题,因此难以应用于大规模软件。也就是说,目前的漏洞检测系统有以下不足:
一方面基于度量、文本和语法的方案,因为没有充分的考虑代码的语义结构,不能在进行漏洞匹配的过程中真实的反应漏洞的特征,从而导致漏洞检测准确度比较低。而另一方面基于语义的漏洞检测方案虽然准确度有所提高,但是却不能处理代码中变量值被修改的问题,更重要的是这种方法基于pdg的子图同构来进行漏洞的检测,而npc复杂的子图同构问题导致了检测的效率非常低。
技术实现要素:
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于程序特征树的漏洞检测方法及系统,保证了大规模软件漏洞检测准确度的同时提高了系统的执行效率。有效解决基于度量、文本和语法方案漏洞检测准确度较低以及基于语义漏洞检测效率较低的技术问题。
为实现上述目的,按照本发明的一个方面,提供了一种基于程序特征树的漏洞检测方法,包括:
(1)分析漏洞函数代码生成漏洞程序依赖图,遍历漏洞程序依赖图生成漏洞程序特征树,以及,分析待测函数代码生成待测程序依赖图,遍历待测程序依赖图生成待测程序特征树;
(2)将漏洞程序特征树与待测程序特征树进行节点匹配,若漏洞程序特征树中的所有节点在待测程序特征树中均能找到匹配,则判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
优选地,步骤(1)具体包括以下步骤:
(1.1)分析漏洞函数代码生成漏洞程序依赖图,以及,分析待测函数代码生成待测程序依赖图,其中,漏洞程序依赖图与待测程序依赖图中均包括控制依赖关系与数据依赖关系;
(1.2)获取漏洞程序依赖图中每一个节点和边的属性值,并对漏洞程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,以及,获取待测程序依赖图中每一个节点和边的属性值,并对待测程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,其中,属性值包括节点类型和节点值;
(1.3)使用深度优先的方式分别遍历所述漏洞程序依赖图与所述待测程序依赖图中所有路径,在当前节点无后继节点或者重新回到环入口节点时才开始向上层回溯;
(1.4)在分别对所述漏洞程序依赖图与所述待测程序依赖图遍历的过程中分离数据依赖和控制依赖,分别生成漏洞程序特征树与待测程序特征树。
优选地,所述漏洞程序特征树与所述待测程序特征树均包括控制依赖树与数据依赖集,其中,控制依赖树中的节点与相应的程序依赖图中的节点对应,表示一个代码实体,控制依赖树中的每一条边与相应的程序依赖图中相应节点之间的控制依赖边对应,表示节点之间的控制依赖关系;
数据依赖集中的节点与相应的控制依赖树中的节点对应,数据依赖集中的边与相应的程序依赖图中相应节点之间的数据依赖边对应。
优选地,步骤(2)具体包括以下步骤:
(2.1)初始节点匹配:在待测程序特征树的控制依赖树中查找与漏洞程序特征树的控制依赖树中根节点相匹配的节点获得初始匹配节点集合;
(2.2)控制依赖匹配:在待测程序特征树的控制依赖树中,以初始匹配节点集合中的节点为根节点,依次向下进行与漏洞程序特征树的控制依赖树的匹配操作,并记录匹配的节点对,若漏洞程序特征树的控制依赖树中的所有节点均能在待测程序特征树的控制依赖树中找到匹配,则执行步骤(2.3),否则结束执行;
(2.3)数据依赖匹配:根据步骤(2.2)中控制依赖匹配后得到的匹配对,判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
按照本发明的另一方面,提供了一种基于程序特征树的漏洞检测系统,包括:
程序特征生成模块,用于分析漏洞函数代码生成漏洞程序依赖图,遍历漏洞程序依赖图生成漏洞程序特征树,以及,分析待测函数代码生成待测程序依赖图,遍历待测程序依赖图生成待测程序特征树;
漏洞检测模块,用于将漏洞程序特征树与待测程序特征树进行节点匹配,若漏洞程序特征树中的所有节点在待测程序特征树中均能找到匹配,则判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
优选地,所述程序特征生成模块包括:
程序依赖图生成模块,用于分析漏洞函数代码生成漏洞程序依赖图,以及,分析待测函数代码生成待测程序依赖图,其中,漏洞程序依赖图与待测程序依赖图中均包括控制依赖关系与数据依赖关系;
程序依赖图分析模块,用于获取漏洞程序依赖图中每一个节点和边的属性值,并对漏洞程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,以及,获取待测程序依赖图中每一个节点和边的属性值,并对待测程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,其中,属性值包括节点类型和节点值;
全路径遍历模块,用于使用深度优先的方式分别遍历所述漏洞程序依赖图与所述待测程序依赖图中所有路径,在当前节点无后继节点或者重新回到环入口节点时才开始向上层回溯;
程序特征树生成模块,用于在分别对所述漏洞程序依赖图与所述待测程序依赖图遍历的过程中分离数据依赖和控制依赖,分别生成漏洞程序特征树与待测程序特征树。
优选地,所述漏洞程序特征树与所述待测程序特征树均包括控制依赖树与数据依赖集,其中,控制依赖树中的节点与相应的程序依赖图中的节点对应,表示一个代码实体,控制依赖树中的每一条边与相应的程序依赖图中相应节点之间的控制依赖边对应,表示节点之间的控制依赖关系;
数据依赖集中的节点与相应的控制依赖树中的节点对应,数据依赖集中的边与相应的程序依赖图中相应节点之间的数据依赖边对应。
优选地,所述漏洞检测模块包括:
初始节点匹配模块,用于在待测程序特征树的控制依赖树中查找与漏洞程序特征树的控制依赖树中根节点相匹配的节点获得初始匹配节点集合;
控制依赖匹配模块,用于在待测程序特征树的控制依赖树中,以初始匹配节点集合中的节点为根节点,依次向下进行与漏洞程序特征树的控制依赖树的匹配操作,并记录匹配的节点对,若漏洞程序特征树的控制依赖树中的所有节点均能在待测程序特征树的控制依赖树中找到匹配,则执行数据依赖匹配,否则结束执行;
数据依赖匹配模块,用于根据控制依赖匹配后得到的匹配对,判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,主要有以下的技术优点:
(1)高准确性。相比于现有的漏洞检测方案,本发明充分考虑了程序的语义特性,有效降低了检测结果的误报率。同时又克服了现有大规模软件漏洞检测方案中不能容忍变量名称修改的问题,有效的降低了检测结果的漏报率。使得该方案可以准确的检测漏洞的出现。
(2)低开销。相比于现有基于语义的漏洞检测方案,本发明在保留了程序的语义的同时,将程序依赖图转换为程序特征树,避免了子图同构的高复杂度操作,降低了系统的时间开销。并且使用了控制依赖与数据依赖分离的技术,避免了大量的数据依赖对检测效率造成的影响,进一步提高了系统的执行效率。
(3)低耦合性。本发明在各个模块之间使用简单的接口连接,耦合性非常低,可以快速地完成模块的增删与修改。允许用户自定义模块功能级别,如映射类型的选择等。
附图说明
图1为本发明实施例公开的一种基于程序特征树的漏洞检测方法的流程示意图;
图2为本发明实施例公开的一种全路径遍历算法原理示意图;
图3为本发明实施例公开的一种基于程序特征树的漏洞检测框架的流程示意图;
图4为本发明实施例公开的一种基于程序特征树的漏洞检测系统的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
本发明的整体思路在于,开发者使用漏洞函数代码在待测函数代码中查找是否含有相似性漏洞,来解决因为代码克隆而导致的漏洞扩散问题。通过分析源代码语义生成程序依赖图,然后使用标识符映射的方法将图中各个节点值涉及到的标识符映射为同一值,以减少漏报的出现。通过使用全路径遍历法将标识符映射处理之后的程序依赖图转化为程序特征树。通过比较能够代表程序语义的程序特征树的相似性在待测函数中查找可能出现的漏洞。
如图1所示为本发明实施例公开的一种基于程序特征树的漏洞检测方法的流程示意图,包括以下步骤:
(1)分析漏洞函数代码生成漏洞程序依赖图,遍历漏洞程序依赖图生成漏洞程序特征树,以及,分析待测函数代码生成待测程序依赖图,遍历待测程序依赖图生成待测程序特征树;
(2)将漏洞程序特征树与待测程序特征树进行节点匹配,若漏洞程序特征树中的所有节点在待测程序特征树中均能找到匹配,则判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
作为一种可选的实施方式,步骤(1)具体包括以下步骤,参考图2所示:
(1.1)分析漏洞函数代码生成漏洞程序依赖图,以及,分析待测函数代码生成待测程序依赖图,其中,漏洞程序依赖图与待测程序依赖图中均包括控制依赖关系与数据依赖关系;
(1.2)获取漏洞程序依赖图中每一个节点和边的属性值,并对漏洞程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,以及,获取待测程序依赖图中每一个节点和边的属性值,并对待测程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,其中,属性值包括节点类型和节点值,映射方式为:按照标识符的类型,将相同类型的标识符映射为相同的值;
(1.3)使用深度优先的方式分别遍历所述漏洞程序依赖图与所述待测程序依赖图中所有路径,在当前节点无后继节点或者重新回到环入口节点时才开始向上层回溯;
(1.4)在分别对所述漏洞程序依赖图与所述待测程序依赖图遍历的过程中分离数据依赖和控制依赖,分别生成漏洞程序特征树与待测程序特征树。
其中,采用步骤(1.4)在遍历的过程中分离数据依赖和控制依赖,可以消除数据依赖边爆炸对漏洞检测效率的影响,使遍历中遇到的节点和控制依赖边重新构造出控制依赖树,并使数据依赖边构造出数据依赖集。其中:
控制依赖树中的节点对应到图中的唯一节点;控制依赖树中的边对应到图中相应节点之间的控制依赖边;数据依赖集中的节点对应到控制依赖树的节点;数据依赖集中的边对应到图中相应节点之间的数据依赖边。
如图3所示为本发明实施例公开的一种基于程序特征树的漏洞检测框架的流程示意图,包括以下步骤:
(2.1)初始节点匹配:在待测程序特征树的控制依赖树中查找与漏洞程序特征树的控制依赖树中根节点相匹配的节点获得初始匹配节点集合;
(2.2)控制依赖匹配:在待测程序特征树的控制依赖树中,以初始匹配节点集合中的节点为根节点,依次向下进行与漏洞程序特征树的控制依赖树的匹配操作,并记录匹配的节点对,若漏洞程序特征树的控制依赖树中的所有节点均能在待测程序特征树的控制依赖树中找到匹配,则执行步骤(2.3),否则结束执行;
(2.3)数据依赖匹配:根据步骤(2.2)中控制依赖匹配后得到的匹配对,判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
如图4所示为本发明实施例公开的一种基于程序特征树的漏洞检测系统的结构示意图,包括以下模块:
程序特征生成模块,用于分析漏洞函数代码生成漏洞程序依赖图,遍历漏洞程序依赖图生成漏洞程序特征树,以及,分析待测函数代码生成待测程序依赖图,遍历待测程序依赖图生成待测程序特征树;
其中,程序特征生成模块包括:
程序依赖图生成模块,用于分析漏洞函数代码生成漏洞程序依赖图,以及,分析待测函数代码生成待测程序依赖图,其中,漏洞程序依赖图与待测程序依赖图中均包括控制依赖关系与数据依赖关系;
程序依赖图分析模块,用于获取漏洞程序依赖图中每一个节点和边的属性值,并对漏洞程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,以及,获取待测程序依赖图中每一个节点和边的属性值,并对待测程序依赖图中所有的节点值涉及到的标识符按照类型进行映射,其中,属性值包括节点类型和节点值;
全路径遍历模块,用于使用深度优先的方式分别遍历所述漏洞程序依赖图与所述待测程序依赖图中所有路径,在当前节点无后继节点或者重新回到环入口节点时才开始向上层回溯;
程序特征树生成模块,用于在分别对所述漏洞程序依赖图与所述待测程序依赖图遍历的过程中分离数据依赖和控制依赖,分别生成漏洞程序特征树与待测程序特征树。
其中,漏洞程序特征树与待测程序特征树均包括控制依赖树与数据依赖集,其中,控制依赖树中的节点与相应的程序依赖图中的节点对应,表示一个代码实体,控制依赖树中的每一条边与相应的程序依赖图中相应节点之间的控制依赖边对应,表示节点之间的控制依赖关系;
数据依赖集中的节点与相应的控制依赖树中的节点对应,数据依赖集中的边与相应的程序依赖图中相应节点之间的数据依赖边对应。
漏洞检测模块,用于将漏洞程序特征树与待测程序特征树进行节点匹配,若漏洞程序特征树中的所有节点在待测程序特征树中均能找到匹配,则判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
其中,漏洞检测模块包括:
初始节点匹配模块,用于在待测程序特征树的控制依赖树中查找与漏洞程序特征树的控制依赖树中根节点相匹配的节点获得初始匹配节点集合;
控制依赖匹配模块,用于在待测程序特征树的控制依赖树中,以初始匹配节点集合中的节点为根节点,依次向下进行与漏洞程序特征树的控制依赖树的匹配操作,并记录匹配的节点对,若漏洞程序特征树的控制依赖树中的所有节点均能在待测程序特征树的控制依赖树中找到匹配,则执行数据依赖匹配,否则结束执行;
数据依赖匹配模块,用于根据控制依赖匹配后得到的匹配对,判断待测程序特征树中与漏洞程序特征树匹配的各节点之间是否存在与漏洞程序特征树相同的数据依赖关系,若存在,则待测函数代码中存在漏洞。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。