一种生成概念验证数据的方法及系统与流程

文档序号:12916060阅读:202来源:国知局
一种生成概念验证数据的方法及系统与流程

本申请涉及测试领域,特别涉及一种基于代码审计的漏洞挖掘中生成概念验证数据的方法及系统。



背景技术:

漏洞挖掘,指的是在软件代码编译完成之后,针对代码所存在漏洞进行发现的过程。漏洞挖掘有多种方式可以实现,模糊测试(fuzzing)是其中一种常见的方法。模糊测试是一种通过向目标程序提供非预期的输入并监视异常结果来发现软件漏洞的方法,通过模糊测试可以生成目标程序的概念验证数据(poc数据)。



技术实现要素:

但是发明人在研究过程中发现,现有技术即便发现了存在安全漏洞的程序代码段,也不能有效且快速的构造出poc数据,因为多数程序的调用结构非常复杂,需要跟随数据的传递关系逐层逆向反推,有些数据之间有存在依赖和制约关系,找出影响这些调用结构的关键数据与初始输入数据之间的关系,进而构造出poc数据是一个非常复杂的事情,因此,构造poc数据的效率较低。

基于此,本申请提供了在漏洞挖掘中自动生成概念验证数据的方法,用以解决现有技术中构造poc数据的效率较低的问题。

本申请还提供了一种生成概念验证数据的系统,用以保证上述方法在实际中的实现及应用。

本申请公开了一种生成概念验证数据的方法,该方法包括:

根据目标程序的代码中存在漏洞的漏洞代码段,获取所述漏洞代码段在所述目标程序中的调用路径;

根据所述调用路径和输入数据对所述目标程序进行测试;

获取所述目标程序出现异常时对应的输入数据,作为所述概念验证数据。

本申请公开了一种生成概念验证数据的系统,包括:

获取路径装置,用于根据目标程序的代码中存在漏洞的漏洞代码段,获取所述漏洞代码段在所述目标程序中的调用路径;

测试装置,用于根据所述调用路径和输入数据对所述目标程序进行测试;

获取数据装置,用于获取所述目标程序出现异常时对应的输入数据,作为所述概念验证数据。

与现有技术相比,本申请包括以下优点:

在本申请实施例中,通过先确定出漏洞代码段在目标程序中的调用路径的方式,可以结合该调用路径涉及的各个分支路径,以及随着目标程序运行而不断变异的输入数据,来对目标程序进行模糊测试,从而通过分析目标程序异常结束时对应的输入数据,来找出该目标程序的漏洞代码段的概念验证数据。因此,本申请实施例因为预先确定出了漏洞代码段,并且可以在目标程序自动运行的过程中通过判断是否触发了漏洞代码段在目标程序中的调用路径而确定出poc数据,所以本申请实施例无需人工参与,即可自动生成概念验证数据,能够提高生成概念验证数据的效率。

当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本申请的生成概念验证数据的方法实施例的流程图;

图2是本申请在实际应用中的功能模块的架构图;

图3是本申请的生成概念验证数据的系统实施例的结构框图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

定义:

poc(proofofconcept,概念验证):可以是对某些想法的一个不完整的实现,以证明其可行性,示范其原理,其目的是为了验证一些概念或理论。在计算机安全术语中,概念验证经常被用来作为exploit的别名。(通常指并没有充分利用这个漏洞的exploit)。

poc数据:可以是一种能够触发或导致程序出现异常的输入数据或流程,用以证明目标程序存在某种缺陷或安全问题。

cfg(controlflowgraph,程序控制流程图),可以包含一个程序所有可能的分支结构。

代码审计:可以通过分析源代码的方式理解程序逻辑和实现,从而进一步发现程序的内部逻辑或安全问题。

覆盖率导向的模糊测试原理:覆盖率导向的fuzz主要是利用实时监测目标程序的运行分支覆盖情况来调整输入数据的结构,从而实现最大分支覆盖的fuzz。

