模糊测试:如何自动发现漏洞

模糊测试:如何自动发现漏洞

模糊技术用于通过生成程序员没有考虑的输入来检测安全漏洞和其他错误

¿什么是模糊?-安全测试

模糊是程序员、安全研究人员和漏洞猎人用来测试和发现软件漏洞的技术。
该技术包括对应用程序进行自动测试,引入随机数据和修改预期数据输入,以引起其行为中的故障。

模糊的历史

软件开发自成立以来就发展迅速。与硬件设计等其他部门相比,开发成本相对较低,它展示了为每一代硬件迭代多代的能力。在这种变革能力中,人们必须将软件用户的期望作为变革和进化的动力。这使我们能够了解到,软件开发人员的需求必须像他们的产品一样不断发展。

软件历史留下了需求的痕迹,这些需求塑造了编程语言、工具甚至范式,使实现以前不可想象的目标成为可能。

这方面的一个例子可能是创建“C”编程语言,它有时被认为是第一种高级语言。与其前身相比,这种语言被认为更接近人类语言,并允许程序员从最终执行它的机器中抽象他们的代码

另一个可能的里程碑是面向对象编程的概念。引入了“对象”的概念,这是一个范式转变。对象可以同时包含数据和代码,而不是仅包含数据的传统变量。先验地,这种轻微的概念差异似乎不足以彻底改变一个行业。然而,这一变化允许将大部分软件模块化为实体,从而实现这些部分的开发脱耦合。面向对象的编程不仅限于此,但这个小想法催生了更复杂的概念,可以定义这些对象之间的关系,如继承或多态性。

尽管这些范式转变塑造了编程语言本身,但在整个软件历史上,都有足够重要的变化来推动创建适应几乎所有编程语言的工具。«测试»的概念与这个公会非常相关,以至于几乎为任何编程语言开发了“测试”工具。从根本上说,这个想法包括编程测试,这些测试验证代码是否以预期的方式响应一组已知的输入,这些输入代表了软件设计的用例。

这一概念甚至催生了一种范式,即首先设计软件规范,然后对测试进行编程,最后根据规范对该软件进行编程,以便它符合并通过测试。这个范式被命名为测试驱动开发或TDD。

测试有助于保持不断变化的软件的功能水平,但它们仅限于向软件提供预期数据,软件必须做出适当的反应。那么,当我们输入数据或使用意外数据作为软件的输入时,会发生什么?

模糊是一种试图通过生成程序员不考虑的输入揭示软件中的错误的技术。有时,这些意外的输入能够触发导致程序崩溃的错误,而不是显示错误消息或正确关闭。
这些崩溃可能是对内存滥用的回应,有时会产生非常高的安全影响。这些输入数据可能会导致服务中断(DoS – 拒绝服务)。在其他情况下,糟糕的内存管理使我们能够泄露我们不应该访问的数据(数据泄露)。在最坏的情况下,写入特定内存区域的能力将允许我们注入代码片段并执行它们(RCE-远程代码执行)。
还应该注意的是,由于程序员未考虑的可能程序输入数量非常多,这似乎是研究软件以自动方式查找错误的好方法。

模糊的困难一面

这项技术的基础知识很简单,可以用一个问题来概括:“当软件数据输入中引入意外数据时会发生什么?”。然而,这是一种复杂的技术,需要时间和资源才能获得好的结果。

当我们比较模糊和测试时会出现多个差异,这些差异凸显了试图实现的复杂性。

当程序员决定为他的软件编写测试时,这些最相关的差异之一就是例证。程序员必须考虑他的测试应该走多远。随后,他实施了它们,从这一刻起,这些测试的执行在时间上有一个确定和有限的持续时间。忽略软件的演变,用户发现新的错误,以及其他维护任务可能需要编写新的测试,这项任务在设计阶段后足够简单,以便其执行可以自动化。

然而,模糊涉及引入意想不到的数据,这些数据涵盖了无限的搜索范围。您可以随时寻找输入数据的新变体,并且您并不总是事先有关于该新变体是否会产生故障的信息。

使用模糊技术分析的另一个优点是,您可以在不访问其代码的情况下检查应用程序的安全性,以及它对故障注入攻击的弹性,因为测试可以针对最终编译的可执行文件执行,目的是在真实环境中测试它。

