2019-基于符号执行与模糊测试的混合测试方法

摘 要: 软件测试是保障软件质量的常用方法,如何获得高覆盖率是测试中十分重要且具有挑战性的研究问题.模糊测试与符号执行作为两大主流测试技术已被广泛研究并应用到学术界与工业界中,这两种技术都具有一定的优缺点:模糊测试随机变异生成测试用例并动态执行程序可以执行并覆盖到较深的分支,但其很难通过变异的方法生成覆盖到复杂条件分支的测试用例.而符号执行依赖约束求解器,可以生成覆盖复杂条件分支的测试用例,但在符号化执行过程中往往会出现状态爆炸问题,因此很难覆盖到较深的分支.有工作已经证明,将符号执行与模糊测试相结合可以获得比单独使用模糊测试或者符号执行更好的效果.分析符号执行与模糊测试的优缺点,提出了一种基于分支覆盖将两种方法结合的混合测试方法——Afleer,结合双方优点从而可以生成具有更高分支覆盖率的测试用例.具体来说,模糊测试(例如AFL)为程序快速生成大量可以覆盖较深分支的测试用例,符号执行(例如KLEE)基于模糊测试的覆盖信息进行搜索,仅为未覆盖到的分支生成测试用例.为了验证 Afleer 的有效性,选取标准程序集LAVA-M 以及实际项目 oSIP 作为评测对象,以漏洞检测能力以及覆盖能力作为评测指标.实验结果表明:(1) 在漏洞检测能力上,Afleer 总共可以发现 755 个漏洞,而 AFL 仅发现 1 个;(2) 在覆盖能力上,Afleer 在标准程序集上以及实际项目中都有不同程度的提升.其中,在 oSIP 中,Afleer 比 AFL 在分支覆盖率上提高 2.4 倍,在路径覆盖率上提升 6.1倍.除此之外,Afleer 在 oSIP 中还检测出一个新的漏洞.

3 主要方法
3.1 方法框架
本文所提出的 Afleer 方法的框架如图 3 所示,该方法主要包括两个阶段:左边是编译阶段,右边是运行阶段.给定一个程序,首先我们将其编译为插桩后的 LLVM 位码以及插桩后的可执行文件,其中,LLVM 位码用于符号执行,而可执行文件用于模糊测试.需要注意的是,LLVM 位码和可执行文件必须一致,亦即在优化后,最终的控制流图相同并且插桩信息保持一致.在运行阶段,Afleer 分别运行模糊测试以及符号执行,其中模糊测试不断地生成测试用例并更新覆盖信息(例如,AFL 中的 virgin_bits),该信息反映了哪些分支已经被覆盖到或者尚未被覆盖到.而在另一端,符号执行系统性地搜索程序执行树,当发现某个分支(p,c)未被覆盖时,则生成相应的测试用例T 并加入到测试用例集中.模糊测试监控新增测试用例集,当有新的测试用例 T 时,将其读入并加入到自己的测试用例队列中,此时,(p,c)已被覆盖.基于新的测试用例,模糊测试可以继续探索(p,c)后面的分支.通过不断的迭代,最终 Afleer 可以覆盖到更多的分支.下面,我们将详细介绍 Afleer 方法的实现细节.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值