漏洞:可以是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。

漏洞代码段:可以是通过人工审计或者漏洞分析工具对程序进行分析,而得到的包含漏洞的代码段。

调用路径:可以是漏洞代码段在其所属程序中从程序的起始位置到漏洞的cfg,调用路径包括了所有的cfg分支路径。

样本队列:可以是为了存放目标程序的输入数据的一个数据队列。

参考图1,示出了本申请一种生成概念验证数据的方法实施例的流程图,本实施例可以包括以下步骤:

步骤101:根据目标程序的代码中存在漏洞的漏洞代码段,获取所述漏洞代码段在所述目标程序中的调用路径。

在本实施例中,对于一个存在漏洞需要进行漏洞发掘的目标程序,从该目标程序的代码中确定出存在漏洞的漏洞代码段,进而针对该漏洞代码段获取到漏洞代码段中存在漏洞的代码在目标程序中的调用路径。其中,该调用路径可以是cfg分支路径,该cfg分支路径以函数名或类名为最小单位均可。本步骤可以通过人工代码审计的方式实现,或采用自动化代码分析工具实现。

步骤102:根据所述调用路径和输入数据对所述目标程序进行测试。

在本步骤中,具体可以将输入数据作为所述目标程序的输入,根据所述目标程序在运行过程中是否触发了所述调用路径对所述目标程序进行测试。具体实现时,可以为目标程序生成一个初始输入数据,该初始输入数据可以作为目标程序的输入数据而触发目标程序运行,以便在目标程序运行过程中判断是否触发了调用路径,从而实现对目标程序的模糊测试(fuzz)。其中,该初始输入数据保存时可以存放在一个样本队列中。具体实现时,可以结合调用路径的各个分支路径,将输入数据作为目标程序的输入触发目标程序运行,从而在运行过程中获取到能够导致目标程序异常结束的当前输入数据,就是本实施例中目标程序的漏洞代码段的poc数据。

具体的,本步骤的实现可以包括步骤a1~步骤a5:

步骤a1:确定样本队列中能被目标程序接收作为输入的初始输入数据。

首先为目标程序确定一个能够作为其输入而接收的初始输入数据,该初始输入数据存储在样本队列中。其中,该初始输入数据的形式和内容均不限定,只要能被目标程序接收作为输入数据的任何形式和内容的初始输入数据,都能实现本申请实施例。

步骤a2:对该初始输入数据进行变异,得到变异输入数据。

对该初始输入数据进行随机变异,得到第一次随机变异后的变异输入数据。本步骤中对初始输入数据的任意变异方式均可,只要变异后的输入数据与变异前的输入数据不同即可。因此,本申请实施例中不对变异的具体方式做限定。

具体的,在对初始输入数据进行变异时,也可以参考目标程序的实现功能或性能参数进行有针对性的变异。例如,假设目标程序是实现mp3的播放的,或者目标程序是mp3播放器,则可以优先设置初始输入数据为一个mp3文件,并且朝着mp3文件相应的方向变异输入数据。

步骤a3:将所述变异输入数据作为所述目标程序的输入,触发所述目标程序的运行。

将步骤a2中变异得到的变异输入数据作为目标程序的输入,触发目标程序开始运行。

步骤a4:在所述目标程序的运行过程中判断是否触发了所述调用路径,如果是,则返回步骤a2继续变异,直至所述目标程序的运行出现异常;如果否,则进入步骤a5。

在本步骤中,如果判断得到目标程序的运行路径触发了调用路径,则返回步骤a2对第一次变异得到的变异输入数据继续变异,从而继续触发目标程序的运行,直至目标程序出现异常而结束运行。

具体的,步骤a4可以包括步骤b1~步骤b2:

步骤b1:确定所述调用路径涉及的各个分支路径。

具体的,在判断目标程序的运行是否触发了调用路径的时候,可以首先确定出调用路径涉及的各个cfg分支路径。

步骤b2:判断所述目标程序的运行路径是否与任意一个所述分支路径相匹配。

然后结合目标程序的运行路径,来判断该运行路径是否与任意一个步骤b1得到的分支路径相匹配。例如,假设某一个分支路径是“执行第1、2和5行程序代码”,而本步骤中目标程序的运行路径为“执行第1、2和5行程序代码”,即,目标程序的运行路径和分支路径完全相同,则可以认为相匹配。或者,假设某一个分支路径是“执行第1、2和5行程序代码”,而本步骤中目标程序的运行路径为“执行第1、2和3行程序代码”,即,目标程序的运行路径和分支路径部分相同,也可以认为相匹配。具体的实施过程可以由本领域技术人员自主设置。

步骤a5:从样本队列中删除所述初始输入数据,并执行确定样本队列中的初始输入数据的步骤。

如果第一次变异后的变异输入数据没有触发任何调用路径,则可以从样本队列中删除该初始输入数据,并返回步骤a1,继续在样本队列中生成新的初始输入数据进行模糊测试。

接着进入步骤103:获取所述目标程序出现异常时对应的输入数据,作为所述概念验证数据。

在步骤102进行测试的过程中,当目标程序出现异常而结束运行的时候,获取到该目标程序对应的输入数据,即对应的初始输入数据或者变异输入数据,作为概念验证数据的内容。

参考图2所示,为本实施例在实际应用中的功能模块的架构图。其中,具体实现时,可以根据步骤101中确定的调用路径来配置覆盖率监测装置201,具体在配置时只关注步骤101中所得的调用路径上的覆盖情况即可,然后再使用模糊测试fuzz装置202配合配置好的覆盖率监测装置201来触发目标程序203的运行,从而获取到能够导致目标程序异常结束的输入数据,就是本实施例中目标程序的漏洞代码段的poc数据。

具体的,为了方便本领域技术人员对配置覆盖检测装置201有一个详细的了解,下面以通过clang工具配置覆盖率监测装置为例进行说明。

假设在步骤101中已经通过某个代码分析工具确定可能存在安全漏洞的代码段位于函数vuln()中,则通过人工审计分析或者一些已有的静态代码分析工具可以确定该vuln函数所有可能的调用路径。为便于说明,假设该vuln函数只有一条调用路径,且调用路径为:

main()->start()->read()->parsesomething()->allocstruct()->vuln()

该调用路径的最小单位是函数(例如,“main”,“start”等),调用路径表示了从目标程序的执行入口(即main函数)到运行到存在漏洞的函数vuln的函数调用顺序。

根据该调用路径,利用clang工具向覆盖率监测装置插入覆盖率监测功能的代码。其中,clang插件伪代码如下所示:

因为clang工具是一个编译器,因此可以为它编写插件来让clang工具有选择的在编译目标程序的过程中插入覆盖率监测代码。上述伪代码的含义为:在编译过程中循环遍历每个函数,通过判断当前函数名是否包含于预设的调用路径之中,来控制是否插入覆盖率监测的代码。

可见,在本实施例中,通过先确定出漏洞代码段在目标程序中的调用路径的方式,可以结合该调用路径涉及的各个分支路径,以及随着目标程序运行而不断变异的输入数据,来对目标程序进行模糊测试,从而通过分析目标程序异常结束时对应的输入数据,来找出该目标程序的漏洞代码段的概念验证数据。因此,本实施例因为预先确定出了漏洞代码段,并且可以在目标程序自动运行的过程中通过判断是否触发了漏洞代码段在目标程序中的调用路径而确定出poc数据,所以本申请实施例无需人工参与,即可自动生成概念验证数据,能够提高生成概念验证数据的效率。

进一步的,本申请实施例还可以对概念验证数据的准确性进行验证,则步骤103之后还可以包括:

步骤c:对所述概念验证数据的准确性进行验证。

