问:一位研究员最近用模糊测试发现了许多苹果和微软的漏洞。在内部软件开发过程中如何使用模糊测试来发现漏洞呢?
答:现在,很多软件开发员、正规的安全研究者和网络罪犯都在使用模糊测试技术——一种用大量无效的、意料之外的,或者随机的数据来轰击运行中的程序的输入的技术——来测试代码的坚固性。如果模糊数据导致程序在响应这个参数操作时出现失效、崩溃、锁起、消耗内存,或者不可控制的错误的话,开发者或研究者就会知道代码中存在缺陷。这就是模糊工具常被称为错误注入器的原因,而模糊测试也被称为坚固性测试或者负面测试。最初的模糊工具Fuzz是Wisconsin Madison大学的教授Barton Miller和他的学生们在1989年开发的。
微软通过运行上百万次的模糊测试在Office2010中发现了超过1800个错误,这些测试不光在他们实验室的机器上运行,也在他们公司内部的闲置个人计算机上运行。早期模糊测试需要测试员在一台机器上设置一个模糊测试软件,然后让它运行一个星期。我认为你的应用程序不太会和微软Office一样大型和复杂,但是可以肯定模糊测试一样会在你的软件开发生命周期中发挥作用。
由于模糊测试生成无效的输入,它对测试错误处理流程和发现缓冲区溢出、拒绝服务(DoS)、SQL注入、跨站点脚本(XSS)和格式化字符串漏洞很有效果。它在发现C或者C++程序中和内存相关的漏洞(可能会成为安全漏洞)方面也很有用。显然,你需要保存模糊测试中所生成的数值,并保留模糊测试器所生成的任何debug信息,这样如果发生了一个错误,你就可以重现它。实现这一目的的***办法是建立一个简单的测试来隔离错误,并使得问题更容易理解和解决。
模糊测试的一个常见方式是定义危险值列表,也就是模糊载体,然后把它们注入到程序中。例如,在程序要求输入正的整数的时候,你应该给它输入零、负数以及很大的数字。对字符,你会输入可识别的字符、引用和系统命令,而如果应用程序读取或者使用其他文件,你会给它发送损坏的或者意料之外的文件格式。不过一个模糊测试器对应用了解的越多,就越不太可能发现“非常规”错误。所以一些程序员喜欢使用穷举和随机的方法,不用对软件行为有任何的预知。模糊测试可以帮助发现潜在的逻辑错误,但是要重现那个引起程序逻辑错误的事件和值可能会很困难。由于不同的模糊测试器会发现不同的漏洞,用不同的测试器运行不同的测试可能会很有用。你可以尝试的一些免费的测试器包括JbroFuzz、WSFuzzer、Powerfuzzer和SPIKE。
在内部软件的开发流程中增加模糊测试肯定会提高软件的可靠性和安全性,因为它可以发现那些通常代码检查和人工测试很难发现的错误。由于这个方式涉及到使用那些被黑客用来发现漏洞的工具,它还可能帮你赶在黑客之前发现漏洞。但是,模糊测试需要与其他测试技术相结合;模糊器不总能发现那些不会引起程序崩溃的漏洞,例如加密或者其他的数据保护流程的不足。重要的是要把模糊测试作为一个漏洞发现方式,而不是一种质量保证方式。
【编辑推荐】