这种差异是一个重大的障碍。模糊需要投入时间和计算资源,但没有结果。相比之下,该测试的执行时间很短,报告了可能的操作问题,这非常确定。

图片[1]-模糊测试:如何自动发现漏洞

同样值得注意的是,这项技术可以提供的结果从根本上取决于如何生成畸形的输入数据。这是一项艰巨的任务,为了获得相关结果,必须研究和理解许多替代方案。

这方面的一个例子是研究实现某种完整性检查的网络协议的安全性。如果决定在这个研究案例中应用最通用的模糊技术之一,例如捕获协议的有效数据帧并随机修改其一些字段并将其发送回服务器,那么获得结果的概率将非常低。由于该协议实现了数据一致性检查,在不更新检查字段的情况下修改任意位置将不允许我们通过第一次检查,因此只对协议的第一个障碍进行研究,而忽略可能存在实现缺陷的更深层。

最后,值得一提的是,当这项技术设法产生一个应用程序失败,或数百个失败时,这取决于我们在生成输入方面的熟练程度,一旦我们设法重现其中一个失败,我们就会开始对模糊过程中获得的信息进行分类,并研究问题的根源。根据我们发现的错误数量,必须进行分类,以首先解决那些看起来更严重的错误,然后详细分析它们,以确定它们的起源或如何改进我们的代码,以解决这些漏洞

模糊的相关性和采用

由于实施模糊测试的困难,开发人员的采用率很低。它需要时间、知识,不能保证结果。另一方面,易受攻击的软件的影响可能非常大,这就是为什么有些人选择使用这种技术。

传统上,在安全方面选择了被动方法。用户需要报告错误和其他问题,或者第三方发现安全缺陷并发布它们。一些供应商通过赏金计划提供奖励来报告这些错误。

出于这些原因,传统上只有真正的激励第三方才能应用这种技术。有许多免费工具可以模糊软件,如AFL/AFL++、FuzzDB或Ffuf等,但软件开发人员使用的很少。然而,它们在安全研究人员中很常见,因为这些工具确实能够以自动化方式发现错误

有一些项目试图缩小这一差距。例如,OSS-Fuzz专注于提供和自动化部分模糊设置过程,以便开源项目收到可能的安全缺陷报告。截至2022年1月,OSS Fuzz项目已经发现了超过36,000个错误。

图片[2]-模糊测试:如何自动发现漏洞

开源软件模糊项目 – Let’s fuzz

对于那些对模糊技术感到好奇的人,下面列出了一些积极维护的开源模糊器的列表。

  • AFL(美国模糊Lop)/AFL++。可能是最著名的模糊项目。自2017年以来,AFL一直没有更新,这就是为什么AFL++,一个更新和最近的叉子出现的原因。这是一个非常广泛的项目,但相当复杂。它允许应用各种模糊策略,并通过QEMU或独角兽模拟器支持多个架构的二进制文件。
  • LibFuzzer。该项目是为那些可以访问源代码的情况而设计的。为了集成LibFuzzer,必须实现一个目标功能。此函数将与要使用Clang测试的代码一起编译。LibFuzzer使用LLVM后端的一部分来跟踪执行,并尝试覆盖二进制文件的大部分执行行。它是应用程序或库开发过程中最需要集成的焦点之一。
  • 洪格富兹。另一个项目有一些复杂性和许多配置选项。该项目由谷歌维护,是OSS Fuzz计划的一部分。它因其在Linux、*BSD、Android、Windows、Darwing/OS X等非常不同的操作系统上运行的能力而脱颖而出……

有数百个项目,如Fuzzilli、boofuzz、jazzer等。考虑到这么多选择,问题就出现了,选择哪一个是最好的。对此没有明确的答案,因为正如我们之前提到的,每个案例都有特殊要求。还应该注意的是,每个项目都实施了自己的自动错误搜索策略,因此结合不同的项目可以产生个人使用无法实现的结果。

结论

模糊是一种复杂的技术,需要投入时间、精力和非常高的资源投资。

尽管有缺点,但实现安全应用程序和软件的重要性意味着有使用它们的举措和资源,允许以自动化的方式发现安全漏洞和其他错误,而进行代码审查的审计师可能不会发现。

© 版权声明
THE END
喜欢就支持一下吧
点赞22 分享