模糊测试基础指南(下)

atp7bkil 新闻 2019年6月21日发布
Favorite收藏

导语:本文章从一个较高的层次解释了什么是模糊测试,并简要讨论了模糊测试的原因和反对模糊测试的原因,并且进一步解释了你为什么需要自己动手开始模糊测试以及典型的fuzzer体系架构。

(接上文)

模糊测试器的Worker

worker是负责执行测试用例生成器提供的测试用例。当然,它还需要及时识别出一些意外的行为。

通常执行测试是非常简单的。worker用给定的输入检测任何不当行为的迹象。举个显而易见的例子,就是执行从C系列编程语言编译的二进制文件,例如其易于出现内存损坏问题的二进制文件。在这种情况下,崩溃是一种典型的错误,可以很容易地被发现。将编译器工具与AddressSanitizer之类的工具一起使用可以帮助检测非崩溃类型的内存安全漏洞。

日志记录器

日志记录器可记录或存储发现的每一个崩溃问题及其各自的测试用例。如果fuzzer被覆盖,它还可以存储任何发现新代码覆盖的测试用例。这样的记录可以简化崩溃堆栈跟踪崩溃的分析。记录下导致崩溃的测试用例是非常重要的,否则崩溃将无法再现。

总结

模糊测试是一种很好的自动的、连续查找错误的方法。对于开发人员来说,模糊测试可能非常有用,因为它能够尽早地发现错误,有时甚至在发布之前找到错误。当然模糊测试也可以用作回归测试的工具,以查找重新引入的错误。对于安全研究人员来说,模糊测试是查找错误的一个很好的工具,因为它能够发现人工审计或渗透测试找不到的错误,并且可以在处理其他事情时保持运行。

模糊测试的过程中最困难的部分是提高fuzzer的效率。每个fuzzer的效率取决于每次测试崩溃次数与每秒运行的测试数,fuzzer的总体目标是在尽可能短的时间内找到尽可能多的崩溃值。

典型的fuzzer由三个组件组成:一个用于生成输入文件的测试用例生成器,一个执行测试用例的worker,用于识别被模糊测试的程序的意外行为,以及一个记录有意义的测试用例并可能堆栈崩溃或恶意行为痕迹的记录器。

1  – 模糊测试工具

本节简要介绍几种用于模糊测试的测试工具,以概述可用的工具并简化模糊测试的入门过程。虽然使用现有的fuzzer更容易,但是自编的fuzzer或调整后的现有fuzzer可能会产生更好的结果。需要说明的是,这个列表不一定全面,指在展示一系列不同模糊测试技术的典型示例。

介绍工具列表

1. Sanitizers

2. Radamsa

3. American Fuzzy Lop (AFL)

4. Peach Fuzzer

5. honggfuzz

6. libFuzzer

7. domato

8. sqlmap

Sanitizers

Sanitizers不是特定用于模糊测试的工具,但它是一个可用于检测崩溃的强大工具,它可以在编译时就在目标程序中插入断言。包含在clang / clang ++中的一些比较有意思的Sanitizers有AddressSanitizer,ThreadSanitizer,MemorySanitizer和UndefinedBehaviourSanitizer。发生崩溃时,所有Sanitizers都会提供拓展日志,包括触发的漏洞类型和程序的堆栈跟踪。因为引入了CPU和储存空间,所以它们很少被用于应用程序。在选择Sanitizers上应取决于想检测的崩溃类型。

1. AddressSanitizer(ASan)是最常用的模糊测试sanitizer,因为它能够检测UAF,缓冲区溢出漏洞和其他内存安全问题。

2. ThreadSanitizer(TSan)是一种能够检测数据竞争环境的Sanitizers。但是,它目前处于测试状态,并且会引入大量内存。

3. MemorySanitizer(MSan)可以检测对未初始化内存的读访问。

4. UndefinedBehaviourSanitizer(UBSan)可用于检测程序中的未定义行为,例如(带符号)整数溢出或指针未对齐。具体请参阅clang官方文档中的可检测未定义行为的完整列表。

Radamsa

Radamsa是一种基于fuzzer的通用变异形式。这款fuzzer适用于无经验的测试人员,因为它易于安装和使用。它可尝试根据输入结构的不同变化的引擎随机识别数据结构和变异。这里有手册中的一个用法示例:

$ echo "Fuzztron 2000" | radamsa

$ echo“Fuzztron 2000”| radamsa

Fuzztron 4294967296

Fuzztron 4294967296

尽管Radamsa的本质很简单,但它还是可以帮助人们在公共软件(包括主要浏览器等)发现许多漏洞

American Fuzzy Lop

在谈论模糊测试的时候,不得不提及Michal Zalewski a.k.a. lcamtuf设计的American Fuzzy Lop(AFL)。 AFL是一种基于覆盖引导的变异型 dumb fuzzer,即它不需要任何有关输入结构的信息。但由于其智能的设计,它能够产生大部分有效的输入。它附带了复杂的模糊测试的基础设施,包括测试用例最小化和gcc和clang的修改版本。在Michal Zalewski的博客上有列出了使用AFL发现的一系列错误。

AFL的前身名为bunny-the-fuzzer。 Bunny-the-fuzzer于2007年发布,它是一个渐进式的fuzzer,试图尊重程序的内部状态以产生更好的输入。然而,根据Michal Zalewski的说法,它的表现几乎不比随机的fuzzers好(具体可参见 historical notes of AFL)。

Peach Fuzzer

 Peach Fuzzer 是一种高度灵活的测试框架。它可以是智能或dumb 模糊测试,根据配置生成或改变输入。它的主要优点是能够模糊测试几乎所有东西——它可以生成基于文件的输入,模糊测试网络协议,制作Web请求和状态感知协议。由于其灵活性,在实际模糊测试之前需要大量配置,因此它针对经验丰富的测试人员。 Peach Fuzzer 还提供了一个闭源企业版,其中包含用于通用协议和文件格式的预配置数据模型,有着更多变异算法、票证系统集成。

libFuzzer

LibFuzzer是一个使用演化测试用例生成的覆盖引导的进程内的引擎。进程中的模糊测试是一种特殊的模糊测试技术,其中的模糊测试仅在一个进程中发生,即对于每个测试用例,进程不必重新启动但是内存中的值已经改变。与进程外的模糊测试相比,这可以大大加快模糊测试的速度。

honggfuzz

Honggfuzz类似于libFuzzer,因为它是一个由反馈驱动的进化型fuzzer。它支持除覆盖引导之外的多种反馈方法,并包括进程内和进程外的模糊测试选项。 Honggfuzz具有多进程和多线程架构,使得在单个Fuzzer实例中轻松使用所有核心的潜力。

Domato

Domato是由Ivan Fratric编写的DOM fuzzer,被Project Zero用于他们的Great DOM Fuzz-off of 2017。从技术上讲,domato不是一个真正的fuzzer,而是一个测试用例生成器,因为它只能根据给定的,易于扩展的语法生成HTML,CSS和JavaScript。

sqlmap

Sqlmap不是一个寻找崩溃的fuzzer。它被用作是一个渗透测试工具,用于自动检测和利用SQL注入漏洞。

最后的说明

正如在介绍中已经说明的那样,这只是一小部分模糊测试工具的介绍。还可以在此链接中找到更多的介绍。

2  – 最新研究进展

本节概述了最近发表的关于模糊测试的研究。它将集中于公开的、新的模糊测试方式和测试用例生成技术的研究。

用碎代码进行模糊测试

Christian Holler,Kim Herzig和Andreas Zeller的这篇论文介绍了一个名为LangFuzz的新模糊器。 LangFuzz可利用给定的编程语言的语法来生成代码,由代码示例和变异引擎来创建测试用例。测试用例的内部表示是一个树,其中节点是来自现有或生成代码片段的随机代码片段。使用这种技术,langfuzz能够生成语法正确率很高的测试用例,同时还能够到达语言边缘的情况。作者在发布他们的研究时发现Mozilla JavaScript引擎中有105个漏洞,在使用Langfuzz的PHP解释器中有18个漏洞,并且现在仍在继续发现漏洞。

并非所有字节都相等:用于模糊测试的神经字节筛

来自微软研究团队的Mohit Rajpal,William Blum和Rishabh Singh撰写的这篇论文研究了如何使用神经模糊测试模型根据以前的覆盖结果去选择变异。如果先前的运行没有显示该位置的突变的新覆盖范围,则模型会否决AFL建议的输入文件的变异位置。作者发现,与小型输入文件(<100kB)在24小时内正常运行AFL相比,这样可得到更多的覆盖和崩溃。

libFuzzer-gv:快速又好用的新模糊测试技术

Guido Vranken的这篇博格文章介绍了除代码覆盖之外的模糊测试指导的指标。这里面包括堆栈深度引导的模糊测试测试,它可以帮助发现过多的递归崩溃和强度引导的模糊测试,这有利于输入多次击中非唯一代码的路径,以找到可能导致减慢DoS漏洞的输入。作者在libfuzzer的分支中实现了他的指导技术并将其发布在 GitHub.。

使用Munch改进函数覆盖:一种混合模糊测试和定向符号执行方法

Saahil Ognawala,Thomas Hutzelmann,Eirini Psallida和Alexander Pretschner撰写的这篇论文介绍了一种混合模糊测试技术,它结合了模糊测试和符号执行。符号或特征执行是一种通过创建表示分支条件的约束来达到程序中某些函数的技术,目的是达到代码库中的函数并使用SMT求解器去解决这些约束。 Munch使用的混合技术将AFL作为模糊测试引擎,并将KLEE的修改版本作为符号执行引擎。这样进行的实验表明,使用这种混合方法可以显着提高覆盖率,而不仅仅是模糊测试或符号执行。

Skyfire: 用于模糊测试的数据驱动种子生成

 Junjie Wang, Bihuan Chen, Lei Wei, and Yang Liu提出了一种基于概率上下文敏感语法生成种子文件的方法。他们正在试图解决这样一个问题: 对于需要基于上下文无关语法的复杂型输入文件的目标,大多数生成的测试用例在语义检查阶段早期就会被拒绝,而大多数漏洞则隐藏在应用程序执行阶段。 作者比较了来自网络的抓取样本和Skyfire生成的种子文件(这些文件是通过在 AFL 中用不同的播种方式生成的)。使用Skyfire种子输入文件的AFL在达到代码覆盖率和发现错误方面表现得更好。

评价模糊测试

George Klees,Andrew Ruef,Benji Cooper,Shiyi Wei和Michael Hicks撰写的这篇论文研究了模糊测试。作者评估了32篇最近发表的关于模糊测试的论文,并在所有研究论文中发现了实验评估的问题。大多数已发表的关于模糊测试研究的主要问题因为没有统一的度量实践存在而没有结果的可比性。因此,本文提出了一套用于评估新的模糊测试测试器或算法的最佳实践方式,例如“使用可靠,独立定义的基准测试套件”,统一超时时限和每次运行的测试次数等等。总结了用于评估模糊测试的基准性的建议。

结论

关于模糊测试的研究是一个热门话题,它的热门在于几乎每种方法都可以通过引入新技术和结合不同方法做进一步改进。但由于缺少统一的基准测试评估标准,目前还是很少有去比较模糊测试技术的研究。

关于模糊测试的博客文章到此结束,感谢阅读。

本文翻译自:https://labs.mwrinfosecurity.com/blog/what-the-fuzz/如若转载,请注明原文地址: https://www.4hou.com/info/news/18608.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论