Java 模糊测试
(给ImportNew加星标,提高Java技能)
编译:ImportNew/唐尤华
模糊测试(Fuzz Testing)是一种自动化技术,用来在代码中查找哪些输入会出发程序执行逻辑变异。尽管存在许多变化,模糊测试的基本思想很容易解释。从一组中挑选一个初始输入,修改一些bit,然后用修改后的内容作为输入运行程序。如果程序运行出现新的结果(在以前的任何输入条件下都没有见过),把它保存下来以备将来分析。否则放弃修改,重新开始新一轮测试。如此快速重复执行数百万次。
也许有人认为,这种简单的方法永远找不到任何有趣的结果。请再考虑一下,例如,这种随机的突变过程可以凭空合成出格式良好的JPEG文件。模糊测试在各种成熟的项目发现了数千计的安全漏洞,可以说非常成功。
因此,大型机构很快就了解到它的好处。Google最近开源了ClusterFuzz。它在Chrome中发现了大约16,000个错误,在其他开源项目中发现了大约11,000个错误。Facebook在2017年收购了Sapienz,这是一款通过模糊测试发现Android应用程序崩溃的工具。
尽管取得了成功,然而模糊测试几乎只适用于非托管或“unsafe”语言(C/C++),这些语言提供了数十种开源或商业模糊测试工具。但是,现如今几乎没有针对托管语言(例如Java、Python、Javascript、C#)的模糊测试。的确,unsafe 语言中的内存损坏漏洞通常意味着存在安全漏洞,但托管语言同样也存在非托管语言模糊测试中检测到的许多相同漏洞:例如输入崩溃、空指针异常、无限循环、过度使用资源,以及许多其他漏洞。
Diffblue使用模糊测试以及其他动态代码分析技术编写测试和查找错误。早期的运行结果令人鼓舞。在运行24小时后,Diffblue可以为大型Java服务(Apache Solr 288,000行代码)实现36%的端到端测试覆盖,并且找到了使服务器崩溃的70多种独特方法(Solr开发人员已开始修复这些问题)。
这里有什么好的经验?永远不要低估精心配置过的随机搜索。事实证明,模糊测试能够找到执行关键代码路径的输入。对于托管语言,还有很多内容有待讨论。请继续关注模糊测试和Diffblue更新。
推荐阅读
(点击标题可跳转阅读)
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
好文章,我在看❤️