一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种目标程序缺陷报告筛选方法及装置与流程

2021-10-24 12:59:00 来源:中国专利 TAG:
1.本发明涉及软件缺陷检测
技术领域
:,具体涉及一种目标程序缺陷报告筛选方法及装置。
背景技术
::2.静态分析工具被广泛应用于软件缺陷检测,当前存在多款商业和开源工具,这些工具采用了多种近似和抽象技术手段以高效地分析规模比较大的软件中存在的缺陷,但是,使用静态分析工具对软件进行检测时,存在大量的误报,用户难以快速地从缺陷报告中获取有用的信息。技术实现要素:3.因此,本发明要解决的技术问题在于克服现有技术中的通过静态分析工具对软件进行检测时存在大量误报的缺陷,从而提供一种目标程序缺陷报告筛选方法。4.本发明第一方面提供了一种目标程序缺陷报告筛选方法,包括:获取目标程序的缺陷报告,根据缺陷报告确定缺陷起始位置、触发缺陷程序指令,以及缺陷报告所指出的目标程序存在的缺陷;采用符号执行和静态分析,对从缺陷起始位置到触发缺陷程序指令的待搜索路径进行分析,判断缺陷起始位置与触发缺陷程序指令之间是否存在满足缺陷的触发条件的易受攻击路径,目标程序中存在一条或多条从缺陷起始位置到触发缺陷程序指令的待搜索路径;若缺陷起始位置与触发缺陷程序指令之间不存在易受攻击路径,则判定缺陷报告为误报。5.可选地,在本发明提供的目标程序缺陷报告筛选方法中,采用符号执行和静态分析,对从缺陷起始位置到触发缺陷程序指令的待搜索路径进行分析,判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径,包括:分别对各待搜索路径中的程序指令进行遍历,根据待搜索路径中各程序指令的符号执行结果或静态分析结果更新待搜索路径的符号状态;根据待搜索路径的符号状态判断待搜索路径是否满足缺陷的触发条件;若待搜索路径满足触发条件,则判定缺陷起始位置与触发缺陷程序指令之间存在易受攻击路径。6.可选地,在本发明提供的目标程序缺陷报告筛选方法中,若预设时长内未检测到满足触发条件的待搜索路径,则判定缺陷起始位置与触发缺陷程序指令之间不存在易受攻击路径。7.可选地,在本发明提供的目标程序缺陷报告筛选方法中,对待搜索路径中的程序指令进行遍历,根据待搜索路径中各程序指令的符号执行结果或静态分析结果更新待搜索路径的符号状态,包括:对目标程序中的各程序指令进行静态分析,将目标程序转换为内存静态单赋值形式,并根据转换为内存静态单赋值形式的目标程序构建值流图;以缺陷起始位置为起点,遍历待搜索路径中的每一条程序指令,根据值流图判断当前程序指令是否满足跳过条件;若当前程序指令满足跳过条件,则根据当前程序指令的静态分析结果更新符号状态。8.可选地,本发明提供的目标程序缺陷报告筛选方法还包括,若当前程序指令不满足跳过条件,则根据当前程序指令的符号执行结果更新符号状态。9.可选地,在本发明提供的目标程序缺陷报告筛选方法中,在根据值流图判断当前程序指令是否满足跳过条件的步骤之前,还包括:若从缺陷起始位置到当前程序指令的距离小于或等于最大搜索路径长度,执行根据值流图判断当前程序指令是否满足跳过条件,若当前程序指令满足跳过条件,且当前程序指令的静态分析结果与待搜索路径当前的符号状态的属性一致,则根据当前程序指令的静态分析结果更新符号状态的步骤;若从缺陷起始位置到当前程序指令的距离大于最大搜索路径长度,判定待搜索路径不满足缺陷的触发条件。10.可选地,在本发明提供的目标程序缺陷报告筛选方法中,在根据缺陷报告确定缺陷起始位置、触发缺陷程序指令,以及缺陷报告所指出的目标程序存在的缺陷的步骤之后,采用符号执行和静态分析,对从缺陷起始位置到触发缺陷程序指令的待搜索路径进行分析的步骤之前,还包括:删除目标程序中与缺陷起始位置、触发缺陷程序指令、待搜索路径没有数据依赖性和控制依赖性的程序指令,形成简化后的目标程序。11.本发明第二方面提供了一种目标程序缺陷报告筛选装置,包括:缺陷报告获取模块,用于获取目标程序的缺陷报告,根据缺陷报告确定缺陷起始位置、触发缺陷程序指令,以及缺陷报告所指出的目标程序存在的缺陷;路径搜索模块,用于采用符号执行和静态分析,对从缺陷起始位置到触发缺陷程序指令的待搜索路径进行分析,判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径,目标程序中存在一条或多条从缺陷起始位置到触发缺陷程序指令的待搜索路径;缺陷报告筛选模块,若缺陷起始位置与触发缺陷程序指令之间不存在满足缺陷的触发条件的易受攻击路径,缺陷报告筛选模块用于判定缺陷报告为误报。12.本发明第三方面提供了一种计算机设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器;其中,存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,从而执行如本发明第一方面提供的目标程序缺陷报告筛选方法。13.本发明第四方面提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机指令,计算机指令用于使计算机执行如本发明第一方面提供的目标程序缺陷报告筛选方法。14.本发明技术方案,具有如下优点:15.本发明提供了一种目标程序缺陷报告筛选方法及装置,在获取到目标程序的缺陷报告后,对缺陷起始位置和触发缺陷程序指令之间的待搜索路径进行了分析,并判断待搜索路径中是否存在易受攻击路径,若不存在易受攻击路径,则判定该缺陷报告为误报,由此实现了对缺陷报告的筛选,用户能够从筛选后的缺陷报告中快速获取目标程序存在的真实的缺陷信息,并且,若只通过符号执行对待搜索路径进行分析,需要采用符号执行搜索待搜索路径中的全部程序指令,从而判断该待搜索路径是否为易受攻击路径,在本发明提供的目标程序缺陷报告筛选方法及装置中,结合符号执行和静态分析对缺陷起始位置和触发缺陷程序指令之间的待搜索路径进行分析时,可以基于静态分析结果跳过部分程序指令,即,通过实施本发明不需要采用符号执行搜索待搜索路径中的全部程序指令,提高了待搜索路径的分析效率。基于上述分析,通过实施本发明能够快速判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径,从而快速完成对目标程序的缺陷报告的筛选,用户能够从筛选后的缺陷报告中获得目标程序真实存在的缺陷。附图说明16.为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。17.图1为本发明实施例提供的目标程序缺陷报告筛选方法的流程图;18.图2为本发明实施例中提供的目标程序;19.图3为本发明实施例中转换为memory‑ssa形式的目标程序;20.图4为本发明实施例中提供的llvm指令集;21.图5为本发明实施例中入μ和χ的标准规则及指令;22.图6为本发明实施例中为目标程序构建的值流图;23.图7为本发明实施例中构建值流图所使用的值流相关规则;24.图8为本发明实施例中构建值流图所使用的值流汇总规则;25.图9为本发明实施例中的符号状态;26.图10为本发明实施例中符号执行指令时的标准语义规则;27.图11为本发明实施例中根据静态分析结果更新符号状态时所使用的相应的规则;28.图12为本发明实施例中对缺陷报告进行筛选时所分析的所有待搜索路径;29.图13为本发明实施例中用于评估目标程序缺陷报告筛选方法的21个真实的开源应用;30.图14为本发明实施例中juliet测试套件的实验结果;31.图15为本发明实施例中21个真实应用的实验结果;32.图16(a)为本发明实施例中在不同时间限制下追踪潜在的“释放后重用”漏洞的结果;33.图16(b)为本发明实施例中在不同时间限制下追踪潜在的“空指针解引用”漏洞的结果;34.图16(c)为本发明实施例中追踪潜在的“释放后重用”漏洞时,采用不同策略对缺陷报告筛选的影响;35.图16(d)为本发明实施例中追踪潜在的“空指针解引用”漏洞时,采用不同策略对缺陷报告筛选的影响36.图17为本发明实施例提供的目标程序缺陷报告筛选装置的结构框图;37.图18为本发明实施例提供的计算机设备的结构框图。具体实施方式38.下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。39.本发明实施例提供了一种目标程序缺陷报告筛选方法,如图1所示,包括:40.步骤s10:获取目标程序的缺陷报告,根据缺陷报告确定缺陷起始位置、触发缺陷程序指令,以及缺陷报告所指出的目标程序存在的缺陷。41.在一可选实施例中,目标程序由大量的程序指令组成,可以采用静态分析工具对目标程序进行检测,从而获取目标程序的缺陷报告。42.在一可选实施例中,对目标程序指令进行检测后,通常会得到多个缺陷报告,每个缺陷报告是由<source,sink,{steps}>组成的三元组,source表示缺陷起始位置,sink表示触发缺陷程序指令,{steps}表示包含从缺陷起始位置到缺陷触发程序指令的一组关键路径点集合。通过缺陷报告中的信息,能够进一步提取很可能触发所报告缺陷的“分步”路径,即待搜索路径。43.步骤s20:采用符号执行和静态分析,对从缺陷起始位置到触发缺陷程序指令的待搜索路径进行分析,判断缺陷起始位置与触发缺陷程序指令之间是否存在满足缺陷的触发条件的易受攻击路径,目标程序中存在一条或多条从缺陷起始位置到触发缺陷程序指令的待搜索路径。44.在一可选实施例中,符号执行技术会系统地检验每一条路径,容易出现路径爆炸问题,本发明实施例中采用符号执行和静态分析相结合的方法对待搜索路径进行分析,通过静态分析结果选择性地跳过某些程序指令,无需通过符号执行技术检验每一条路径,提高了对待搜索路径的分析效率。45.若缺陷起始位置与触发缺陷程序指令之间不存在易受攻击路径,则判定缺陷报告为误报;若缺陷起始位置与触发缺陷程序指令之间存在易受攻击路径,则判定缺陷报告为真实报告。46.在一可选实施例中,对于不同类型的缺陷,都有其相应的触发条件,只有在程序指令执行过程中满足触发条件时,才认为目标程序存在该缺陷,因此,在判断缺陷报告是否存在误报时,判断缺陷起始位置与触发缺陷程序指令之间是否存在满足触发条件的待搜索路径,若存在,则判定该缺陷报告是真实报告,若不存在,则判定该缺陷报告为误报。47.在一可选实施例中,缺陷起始位置与触发缺陷程序指令之间存在多条待搜索路径,判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径时,依次检测每条待搜索路径,当检测到一条待搜索路径为易受攻击路径时,停止对其他待搜索路径的检测,判定缺陷报告不是误报。48.在一可选实施例中,当缺陷起始位置与触发缺陷程序指令之间存在较多的待搜索路径时,若对全部的待搜索路径都进行分析,则容易出现分析时间较长的问题,因此,当预设时长内未检测到易受攻击路径,则判定缺陷起始位置与触发缺陷程序指令之间不存在易受攻击路径,缺陷报告为误报,在一可选实施例中,预设时长可以为5s、10s、50s、100s等。49.本发明实施例提供了一种目标程序缺陷报告筛选方法,在获取到目标程序的缺陷报告后,对缺陷起始位置和触发缺陷程序指令之间的待搜索路径进行了分析,并判断待搜索路径中是否存在易受攻击路径,若不存在易受攻击路径,则判定该缺陷报告为误报,由此实现了对缺陷报告的筛选,用户能够从筛选后的缺陷报告中快速获取目标程序存在的真实的缺陷信息,并且,若只通过符号执行对待搜索路径进行分析,需要采用符号执行搜索待搜索路径中的全部程序指令,从而判断该待搜索路径是否为易受攻击路径,在本发明实施例提供的目标程序缺陷报告筛选方法中,结合符号执行和静态分析对缺陷起始位置和触发缺陷程序指令之间的待搜索路径进行分析时,可以基于静态分析结果跳过部分程序指令,即,通过实施本发明实施例不需要采用符号执行搜索待搜索路径中的全部程序指令,提高了待搜索路径的分析效率。基于上述分析,通过实施本发明实施例能够快速判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径,从而快速完成对目标程序的缺陷报告的筛选,用户能够从筛选后的缺陷报告中获得目标程序真实存在的缺陷。50.在一可选实施例中,上述步骤s20具体包括:51.首先,分别对各待搜索路径中的程序指令进行遍历,根据待搜索路径中各程序指令的符号执行结果或静态分析结果更新待搜索路径的符号状态。52.在一可选实施例中,在对待搜索路径进行分析时,从缺陷起始位置出发,依次对缺陷起始位置到触发缺陷程序指令之间的各程序指令进行分析,从而得到待搜索路径的分析结果,待搜索路径的分析结果为待搜索路径的符号状态。53.在一可选实施例中,对待搜索路径进行分析时,会依次对待搜索路径中的每条程序指令进行分析,在对每一条程序指令进行分析后,根据其符号执行结果或静态分析结果形成符号状态,以该符号状态替代根据上一条程序指令形成的符号状态作为待搜索路径的当前符号状态。54.然后,根据待搜索路径的符号状态判断待搜索路径是否满足缺陷的触发条件。55.在一可选实施例中,每更新一次待搜索路径的符号状态,都会根据该符号状态判断是否满足缺陷的触发条件,当根据当前符号状态检测到满足缺陷的触发条件时,判定该待搜索路径为易受攻击路径,停止对该待搜索路径的分析。56.若待搜索路径满足触发条件,则判定缺陷起始位置与触发缺陷程序指令之间存在易受攻击路径。57.在一可选实施例中,不同的缺陷对应不同的触发条件,示例性地,当缺陷为空指针解引用时,对应的触发条件为:特定指令对相应程序符号状态中标记为空(null)的指针进行了解引用操作。即,当根据符号状态执行待搜索路径时,若待搜索路径可行(feasible),且在缺陷报告中标记为sink的特定指令上满足上述触发条件,则认为当前待搜索路径为易受攻击路径。58.在一可选实施例中,对其中一条待搜索路径进行分析时,对待搜索路径中的程序指令进行遍历,根据待搜索路径中各程序指令的符号执行结果或静态分析结果更新待搜索路径的符号状态,包括:59.首先,对目标程序中的各程序指令进行静态分析,将目标程序转换为内存静态单赋值(memory‑ssa)形式,并根据转换为内存静态单赋值形式的目标程序构建值流图(valueflowgraph)。在本发明实施例中,构建的值流图具备上下文敏感属性和流敏感属性,值流图捕获了目标程序中所有指针变量在过程内和过程间的定义使用链。60.然后,以缺陷起始位置为起点,遍历待搜索路径中的每一条程序指令,根据值流图判断当前程序指令是否满足跳过条件。61.在一可选实施例中,判断程序指令是否可以跳过的跳过条件可以为通用条件,也可以为根据缺陷报告中指出的类型设定的特定条件。示例性地,在实践中,指针别名(pointeralias)是产生不精确分析结果的主要来源之一,可以将程序指令不会导致可疑别名增加(即不会导致一个指针具有多个指向值)作为通用条件,即,若执行当前程序指令时不会导致别名增加,则表示当前程序指令满足跳过条件。示例性地,通用条件可以为当前程序指令为调用外部未知应用程序接口,因为即使在执行外部未知应用程序接口中出现错误,也可认为是外部位置应用程序的缺陷,而不是目标程序本身的缺陷,因此,若当前程序指令为调用外部未知应用程序接口,可以直接跳过。当缺陷报告中指出的缺陷为释放后使用时,特定条件可以为当前程序指令是对指定指针的无条件释放,当缺陷报告中指出的缺陷为空指针解引用时,特定条件可以为当前程序指令包含对特定指针的非空判断。62.若当前程序指令满足跳过条件,则根据当前程序指令的静态分析结果更新符号状态。若当前程序指令满足跳过条件,则认为根据当前程序指令的静态分析的结果产生的符号状态与符号执行当前程序指令所产生的符号状态是一致的,又由于符号执行当前程序指令用时较长,因此,若当前程序指令满足跳过条件,则根据当前程序指令的静态分析结果更新符号状态。63.若当前程序指令不满足跳过条件,则根据当前程序指令的符号执行结果更新符号状态。64.在一可选实施例中,可以设置一种受限的抽象符号状态,使每个指针最多指向一个目标,从而通过解释每条指令的方式或通过静态分析信息来更新符号状态。65.在一可选实施例中,为了实现对待搜索路径的快速分析,同时为了缓解路径爆炸问题,对分析待搜索路径时的计算资源进行了限制:设置最大搜索路径长度,若从缺陷起始位置到当前程序指令的距离里小于或等于最大搜索路径长度,则采用当前程序指令的符号执行结果或静态分析结果更新待搜索路径的符号状态,并根据待搜索路径的符号状态判断待搜索路径是否满足缺陷的触发条件。若从缺陷起始位置到当前程序指令的距离大于最大搜索路径长度,判定待搜索路径不满足缺陷的触发条件。示例性地,最大搜索路径长度可以设置为500步。66.在一可选实施例中,为了实现对待搜索路径的快速分析,在根据缺陷报告确定缺陷起始位置、触发缺陷程序指令之后,先对目标程序进行切片,即,删除目标程序中与缺陷起始位置、触发缺陷程序指令、待搜索路径没有数据依赖性和控制依赖性的程序指令,形成简化后的目标程序,然后采用符号执行和静态分析,判断简化后的目标程序中,缺陷起始位置到触发缺陷程序之间是否存在易受攻击路径。经实验验证,在对目标程序进行切片处理后,在根据简化后的目标程序判断缺陷报告是否为误报时,计算机设备的内存使用量减少了13.05%,并将计算机设备运行时性能提高了9.3%。67.在一可选实施例中,缺陷起始位置与触发缺陷程序指令之间具有多条待搜索路径,可以执行不同的路径探索策略对各待搜索路径进行分析,以提高搜索易受攻击路径的效率。路径探索策略包括默认策略、基于距离的启发式策略等,根据默认策略对各待搜索路径进行分析时,始终优先探索假分支,根据基于距离的启发式策略对各待搜索路径进行分析时,按照从缺陷起始位置到触发缺陷程序指令的距离对各待搜索路径的先后顺序进行排序。68.在一可选实施例中,若待搜索路径中包括循环指令,为了提高分析效率,对循环指令进行分析时简单地将循环原地展开不超过3次来处理过程内的循环。69.在一可选实施例中,为保持更高的性能,在对待搜索路径进行分析时,仅考虑常见的算术和比较操作引入的约束,忽略了位操作等复杂算术和指针操作。70.为了对上述各实施例中提供的目标缺陷报告筛选方法进行详细说明,本发明实施例提供了一个目标程序、目标程序的缺陷报告,以及对缺陷报告进行筛选的过程:71.如图2所示为目标程序,目标程序中有两个函数:hash_add()(第22至28行)和hash_insert()(第6至21行)。hash_insert()函数尝试将entry插入全局数组hash_table中:在第7行调用get_table()函数并将hash_table指针返回给table指针。从第9到第14行的循环遍历了整个数组以找到可用的位置。如果存在可用位置,则将entry插入到hash_table中并存储到对应的参数中(第17行)。然后,函数返回0(第18行)。否则,将返回1(第20行)以表示插入失败。函数hash_add()在第23行中分配了一个新的内存对象in,并调用hash_insert()将其插入hash_table中(第25行)。如果插入失败(第26行),则释放该对象,否则将通过added指针返回该对象。72.针对如图2所示的目标程序,通过静态分析工具得到的其中一条缺陷报告为:<23,27,{26}>,在如图2所示的目标程序中,因为在in和added之间存在假别名,第23行为分配对象的源位置,然后在第26行释放对象(作为漏洞报告中的关键step)并在第27行使用该对象(此处作为sink触发了漏洞)。因别名关系不正确而产生了误报——调用函数hash_insert()之后,in或added的内容都可能指向在第23行创建的对象。因此,由于对象在第26行进行释放并在第27行被使用,使得它看起来就像是一个“释放后重用”的漏洞。但别名仅在插入成功且函数调用返回0时成立,导致added指向的是null而非已释放的对象,在此情况下无法在第27行触发漏洞。73.为了对上述缺陷报告进行检测,采用了如下方法:74.步骤一:将目标程序转换为如图3所示的memory‑ssa形式。75.在对目标程序进行转换时,采用了如图4所示的llvm指令集。在如图4所示的表格中,上半部分为标准ssa(静态单赋值)形式的llvm指令。76.在对目标程序进行转化时,先进行了不敏感的andersen风格指针分析作为构建ssa的预分析。预分析计算了下列信息:pts(p)是指针p指向的一组静态内存位置,mod(f)和ref(f)分别为由函数f修改和读取的在f外部的内存位置。77.为了构建memory‑ssa形式,引入了两个附加函数μ和χ,用以指示潜在的每条指令对内存对象的使用和定义的非直接使用。对于指令s,使用了sμ和sχ分别表示μ与χ的集合和为s引入的指令。sμ直接在s之前插入,而sχ紧接在s后面引入。78.图5所示为引入μ和χ的标准规则及指令。给定一个加载(load)指令x:=*y,对于每个对象o∈pts(y),引入一个μ(o)指令(规则[load])。同样,每个存储(stroe)指令*x:=y都附加了一系列的χ指令,其中指令o:=χ(o)表示对y指向的对象o的间接更新(规则[store])。在函数调用位置,引入了μ和χ指令以在过程间传播内存对象的隐式定义和使用。这是通过三条规则实现的:[call],[ref]和[mod]。对于每个对象or∈ref(f),在函数f的条目(规则[ref])处引入μ(or)∈f指令,并在其调用位置x:=f(...)处引入相应的μ(or)指令(规则[call])。对于每个对象om∈mod(f),在函数f的入口和出口都引入一个μ(om)∈f函数(规则[mod])并在其调用点x:=f(...)之前和之后分别插入相应的μ(om)和om=χ(om)(规则[call])。从概念上讲,在函数调用处以及函数进入/退出点引入的μ和χ函数充当了函数f的扩展参数和返回值,像传递值一样明确表示了f在跨过程的对内存对象的间接使用和定义。[0079]在引入了μ和χ指令之后,使用标准的ssa算法构建了如图3所示的memory‑ssa。在构建memory‑ssa时,在每条指令的相应源代码行位置之后对其进行标记,例如,第25行的语句在memory‑ssa中产生了5条指令,标记为25.1至25.5。由于oadded被added指向,指令24.2:*added:=null引入了“24.3:oadded:=χ(oadded)”。ssa会将指令重命名为由于mod(hash_insert)={oadded,ohash_table}导致μ(oadded)和μ(ohash_table)在函数hash_insert入口(7.1‑7.4)、出口(20.4和20.5)和被调用点(25.1和25.2)引入。在这里,引入了伪指令7.1:oadded=...和7.3:ohash_table=...以使之成为有效的ssa形式。此外,25.4:oadded:=χ(oadded)和25.5:ohash_table:=χ(ohash_table)被插入到调用hash_insert的调用点之后。[0080]步骤二:在将目标程序转换为如图3所示的memory‑ssa形式后,构建如图6所示的值流图:[0081]在构建值流图时,以流敏感的标准方式构建了包含μ和χ函数的值流图。值流边y←x表示x和y之间的依赖关系(即def‑use关系)。除了llvm的ssa提供的def‑use链外,还为间接的def‑use关系引入了值流边,如图7所示。根据规则[copy]和规则[phi]引入了值流边以表示直接赋值操作。根据[load]规则,将内存对象o的隐式使用连接到load加载指令。根据[store]规则,o′←o表示对o的弱更新(weakupdate)。如果可能进行强更新(strongupdate,即当存储的值唯一指向唯一对象o时),则可以消除这种边。规则[call]对标准的按值传递语义进行编码,其中parf(qj)是f的对应于实际参数qj的形式参数,retf是f的返回值。其中,过程间值流使用上下文相关的调用点标签进行了标注。规则[callmu]和规则[callchi]分别引入了过程间间接值流流入和返回被调用函数的情况。在函数调用位置l:x:=f(...),对于f中使用的每个内存分配o,都会引入两个值流和μ(o)←o。如此,o通过扩展参数μ(o)显式传递给o∈f。同样,对于在f中修改的每个内存对象o,引入两个值流和μ(o)∈f←o∈f,通过扩展的返回值μ(o)∈f将o∈f返回到其相应的调用者值o′。根据定义,o∈f是在中修改的对象。在这里,在过程内值流边上的标签(l和)l表示此值流边对应调用点l处的上下文。在值流汇总(value‑flowsummary)时,引入了另外四个规则来汇总被调用函数中的值流。使用了符号表示值流图中存在着从x到y的可达路径,且应当存在匹配的上下文信息,图8给出了汇总的规则。规则[sum]概述了从f的参数到其返回值的一条可行的值流路径,其方法是在其调用点,例如引入了一个汇总边。其中,汇总边用调用点标签l表示。其余3条规则[sumpar]、[sumret]和[sumexd]用于处理不同情况下的间接过程间值流。简言之,[sumpar]、[sumret]和[sumexd]分别汇总了从参数到间接返回值、从间接输入到返回值以及从间接输入到间接返回值的间接值流。[0082]为了便于说明,在如图6所示的实施例中,用相应的指令标签标记每个节点。例如,第23行中的变量in表示为编号为23的节点。以图6中灰色部分的值流路径为例进行说明:边为例进行说明:边在调用点25.3:err:=hash_table(in,added)处引入,将参数23:in:=alloc传递给函数hash_insert的形参6:entry:=...。接下来,指令17.1:*matched:=entry和依照规则[store]生成边17.2←6(例如,)。边20.1←17.2在指令)处按照规则[phi]引入。最后,鉴于和的存在,两个值流边根据规则[chi]引入。根据汇总规则[sumpar](图8),值流路径值流路径汇总为说明in经过调用指令25.3:err:=hash_table(in,added)存储到[0083]步骤三:在构建值流图后,对待搜索路径中的各程序指令进行分析,得到待搜索路径的符号状态:[0084]图9所示为符号状态。对于每条不同的路径,都保持了符号状态。符号状态由堆h、栈s和约束列表σ组成。堆h将内存位置映射到符号对象,而栈s包含局部变量的集合。当符号执行某条路径时,条件分支会引入约束σ。在一可选实施例中,为了更清楚地说明,可以认为栈对象和全局对象均由堆h管理,并且不区分不同栈帧中的局部变量。从栈帧返回时,将自动回收栈对象和局部变量。一个对象o是指从常量偏移量到值的映射。值为符号表达式或位置lc。符号表达式可以是常数c、引入的符号值或两个符号表达式的二进制运算。位置lc表示与存储位置l偏移c的位置。为了简单,不对符号位置进行建模,并始终保证存储位置的偏移量为具体值。[0085]图10所示为符号执行指令时的标准语义规则。在规则[alloc]中,对于分配指令x:=alloc,在堆h中创建了一个新位置,并且将x的值设置为l0。[assign]和[arithmetic]这两条规则更新了结果变量的值。其中,φ指令由规则[assign]生成,其输入值在路径搜索过程中是唯一的。规则[load]和[store]分别执行标准堆查找和更新。在[load]中,仅当位置lc(被y引用)在堆h中时,才为x:=*y执行堆查找。当可以由结合静态分析的规则处理。在规则[store]中,如果则位置lc将在h中被惰性初始化及更新。在规则[call]中,将实参的值复制到被调用函数的形参来更新堆栈,并从被调用函数的入口继续符号执行。在规则[return]中,返回值返回给调用函数,同时局部变量(yf∈f)和局部栈对象(lf∈f)被丢弃。最后,一条分支指令将分化(fork)出两个状态,一种是真分支状态(规则[brancht]),另一种是假分支状态(规则[branchf]),同时约束列表会相应地更新,从而使后续路径的符号执行从对应分支的状态分别开始。[0086]图11所示为相应的规则。规则[init]为入口函数fsource的每个参数分配一个值,从而初始化符号状态。为每个指针参数分配一个新标签l,并为每个非指针参数赋予一个符号值。[0087]除了如图9所示的符号状态之外,还保留了一个附加映射将静态分析对象o映射到符号堆h中的唯一位置l。如果存储(store)指令*x:=y强更新o,则o具有值x的唯一对应位置,因此,规则[chi]在强更新中更新映射(例如,{o′:=χ(o)}=={[*x:=y]χ}和)。[0088]当指令x:=*y从不在堆中的新内存位置加载(load)时,对相应的符号对象采取了惰性初始化策略。对此有3种不同的情况:1)规则[loadval]处理非指针值的x时,在堆h中为其分配了一个新的符号值;2)在规则[loadptr]中,若x是指向未跟踪对象的指针,当加载指针时,在堆h分配一个空对象并让x指向它;3)在规则[loadptrm]中,x是指向跟踪对象o的指针值(即o∈dome(m)),x被分配了o的跟踪值,即h[m[o]]。[0089]对于从函数调用x:=f(...)返回的任何值k,例如,x和o′:=χ(o)∈[x:=f(...)]χ,跳过符号执行此函数调用:如果值流汇总中只有一个值流至k的话。由此,如果没有引入虚假别名,即在该函数调用中仅存在一个传入值直接或间接地流到返回的所有值,则将跳过符号执行该函数调用的操作,规则[skip]用于处理此特殊情况。跳过的函数调用通过规则[summary]进行更新,其中的返回值可通过此唯一的传入值进行更新。在此规则中,当输入值是静态对象o时,返回值将按照规则[loadptr]和[loadptrm]类似地进行更新,在此不再赘述。[0090]步骤四:根据待搜索路径的符号状态判断待搜索路径中是否存在易受攻击路径。[0091]如图12中总结了整个过程并举例说明了给出示例的所有待搜索路径。图12中并没有列出所有已遍历的指令,且每个节点都只使用所遍历基本块的第一条指令作为标签。从起点开始,初始状态为指令指令强更新由此可以断定,与added有相同的值。指令25.3:err:=hash_insert(in,added)将两条汇总边,和引入了因此,不能跳过此函数调用,而从6:entry:=...开始符号执行被调用函数。在调用指令7.5:table:=get_table(...)时,返回值table具有一个唯一的传入值因此跳过了此函数调用,并且table被更新为hash_table的符号值。在该示例中,缺陷报告并未搜索到对应的漏洞轨迹。但是,如果将漏洞条件error!=0修改为error==0(图2中的第26行),则漏洞轨迹用虚线在图12中标出。[0092]在一可选实施例中,为了验证上述实施例中提供的目标程序缺陷报告筛选方法检测误报的有效性和效率,采用配备有intelxeongold6230@2.10ghzcpu和512gb内存的平台上运行上述实施例中提供的目标程序缺陷报告筛选方法,跟踪静态分析工具报告的释放后重用和空指针解引用取消引用漏洞。评估采用了两组基准:1)juliet测试套件;2)如图13所示的一组21个真实的开源应用。[0093]juliet测试套件包含了大量不同类型的小型缺陷程序(每个缺陷程序通常都附带有正确的版本),并广泛用于评估漏洞检测工具。本发明实施例中针对3个缺陷类型评估了上述实施例中提供的目标程序缺陷报告筛选方法:cwe401(内存泄漏)、cwe416(释放后重用)和cwe476(空指针解引用)。[0094]如图14所示的表格中汇总了实验结果。共有2045个测试用例(第2列),且静态分析工具总共生成了2462个漏洞报告(第3列)。上述实施例中提供的目标程序缺陷报告筛选方法在2462个报告(第4列)中搜索获得了1435个漏洞轨迹,成功消除了1027个误报。[0095]图15所示的表格中报告了一组21个真实应用的结果。这些应用程序的大小从5千行代码(wrk)到309千行代码(httpd),总共1666千行代码(第2列)。静态分析工具报告了21个应用中的904个释放后重用漏洞(第3列)和2954个空指针解引用漏洞(第8列)。根据最初的潜在漏洞集,报告了真漏洞跟踪(tp)、漏洞的漏洞轨迹(fp)、内存使用情况以及上述实施例中提供的目标程序缺陷报告筛选方法的分析时间。分析时间包括了建立上下文和流程敏感值流程图的时间,以及符号化地搜索漏洞轨迹的时间。在本发明实施例中,为每个缺陷报告设置10秒的时间限制,并为每个应用提供了2个小时的时间预算。对于每个基准应用,至少运行了3次目标程序缺陷报告筛选方法并报告了3次运行中的平均数据。[0096]总体而言,通过执行上述实施例中提供的目标程序缺陷报告筛选方法成功地确认了29个释放后重用(第4列)和895个空指针解引用(第9列)漏洞轨迹,有效地消除了静态分析工具71.4%的误报。人工随机检查了100条执行上述实施例中提供的目标程序缺陷报告筛选方法未搜索到漏洞轨迹的缺陷报告,并确认它们都是误报。还有12个无效的释放后重用漏洞(第4列)和45个无效假空指针解引用(第9列)的漏洞轨迹,总误报率为5.88%(29.3%为释放后重用漏洞,4.79%为空指针解引用漏洞)。图15中的内存消耗(第6列和11列)和时间成本(第7列和12列)显示了上述实施例中提供的目标程序缺陷报告筛选方法在每个基准应用上的性能。[0097]在本发明实施例中,还评估了通过不同执行策略执行上述实施例中提供的目标程序缺陷报告筛选方法时的结果,从而比较了不同策略方案对效率和有效性的影响,这些差异体现为超时百分比和漏洞轨迹的精度。[0098]图16(a)和图16(b)分别比较了对追踪潜在的“释放后重用”或“空指针解引用”漏洞应用不同时间限制下的结果。随着时间限制增大(从5s到100s),超时量明显下降,同时已识别漏洞轨迹的缺陷数量和已确认的误报数也稳步增加。[0099]图16(c)和图16(d)提供了不同的折衷方案对缺陷报告筛选的影响。各策略分别为:default在路径选择策略上总是优先选择分支指令的假分支:priority在路径选择策略优先选择距离sink较近的分支目标;no‑slice不执行程序切片;no‑step‑in总是使用静态分析汇总信息更新函数调用时的符号状态;step‑in尽力在函数调用点符号执行被调用函数而不会跳过函数调用。[0100]实验结果表明,priority和default之间的差异很小,而no‑slice方案造成的超时数量相比于default明显更大:对于空指针解引用漏洞,超时量从13.85%增加到19.26%。总体而言,程序切片优化将内存使用量减少了13.05%,并将运行时性能提高了9.3%。最后,由于静态分析汇不总是精确的,在使用no‑step‑in时,精度明显下降。当采用step‑in时,相比于default,释放后重用漏洞的超时数量显著增加:从45.8%增加到63.4%(图16(c)),且漏洞轨迹的准确性略有不同。这就表明,通过使用静态分析汇总信息能够显著提高符号执行性能,同时保持相同水平的精度。[0101]本发明实施例还提供了一种目标程序缺陷报告筛选装置,如图17所示,包括:[0102]缺陷报告获取模块10,用于获取目标程序的缺陷报告,根据缺陷报告确定缺陷起始位置、触发缺陷程序指令,以及缺陷报告所指出的目标程序存在的缺陷,详细内容参见上述实施例中的描述,在此不再赘述。[0103]路径搜索模块20,用于采用符号执行和静态分析,对从缺陷起始位置到触发缺陷程序指令的待搜索路径进行分析,判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径,目标程序中存在一条或多条从缺陷起始位置到触发缺陷程序指令的待搜索路径,详细内容参见上述实施例中的描述,在此不再赘述。[0104]缺陷报告筛选模块30,若缺陷起始位置与触发缺陷程序指令之间不存在满足缺陷的触发条件的易受攻击路径,缺陷报告筛选模块用于判定缺陷报告为误报,详细内容参见上述实施例中的描述,在此不再赘述。[0105]本发明实施例提供了一种目标程序缺陷报告筛选装置,在获取到目标程序的缺陷报告后,对缺陷起始位置和触发缺陷程序指令之间的待搜索路径进行了分析,并判断待搜索路径中是否存在易受攻击路径,若不存在易受攻击路径,则判定该缺陷报告为误报,由此实现了对缺陷报告的筛选,用户能够从筛选后的缺陷报告中快速获取目标程序存在的真实的缺陷信息,并且,若只通过符号执行对待搜索路径进行分析,需要采用符号执行搜索待搜索路径中的全部程序指令,从而判断该待搜索路径是否为易受攻击路径,在本发明实施例提供的目标程序缺陷报告筛选装置中,结合符号执行和静态分析对缺陷起始位置和触发缺陷程序指令之间的待搜索路径进行分析时,可以基于静态分析结果跳过部分程序指令,即,通过实施本发明实施例不需要采用符号执行搜索待搜索路径中的全部程序指令,提高了待搜索路径的分析效率。基于上述分析,通过实施本发明实施例能够快速判断缺陷起始位置与触发缺陷程序指令之间是否存在易受攻击路径,从而快速完成对目标程序的缺陷报告的筛选,用户能够从筛选后的缺陷报告中获得目标程序真实存在的缺陷。[0106]本发明实施例提供了一种计算机设备,如图18所示,该计算机设备主要包括一个或多个处理器41以及存储器42,图18中以一个处理器41为例。[0107]该计算机设备还可以包括:输入装置43和输出装置44。[0108]处理器41、存储器42、输入装置43和输出装置44可以通过总线或者其他方式连接,图18中以通过总线连接为例。[0109]处理器41可以为中央处理器(centralprocessingunit,cpu)。处理器41还可以为其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field‑programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。存储器42可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储根据目标程序缺陷报告筛选装置的使用所创建的数据等。此外,存储器42可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器42可选包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至目标程序缺陷报告筛选装置。输入装置43可接收用户输入的计算请求(或其他数字或字符信息),以及产生与目标程序缺陷报告筛选装置有关的键信号输入。输出装置44可包括显示屏等显示设备,用以输出计算结果。[0110]本发明实施例提供了一种计算机可读存储介质,该计算机可读存储介质存储计算机指令,计算机存储介质存储有计算机可执行指令,该计算机可执行指令可执行上述任意方法实施例中的目标程序缺陷报告筛选方法。其中,存储介质可为磁碟、光盘、只读存储记忆体(read‑onlymemory,rom)、随机存储记忆体(randomaccessmemory,ram)、快闪存储器(flashmemory)、硬盘(harddiskdrive,缩写:hdd)或固态硬盘(solid‑statedrive,ssd)等;存储介质还可以包括上述种类的存储器的组合。[0111]显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