具体的,可以让生成的poc数据作为目标程序的输入数据,来触发目标程序运行来实现对概念验证数据的准确性进行验证,如果目标程序出现异常的方式和人工发现的目标程序的漏洞一致,则说明生产的poc数据是准确的。通过本步骤的验证过程,可以对自动生成的概念验证数据的准确性进行测试,进而使本领域技术人员对概念验证数据有更为准确和清晰的了解。

进一步的,本申请实施例还可以依据漏洞的特征对目标程序中的漏洞代码段进行修复,则步骤103之后还可以包括:

步骤d:依据所述目标程序的异常信息对所述目标程序中的漏洞代码段进行修复。

依据本实施例中目标程序中出现异常时的异常情况和成因,进而对目标程序中出现漏洞的代码段进行相应的修改,使修改后的目标程序在真正的投入实际场景运行时,不会因为漏洞而在运行时出现异常。

对于前述的方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。

与上述本申请一种模糊测试中生成概念验证数据的方法实施例所提供的方法相对应,参见图3,本申请还提供了本申请一种模糊测试中生成概念验证数据的系统实施例,在本实施例中,该系统可以包括:

获取路径装置301,用于根据目标程序的代码中存在漏洞的漏洞代码段,获取所述漏洞代码段在目标程序中的调用路径。

测试装置302,用于根据所述调用路径和输入数据对所述目标程序进行测试。

其中,所述输入数据可以为:样本队列中包括的、能被所述目标程序接收作为输入的样本数据,所述测试装置302具体可以用于:将输入数据作为所述目标程序的输入,根据所述目标程序在运行过程中是否触发了所述调用路径对所述目标程序进行测试。所述测试装置302具体可以包括:

确定初始样本数据模块,用于确定样本队列中能被目标程序接收作为输入的初始输入数据;触发程序运行模块,用于将所述初始输入数据作为所述目标程序的输入,触发所述目标程序的运行;判断模块,用于在所述目标程序的运行过程中判断是否触发了所述调用路径;变异模块,用于在所述判断模块的结果为是的情况下,对所述初始输入数据进行变异,并将变异后的输入数据作为所述初始输入数据,触发所述触发程序运行模块,直至所述目标程序的运行出现异常;和,删除模块,用于在所述判断模块的结果为否的情况下,从所述样本队列中删除所述初始输入数据,并触发所述确定初始样本数据模块。

其中,所述判断模块具体可以包括:

确定子模块,用于确定所述调用路径涉及的各个分支路径;和,判断子模块,用于判断所述目标程序的运行路径是否与任意一个所述分支路径相匹配。

其中,所述变异模块具体可以用于:参考所述目标程序的实现功能或性能参数对所述样本队列中的初始输入数据进行变异,得到变异输入数据。

获取数据装置303,用于获取所述目标程序出现异常时对应的输入数据,作为所述概念验证数据。

进一步的,该系统还可以包括:

验证模块,用于对所述概念验证数据的准确性进行验证。

进一步的,该系统还可以包括:

修复模块,用于依据所述漏洞的特征对所述目标程序中的漏洞代码段进行修复。

可见,在本实施例中,通过先确定出漏洞代码段在目标程序中的调用路径的方式,可以结合该调用路径涉及的各个分支路径,以及随着目标程序运行而不断变异的输入数据,来对目标程序进行模糊测试,从而通过分析目标程序异常结束时对应的输入数据,来找出该目标程序的漏洞代码段的概念验证数据。因此,本实施例因为预先确定出了漏洞代码段,并且可以在目标程序自动运行的过程中通过判断是否触发了漏洞代码段在目标程序中的调用路径而确定出poc数据,所以本申请实施例无需人工参与,即可自动生成概念验证数据,能够提高生成概念验证数据的效率。

需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

最后,还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上对本申请所提供的模糊测试中生成概念验证数据的方法及系统进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1