摘要:作为对传统随机模糊的一种改进,定向模糊利用动态污点分析来定位种子输入中可能影响安全敏感程序点的区域,并重点对这些已识别区域进行变异,以生成揭示错误的测试用例。种子输入对于定向模糊非常重要,因为它们本质上决定了我们可以测试的安全敏感程序点的数量。在这篇文章中,我们提出了一种种子选择方法,作为对定向模糊的种子生成方法的补充。通过使用静态分析、动态监控和符号执行,我们的方法可以提供带有种子的定向模糊,以经济高效的方式覆盖更安全敏感的程序点。我们实现了一个名为SeedFuzz的原型,并将其应用于五个实际应用程序。实验结果表明,使用我们精心选择和生成的种子启动定向模糊,SeedFuzz可以测试更关键的程序站点并检测更多的bug。
一、引言
在本文中,我们提出了一种基于Scand选择和生成有向模糊种子的方法,并在一种新的有向模糊工具SeedFuzz中实现了该方法。我们为自己设定的目标是一种有效的种子供应方法,以改进定向模糊,从而尽可能多地测试关键站点。
为了让这种方法发挥作用,我们需要解决两个主要挑战。第一个问题是如何从候选种子(即Scand)中选择合适的种子。我们利用静态分析和动态监控来选择Scand的最小子集,其特点是能够覆盖Scand可以覆盖的所有关键站点(即CScand)。我们用Ssel表示这些精心挑选的种子,用CSsel表示Ssel可以覆盖的关键位点。我们的种子选择方法背后有两个直觉:1)关键位点是定向模糊的关键因素。如果种子能覆盖更多关键部位,它们可能会产生更多的虫子;2) 有些种子覆盖着同样的关键站点,并且此类种子在定向模糊测试期间可能会产生相同的错误。
种子选择后,set CSall-CSsel 中可能存在许多所选种子无法到达的关键站点。我们的第二个挑战是如何生成定向模糊测试的种子,以测试这些剩余的未覆盖的关键位点。合成输入以覆盖目标,是自动测试生成和调试中的一个基本问题[7][8][9][10]。虽然我们借鉴了这些领域现有技术的想法,但我们的方法结合了静态分析,动态监控和符号执行,使输入生成过程更加有效。首先,我们收集从程序条目到未覆盖的关键站点的条件分支指令,并记录其值。然后,我们使用此跟踪信息来引导符号执行,以探索更有可能到达未覆盖的关键站点的路径。执行目标关键站点时,通过求解当前路径约束生成输入。我们使用Sgen来表示在此过程中新生成的种子,并使用CSgen来表示Sgen可以覆盖的关键站点。
最后,将选定的种子与新生成的种子(即Ssel∪Sgen)一起提供给定向模糊测试作为其起点。与随机种子选择策略相比,我们的方法更具选择性和针对性,可以有效和积极地覆盖关键站点。
总之,我们的工作做出了以下贡献:1)我们提出了一种新的方法来选择和生成用于定向模糊的种子,以测试尽可能多的关键站点。2) 我们在一个新的定向模糊工具SeedFuzz中实现了这种方法