CN104008053B - 一种用于漏洞发掘的动态符号执行路径搜索方法 - Google Patents
一种用于漏洞发掘的动态符号执行路径搜索方法 Download PDFInfo
- Publication number
- CN104008053B CN104008053B CN201410230479.8A CN201410230479A CN104008053B CN 104008053 B CN104008053 B CN 104008053B CN 201410230479 A CN201410230479 A CN 201410230479A CN 104008053 B CN104008053 B CN 104008053B
- Authority
- CN
- China
- Prior art keywords
- path
- test case
- test
- leak
- execution
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
一种用于漏洞发掘的动态符号执行路径搜索方法,涉及软件测试领域,目的在于更快的触发漏洞,提高大型软件漏洞检测的效率。该方法在使用动态符号执行对被测程序的可能执行路径进行搜索的过程中,标记实际执行被测程序时触发漏洞的路径,对于路径探索过程中生成的每一个新的测试用例,计算该测试用例执行路径与上次触发漏洞路径的相关度r,并以此计算该测试用例对应执行路径的权重分数score,在下次执行测试时选择score值最大的测试用例执行。
Description
技术领域
本发明涉及软件测试领域,提供了一种用于漏洞发掘的动态符号执行路径搜索方法。
背景技术
软件开发是一项脑力密集型且需要丰富编程经验的一项工作,因此,开发一款正确性、稳定性、安全性都符合要求的软件非常困难。软件测试是保证软件可靠性和安全性的关键技术,在软件开发周期中占据着非常重要的地位。动态符号执行是目前软件安全、软件测试研究领域的热点技术之一,它通过自动生成测试用例,可以获取高代码覆盖率,被用于当前许多主流软件测试工具中。利用动态符号执行技术,通过符号化的方法探索遍历程序的所有可能执行路径,产生路径约束,并对约束条件求解,自动化产生测试用例,在理论上能够实现对被测程序全路径的覆盖,再辅助其他漏洞检测技术,可以全面、准确地检测程序中潜在的漏洞。
使用动态符号执行进行漏洞发掘的一般过程如下:首先对分析的程序文件(可执行文件或者字节码文件)进行二进制插桩,在第一次执行时,给程序提供一个随机的或选择的初始输入数据,然后借助插桩代码对输入数据符号化,在程序执行过程中,同时进行符号执行。插桩代码会记录符号化的变量在每个执行路径下的操作。在执行过程中调用漏洞检测模块检测程序中的漏洞;符号执行在程序的条件分支语句处搜集符号变量的路径分支条件(路径约束条件)。在一次执行完之后,根据搜集到的约束条件形成一个约束表达式,对这些表达式按照路径搜索算法将其中某个条件取反,调用约束求解器进行求解,从而生成新的测试用例。然后新的测试用例会沿不同路径进行下一次执行过程,如果在执行过程中检测到漏洞,则将记录漏洞信息并保存相应测试用例。符号执行过程将一直继续直到所有可能的执行路径都被测试完。
漏洞发掘方式可以分为被动式和主动式,传统的漏洞发掘方式大多都是被动式。被动式漏洞发掘指的是当某个测试用例触发了软件漏洞,那么该软件漏洞就被挖掘出来;而主动式漏洞发掘是指测试用例本身没有触发漏洞,但在执行过程中,通过某种方法产生了约束,通过求解该约束,产生新的测试用例,而该新测试用例能够触发漏洞。被动式漏洞发掘适合检测路径不变的漏洞,而对于路径变化的漏洞,则需采用主动式的检测方式。
路径搜索算法是动态符号执行过程中一个重要的组成部分,路径搜索的目的是实现高的代码覆盖率,保证执行过程能够遍历程序的所有可能执行路径,从而能够全面的产生测试用例对程序进行检测。到目前为止,已出现很多路径搜索方法可供选择,如:广度优先搜索、代搜索、随机搜索、元策略等算法。
但是,传统的广度优先路径搜索算法,没有针对漏洞发掘进行优化。其他的路径搜索算法(代搜索、随机搜索等)主要目的是提高代码覆盖率,也不是针对漏洞发掘的。本发明提出了一种基于代搜索算法的路径搜索算法优化方法,标记每次触发漏洞的路径与深度。对于每一个新的测试用例,我们计算该用例执行路径与上次触发漏洞路径的相似度r,并以此计算该路径的权重分数score,在下次执行测试时选择执行score值最大的测试用例,以减少测试中漏洞触发需要的时间,使测试能够在更短的时间内发现更多的漏洞。
在利用符号执行进行漏洞检测时,传统路径搜索算法侧重于路径搜索,是通用的高代码覆盖率路径搜索算法,不是针对漏洞发掘的路径搜索算法;同时,传统路径选择算法没有利用触发漏洞的路径约束条件,路径选择的标准是提高代码覆盖率,在路径选择时,能够触发漏洞的执行路径可能不一定能优先得到执行,从而使触发漏洞的时间具有一定的随机性,降低了测试大型软件漏洞的效率。
发明内容
本发明的目的在于在传统代搜索算法的基础之上,设计了一个改进的路径搜索方法。一个触发漏洞路径的兄弟路径,是潜在的在漏洞触发路径。在路径探索时,记录每次触发漏洞的路径,对于该路径的兄弟路径,在下次执行测试时优先选择执行,以便更早的对这些区域进行测试,从而更快的触发漏洞,提高大型软件漏洞检测的效率。
本发明为了实现上述目的采用以下技术方案:
一种用于漏洞发掘的动态符号执行路径搜索算法,其特征在于:在使用动态符号执行对被测程序的可能执行路径进行搜索的过程中,标记实际执行被测程序时触发漏洞的路径,对于路径探索过程中生成的每一个新的测试用例,计算该测试用例执行路径与上次触发漏洞路径的相关度r,并以此计算该测试用例对应执行路径的权重分数score,在下次执行测试时选择score值最大的测试用例执行。
上述技术方案中,所述的路径搜索具体步骤为:
2-1、给出一个初始测试输入作为测试用例;
2-2、将初始测试输入加入符号执行工作集,并初始化该初始测试输入的路径权重分数为0;
2-3、用初始测试输入作为测试用例实际执行测试程序,查看初始测试用例是否触发漏洞;
2-4、如果符号执行工作集不为空,从符号执行工作集中选择一个路径权重分数最大的测试用例,如果有相同分数的,随机选择;首次执行选择初始测试输入;如果符号执行工作集为空,则结束;
2-5、对选择的测试用例进行符号执行,获得新的子测试输入集;
2-6、如果获得的子测试输入集不为空,从子测试输入集中随机选择一个测试用例,跳转至步骤2-7执行;如果获得的子测试输入集为空则跳转至步骤2-4;
2-7、对于步骤2-6选择的测试用例,实际执行并检测是否触发漏洞,并在执行过程中对测试用例进行路径权重分数计算,执行完毕后加入到符号执行工作集中,并从子测试输入集中删除,跳转至步骤2-6。
上述技术方案中,符号执行的过程如下:
3-1、首先将生成的子测试输入集初始化为空集;
3-2、以步骤2-4中选择的测试用例作为程序输入,符号执行该测试程序,首先获取测试程序当前指令,依据指令类型的不同,进行不同的符号执行操作,同时进行漏洞检测,如果触发程序漏洞,则标记当前程序的执行路径的父路径,将从程序入口处到触发漏洞处形成的一条程序路径视为父路径,记录路径深度,并搜集路径约束,如果没有触发漏洞,则仅搜集路径约束条件;
3-3、对于搜集到的路径约束条件,逐一进行约束取反;
3-4、调用求解器对约束表达式进行求解,生成后续的测试输入;
3-5、将后续的测试输入加入到子测试输入集中。
上述技术方案中,上述路径权重分数计算方法如下:
4-1、初始化第i个测试用例所对应的执行路径权重分数score(i)为一个初始设定值S_initial,第i个测试用例所对应执行路径的路径深度d(i)=0,第i个测试用例对应执行路径的路径相关度r(i)=R_max,R_max是一个初始设置的路径最大相关度,代表某条路径和漏洞触发路径的相似度,这里默认相似度为最大值;
4-2、如果程序没有运行结束,获取当前程序的执行指令;
4-3、如果指令为条件跳转类指令,则判断是否与符号执行相关,相关则将第i条路径深度d(i)加1,再判断该指令所属执行路径是否为上次触发漏洞路径的父路径(可能存在多条漏洞路径,只要该路径是某一条漏洞路径的父路径即可),如果不是则将r(i)减1,然后计算路径权重分数,计算公式如下:,vul_path为预设的一个漏洞路径权重;如果d(i)大于该路径的触发漏洞路径深度,执行步骤4-2所述的当前程序的执行指令后跳转至4-4,否则执行步骤4-2所述的当前程序的执行指令,跳转至4-2;
4-4、返回权重分数score,执行完程序后续指令。
因为本发明采用以上设计方案,所以具有以下有益效果:
本发明改进的漏洞发掘动态符号执行路径搜索算法,是在现有符号执行路径搜索算法的基础上进行的改进。本发明通过在路径探索中对触发漏洞路径进行标记,在路径权重计算时给予上次触发漏洞路径的兄弟路径一定的高权重分数,使得在路径选择时,能够优先的执行上次触发漏洞路径的兄弟路径,使得漏洞存在概率大的路径优先执行,从而缩短了漏洞触发需要的时间,加快了大型软件漏洞检测发掘的效率。
附图说明
图1为本发明的搜索算法执行流程图;
图2为本发明的评分算法流程图;
图3为本发明的方案实例流程图。
具体实施方式
本实施案例详细讲述了一种实现本发明的方式,但本发明的保护范围不仅仅局限于采用这种方式,凡是采用本发明思想的实施方式都在本发明的保护范围内。
二进制插桩模块
本模块是对被测程序进行运行时动态二进制插桩。在动态符号执行过程中,通过对被测程序插桩,来追踪符号的操作和传播过程,并在分支语句处收集路径约束条件。目前成熟的二进制插桩工具有Dyninst、DynamoRIO、Valgrind、PIN、PEBIL、HDTrans,LLVM等,本实施案例使用PIN工具。
漏洞发掘模块
本模块中,混合主动式和被动式漏洞检测方式,使用被动式漏洞检测模块检测程序中路径不变的程序漏洞,使用主动式漏洞检测模块检测执行路径可变的程序漏洞。在漏洞检测过程中,我们在路径条件搜集时标记触发漏洞的路径条件和执行路径,这个标记用于对其兄弟路径对应测试输入的权重计算。
约束否定模块
本模块的功能是将在路径探索过程中获取的路径约束条件形成的约束表达式进行取反操作。取反后形成的条件表达式构成一个新的路径约束。取反过程为:每次对一个条件表达式取反,通过求解器进行求解,再产生新的测试用例,然后继续符号执行。或者先对所有条件表达式进行求解,再选择其中一个求解结果进行符号执行。
混合执行模块(符号执行和实际执行)
本模块是动态符号执行的一个主要模块,将会运行检测程序,并且同时进行符号执行过程,在运行过程中,使用漏洞检测模块进行主动式和被动式地漏洞发掘工作。第一次运行时,我们使用的输入是测试人员提供的输入数据,以后运行则是根据第一次的运行产生的测试用例继续驱动符号执行过程,自动化地测试程序所有的可能执行路径。
符号执行过程中,会将新的输入符号化,加入符号执行过程,跟踪其传播以及在分支跳转语句处形成的路径条件约束。
在符号执行路径条件计算时,根据路径是否有已检测漏洞标记,对其进行权重计算。并且在下次执行时,选择权重最大的路径进行符号执行。
求解器求解模块
约束求解器模块,是对符号执行过程中形成的路径条件约束表达式进行求解,通过求解结果,产生新的测试用例,从而驱动符号执行过程。路径约束条件是由不同条件表达式组成的,约束求解过程就是给出一组满足该条件表达式的解,即具体值。本案例我们采用STP求解器。
本实施案例的流程图见附图3。
Claims (2)
1.一种用于漏洞发掘的动态符号执行路径搜索算法,其特征在于:在使用动态符号执行对被测程序的可能执行路径进行搜索的过程中,标记实际执行被测程序时触发漏洞的路径,对于路径搜索过程中生成的每一个新的测试用例,计算该测试用例执行路径与上次触发漏洞路径的相关度r,并以此计算该测试用例对应执行路径的权重分数score,在下次执行测试时选择score值最大的测试用例执行;
所述的路径搜索具体步骤为:
2-1、给出一个初始测试输入作为测试用例;
2-2、将初始测试输入加入符号执行工作集,并初始化该初始测试输入的路径权重分数为0;
2-3、用初始测试输入作为测试用例实际执行测试程序,查看初始测试用例是否触发漏洞;
2-4、如果符号执行工作集不为空,从符号执行工作集中选择一个路径权重分数最大的测试用例,如果有相同分数的,随机选择;首次执行选择初始测试输入;如果符号执行工作集为空,则结束;
2-5、对选择的测试用例进行符号执行,获得新的子测试输入集;
2-6、如果获得的子测试输入集不为空,从子测试输入集中随机选择一个测试用例,跳转至步骤2-7执行;如果获得的子测试输入集为空则跳转至步骤2-4;
2-7、对于步骤2-6选择的测试用例,实际执行并检测是否触发漏洞,并在执行过程中对测试用例进行路径权重分数计算,执行完毕后加入到符号执行工作集中,并从子测试输入集中删除,跳转至步骤2-6;
上述路径权重分数计算方法如下:
4-1、初始化第i个测试用例所对应的执行路径权重分数score(i)为一个初始设定值S_initial=0,第i个测试用例所对应执行路径的路径深度d(i)=0,第i个测试用例对应执行路径的路径相关度r(i)=R_max,R_max是一个初始设置的路径最大相关度,代表某条路径和漏洞触发路径的相似度,这里默认相似度为最大值;
4-2、如果程序没有运行结束,获取当前程序的执行指令;
4-3、如果指令为条件跳转类指令,则判断是否与符号执行相关,相关则将第i条路径深度d(i)加1,再判断该指令所属执行路径是否为上次触发漏洞路径Pvul的父路径,如果不是则将r(i)减1,然后计算路径权重分数,计算公式如下:score=val_path·r(i),vul_path为预设的一个漏洞路径权重;如果d(i)大于该路径Pvul的触发漏洞路径深度depthvul,执行步骤4-2所述的当前程序的执行指令后跳转至4-4,否则执行步骤4-2所述的当前程序的执行指令,跳转至4-2;
4-4、返回权重分数score,执行完程序后续指令。
2.根据权利要求1所述的一种用于漏洞发掘的动态符号执行路径搜索算法,其特征在于,符号执行的过程如下:
3-1、首先将生成的子测试输入集初始化为空集;
3-2、以步骤2-4中选择的测试用例作为程序输入,符号执行该测试程序,首先获取测试程序当前指令,依据指令类型的不同,进行不同的符号执行操作,同时进行漏洞检测,如果触发程序漏洞,则标记当前程序的执行路径的父路径,将从程序入口处到触发漏洞处形成的一条程序路径视为父路径,记录路径深度,并搜集路径约束,如果没有触发漏洞,则仅搜集路径约束条件;
3-3、对于搜集到的路径约束条件,逐一进行约束取反;
3-4、调用求解器对约束表达式进行求解,生成后续的测试输入;
3-5、将后续的测试输入加入到子测试输入集中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410230479.8A CN104008053B (zh) | 2014-05-28 | 2014-05-28 | 一种用于漏洞发掘的动态符号执行路径搜索方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410230479.8A CN104008053B (zh) | 2014-05-28 | 2014-05-28 | 一种用于漏洞发掘的动态符号执行路径搜索方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104008053A CN104008053A (zh) | 2014-08-27 |
CN104008053B true CN104008053B (zh) | 2016-07-06 |
Family
ID=51368713
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410230479.8A Active CN104008053B (zh) | 2014-05-28 | 2014-05-28 | 一种用于漏洞发掘的动态符号执行路径搜索方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104008053B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106446688A (zh) * | 2016-11-09 | 2017-02-22 | 中国科学院软件研究所 | 一种基于dcr的动态漏洞挖掘方法及系统 |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104375942B (zh) * | 2014-12-11 | 2017-02-08 | 无锡江南计算技术研究所 | 一种面向二进制的混合模糊测试方法 |
CN104732152B (zh) * | 2015-04-07 | 2017-11-24 | 南京大学 | 基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 |
CN106354630B (zh) * | 2016-08-23 | 2018-11-13 | 电子科技大学 | 一种基于动态符号执行的软件缺陷检测方法 |
CN106502912B (zh) * | 2016-10-31 | 2019-01-08 | 电子科技大学 | 用于漏洞发掘的动态符号执行可视化方法 |
CN107239317A (zh) * | 2017-06-07 | 2017-10-10 | 成都四象联创科技有限公司 | 可执行程序编程优化方法 |
CN109426609B (zh) * | 2017-08-29 | 2021-11-30 | 富士通株式会社 | 测试应用的方法和装置 |
CN108073817A (zh) * | 2017-12-05 | 2018-05-25 | 中国科学院软件研究所 | 一种基于主动构造的离线堆溢出漏洞挖掘方法 |
CN109063483B (zh) * | 2018-06-21 | 2020-05-12 | 北京大学 | 一种基于路径追踪的漏洞检测方法及系统 |
CN109634862B (zh) * | 2018-12-12 | 2022-02-22 | 腾讯科技(深圳)有限公司 | 应用分析方法、装置及存储介质 |
CN110287693B (zh) * | 2019-06-13 | 2023-07-21 | 成都积微物联集团股份有限公司 | 基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 |
CN112765603B (zh) * | 2021-01-28 | 2022-04-05 | 电子科技大学 | 一种结合系统日志与起源图的异常溯源方法 |
CN115292206B (zh) * | 2022-10-08 | 2023-03-14 | 西安深信科创信息技术有限公司 | 软件漏洞检测方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101710378A (zh) * | 2009-10-10 | 2010-05-19 | 北京理工大学 | 一种基于序列模式挖掘的软件安全漏洞检测方法 |
CN101968766A (zh) * | 2010-10-21 | 2011-02-09 | 上海交通大学 | 计算机程序实际运行时触发软件漏洞的检测系统 |
WO2012132125A1 (ja) * | 2011-03-30 | 2012-10-04 | 株式会社日立製作所 | 脆弱性判定システム、脆弱性判定方法、および、脆弱性判定プログラム |
CN103116540A (zh) * | 2013-01-23 | 2013-05-22 | 电子科技大学 | 基于全局超级块支配图的动态符号执行方法及其装置 |
-
2014
- 2014-05-28 CN CN201410230479.8A patent/CN104008053B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101710378A (zh) * | 2009-10-10 | 2010-05-19 | 北京理工大学 | 一种基于序列模式挖掘的软件安全漏洞检测方法 |
CN101968766A (zh) * | 2010-10-21 | 2011-02-09 | 上海交通大学 | 计算机程序实际运行时触发软件漏洞的检测系统 |
WO2012132125A1 (ja) * | 2011-03-30 | 2012-10-04 | 株式会社日立製作所 | 脆弱性判定システム、脆弱性判定方法、および、脆弱性判定プログラム |
CN103116540A (zh) * | 2013-01-23 | 2013-05-22 | 电子科技大学 | 基于全局超级块支配图的动态符号执行方法及其装置 |
Non-Patent Citations (3)
Title |
---|
Automated whitebox fuzz testing;P.Godefroid;《In Proceedings of the Network and Distributed System Security Symposium》;20081231;全文 * |
动态程序分析技术在软件安全领域的研究;陈厅;《中国博士学位论文全文数据库 信息科技辑》;20140515;第70页,第75-76页,第79页 * |
基于符号执行的软件脆弱性测试技术;闫晓伟;《中国优秀硕士学位论文全文数据库 信息科技辑》;20130115;第16页,第37-39页 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106446688A (zh) * | 2016-11-09 | 2017-02-22 | 中国科学院软件研究所 | 一种基于dcr的动态漏洞挖掘方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN104008053A (zh) | 2014-08-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104008053B (zh) | 一种用于漏洞发掘的动态符号执行路径搜索方法 | |
CN102708045B (zh) | 一种缓解路径爆炸的动态符号执行方法 | |
CN104598383A (zh) | 一种基于模式的动态漏洞挖掘集成系统和方法 | |
CN103116540B (zh) | 基于全局超级块支配图的动态符号执行方法 | |
CN102253889B (zh) | 一种回归测试中基于分布的测试用例优先级划分方法 | |
US9355019B2 (en) | Method for test case reduction based on program behavior slices | |
CN101714118B (zh) | 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法 | |
CN102508780B (zh) | 一种用于软件测试的交叉式动态法和装置 | |
CN104503917B (zh) | 基于数据流函数调用路径的变更影响域分析方法及系统 | |
CN104899147A (zh) | 一种面向安全检查的代码静态分析方法 | |
CN105095491A (zh) | 基于Petri网基本结构的过程模型修复方法 | |
CN104732152B (zh) | 基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 | |
CN106951368A (zh) | 基于uml时序图的测试用例自动生成方法 | |
CN106503496A (zh) | 基于操作码替换与合并的Python脚本程序防逆转方法 | |
CN104503901A (zh) | 一种基于静态路径分析的导向符号执行方法 | |
CN105677306A (zh) | 自动化脚本的编写方法和装置 | |
CN101551842A (zh) | 一种基于模型驱动的安全测试方法 | |
CN102968375B (zh) | 基于关联规则挖掘的不可达路径检测方法 | |
CN103714000A (zh) | 一种面向敏感区域的嵌入式软件测试用例生成方法 | |
CN105045715A (zh) | 基于编程模式和模式匹配的漏洞聚类方法 | |
CN109976806B (zh) | 基于字节码序列匹配的Java语句块克隆检测方法 | |
CN105824825A (zh) | 一种敏感数据识别方法和装置 | |
CN105117336A (zh) | 一种动态标记处理控制依赖的方法 | |
CN101271397A (zh) | 一种嵌套循环结构的识别方法 | |
Goto et al. | How to extract differences from similar programs? A cohesion metric approach |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |