(给 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更新。
(点击标题可跳转阅读)
使用类型重构
JSON 文件映射成 Java 枚举
想快速学 Java?所有 Java 教程都可以烧掉了
看完本文有收获?请转发分享给更多人
好文章,我 在看 :heart: