Mozilla一直在模糊Firefox其底部组件已被证明是识别质量和安全漏洞的最有效方法之一。通常,研究人员会在不同层次上使用模糊测试:浏览器作为一个整体进行模糊测试,但也需要很多时间来使用孤立的代码(例如libFuzzer)或者整个组件(例如使用单个外壳)JS引擎)进行模糊测试。在本文中,研究人员只负责解释浏览器的模糊漏洞,并详细介绍他们已经找到的方法。
构建工具
为了尽可能有效,研究人员使用了各种漏洞检测方法。这些包括清除器,如清除器AddressSanitizer(带有LeakSanitizer)、ThreadSanitizer和UndefinedBehaviorSanitizer,以及使用调试构建来启用断言和其他操作时的检查。研究人员还使用了图像rr和Valgrind这样的调试器。这些工具中的每一种都提供了不同的视角来帮助发现特定的漏洞类型,但许多工具彼此不兼容,或者需要使用自己的定制版本来发挥作用或提供最佳结果。除了提供调试和漏洞检测外,一些工具不能工作,如代码覆盖率和libFuzzer。每个操作系统和系统结构的组合都需要一个独特的子集,可能只支持这些工具。
最后,每个变体都有多个活动变体,包括发行版,Beta版、nightly版本和延长支持版本(Extended Support Release, 简称“ESR”),Firefox CI Taskcluster每个例子都会定期构建。nightly版本,通常是开发者自己维护的一个版本。白天的时候开发者们将各自的修改提交到一个中心代码库,然后在晚上做一次编译得到的版本。一般来说nightly版本将包含最新的漏洞修改和新功能,因此适合关注某个漏洞或特别喜欢最新版本的用户。但由于没有得到充分的测试,可能会有许多不稳定的地方。
下载版本
Taskcluster很容易找到和下载最新版本进行测试。研究人员讨论了由不同仪器类型创建的变体的数量,研究人员需要自动模糊它们。由于构建、工件、系统结构、操作系统和每个软件包的大量组合,下载是一项艰巨的任务。
研究人员开发了一管理的复杂性,研究人员开发了一种叫做建筑管理的方法fuzzfetch的工具。Fuzzfetch所需的构建参数可以很容易地指定,并且可以下载
如何生成测试用例?
由于本博客的目的是解释整个过程,研究人员不会花太多时间解释模糊测试,并使用公共可用和定制的模糊测试器生成测试用例。
如何执行、报告和扩展
对于以浏览器为目标的模糊测试器, Grizzly创建适配器可以使研究人员轻松地管理和操作测试用例并监控结果Grizzly现有模糊的模糊测试器。Grizzly它是一个应用程序框架,专门解决成千上万用户访问服务器时的各种漏洞。
为了充分利用给定设备上的任何可用资源,研究人员并行运行多个资源Grizzly实例。
对于每个模糊测试器,研究人员创建了包装和运行所需配置的容器。这些都存在于Orion monorepo中Monorepo?Monorepo 其实不是一个新的概念,在软件工程领域,它已经有着十多年的历史了。概念上很好理解,就是把多个项目放在一个仓库里面,相对立的是传统的 MultiRepo 模式,即每个项目对应一个单独的仓库进行分散管理。每个模糊测试器都有一个配置,具体模糊测试器的优先级配置具体的部署和资源分配。Taskcluster对模糊测试节点进行分配和管理。
Grizzly Target检测悬挂、崩溃等漏洞。Target是Grizzly与浏览器之间的接口。检测到的漏洞将自动打包并报告FuzzManager服务器。FuzzManager服务器提供自动化和筛选结果UI。
使用其他更有针对性的模糊测试器JS shell和基于libFuzzer目标使用模糊接口。许多第三方库都在OSS-Fuzz它也被模糊了,不在本文的讨论范围内。
模糊测试结果
多个模糊器对不同目标的大规模运行会产生大量数据,不适合直接输入漏洞跟踪系统,如Bugzilla。FuzzManager在离开模糊测试节点之前,客户端库可以过滤崩溃变化和重复结果。唯一的结果结果FuzzManager服务器FuzzManager的web界面可以创建签名,将报告分组到存储桶中,帮助客户检测重复结果。
模糊测试器通常生成数百甚至数千行的测试用例。FuzzManager存储桶将自动扫描Taskcluster队列减少任务。使用这些恢复任务Grizzly Reduce和Lithium应用不同的恢复策略通常会删除大多数不必要的数据。每个存储桶将继续处理,直到恢复操作成功完成。然后,工程师可以最终检查最小化的测试用例,并将其添加到漏洞报告中。最终结果通常被用作Firefox测试套件中的崩溃测试。请点击此处查看测试过程。还定期测量模糊器的代码覆盖率,重复使用FuzzManager收集代码覆盖率数据,生成覆盖率报告。
漏洞报告
由于研究人员的目标是创建可操作的漏洞报告,以尽快修复漏洞,并尽量减少开发人员的费用。
研究人员通过以下方式做到这一点:
日志、堆栈跟踪等崩溃信息;
建设和环境信息;
减少测试用例;
Pernosco会话;
回归范围(通过Bugmon分割);
通过Bugmon进行验证;
Grizzly Replay是形成Bugmon和Grizzly Reduce引擎的基本执行工具使收集rr痕迹提交到Pernosco变得容易。它使浏览器测试用例在自动化和手动使用方面容易重新运行。
如前所述,研究人员一直在使用Pernosco。Pernosco是一个为rr跟踪提供web界面工具使开发人员可以使用它们,而无需直接访问执行环境。这是同名公司开发的工具,可以极大地帮助调试大规模并行应用程序。当测试用例过于不可靠,无法减少或附加到漏洞报告中时,它也非常有用。创建一个rr跟踪上传可以使不再使用的漏洞报告可操作。
Grizzly和Pernosco合并带来了一个额外的好处,那就是使不常见和难以重现的漏洞可行。一个非常不一致的漏洞测试用例可以运行数百次或数千次,直到在那里rr直到发生所需的崩溃。跟踪自动收集并准备提交Pernosco并由开发人员修复,而不是因为它不能操作而被忽视。
适当评估新特性,可以通过fuzzing@mozilla.com或通过Matrix联系。一旦组件开始模糊测试,研究人员将主要通过Bugzilla进行通信。如前所述,研究人员努力解决可修复的漏洞。
Bugmon将回归范围自动平分为两部分,并尽快通知合适的人员,并将漏洞标记为“已修复”然后进行验证。关闭漏洞将自动将其从FuzzManager因此,如果在代码库中发现类似的漏洞,可以再次识别。
模糊测试中发现的一些漏洞将阻止研究人员有效地模糊功能或构建变体,这些漏洞被称为模糊阻止程序,它们以几种不同的形式出现。从产品的角度来看,这些漏洞似乎是无害的,但它们可以阻止重要的代码路径,甚至完全阻止模糊测试目标。对这些漏洞进行适当的优先级和快速的修复是非常有用的。
PrefPicker用于模糊测试的管理Firefox首选项集。请考虑在首选项后添加功能PrefPicker在模糊过程中使用模糊模板。PrefPicker定期审核模糊模板有助于确保不遗漏区域,并尽可能有效地利用资源。
与其他领域一样,衡量是评估成功的关键部分。研究人员使用它Bugzilla的meta bug帮助跟踪模糊器识别的漏洞。研究人员试图使每个模糊器和每个模糊的新组件都有一个meta bug。
例如,Domino的meta bug列出了工具标识的所有漏洞(超过1100个)。使用这个Bugzilla研究人员可以显示多年来各种模糊测试的影响。
模糊测试中有许多组件,以适应调试工具、执行环境和浏览器内部的变化。开发人员总是添加、删除和更新浏览器功能。
本文翻译自:https://blog.mozilla.org/attack-and-defense/2021/05/20/browser-fuzzing-at-mozilla/如果转载,请注明原始地址。