Mozilla 自身是如何模糊 Firefox 浏览器的?

news2024/11/28 16:39:48

导语:Mozilla一直在模糊Firefox及其底层组件,它已被证明是识别质量和安全漏洞的最有效方法之一。

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数据,研究人员可以显示多年来各种模糊测试的影响。
在这里插入图片描述
模糊测中有许多组件, 这些组件在不断发展,以适应调试工具、执行环境和浏览器内部的变化。 开发人员总是在添加、删除和更新浏览器功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树的遍历及相关衍生

二叉树的遍历及相关衍生 前言二叉树的遍历建树二叉树的遍历遍历的分类代码部分 遍历根的应用打印树中的每个数据代码部分 遍历计算树节点个数代码部分 计算二叉树的深度思路代码部分 第k层个数 结束 前言 如标题所示,在这里我们要研究的是二叉树的遍历。 为什么不…

java获取星期几

如果你要问 java什么时候学习比较好,那么答案肯定是 java的星期几。 在 Java中,你可以使用 public static void main ()方法来获取一个类的所有成员变量,然后在所有类中调用这个方法来获取对象的所有成员变量。它能以对…

MCSM面板一键搭建我的世界服务器-外网远程联机【内网穿透】

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 转载自远程穿透文章&…

【C++】模拟实现map和set

1.关联式容器 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的 键值对,在数据检索时比序列式容器效率更高。 2 .键值对 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和val…

2023-04-16 学习记录--C/C++-邂逅C/C++(上)

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、固定格式 ⭐️ stdio的理解: abbr.标准输入输出&#xff08;standard input/output&#xff09;。 #include <stdio.h>…

【LeetCode:72. 编辑距离 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【Linux篇】Shell脚本语法

前言 在安卓源码里&#xff0c;离不开两个东西&#xff0c;一个就是.sh文件&#xff0c;还有一个就是.mk文件。 这两个文件各持有一个语法&#xff0c;一个是Makefile语法&#xff0c;一个是Shell脚本语法。 这两个是真的让我头疼&#xff0c;就像看天书一样&#xff0c;呜呜…

Mysql为json字段创建索引的两种方式

目录 一、前言二、通过虚拟列添加索引&#xff08;Secondary Indexes and Generated Columns&#xff09;三、多值索引&#xff08;Using multi-valued Indexes&#xff09;四、官网地址 一、前言 JSON 数据类型是在mysql5.7版本后新增的&#xff0c;同 TEXT&#xff0c;BLOB …

国内首款多节点/无需密钥/无需登录的ChatGPT客户端开源项目

在这个AI浪潮推动下&#xff0c;涌现了一大批“参差不齐”的GPT产品&#xff0c;有的一直在更新迭代&#xff0c;有的不断升级乃至付费订阅&#xff0c;有的中途停止运营。在这个AI产品也需要优胜劣汰的时代下&#xff0c;谁能够“谁主沉浮&#xff0c;且看今朝&#xff01;”&…

Ansible的基础了解

目录 第一章.Ansible概述 1.1.Ansible是什么 1.2.Ansible的特性和过程 1.3.ansible 具有如下特点&#xff1a; 1.4.Ansible的四个组件 1.5.ansible 核心程序 1.6.ansible执行的过程 第二章.Ansible 环境安装部署 2.1.实验环境&#xff0c;安装部署 第三章.ansible 命…

BLE调制与解调的一些东西

BLE调制 BLE是GFSK的IQ调制 IQ调制 所谓IQ调制&#xff0c;就是利用IQ两个分量序列去控制两路正交信号&#xff0c;I和Q两个序列可以是任意数字&#xff0c;也可以是符合某些规律的序列。 总的原理公式就是&#xff1a; cos(ab)cos(a)cos(b)-sin(a)sin(b) Acos(b)-Bsin(b)M…

音视频 FFmpeg

文章目录 前言视频编解码硬件解码(高级)软解码(低级)软、硬解码对比视频解码有四个步骤Android 系统中编解码器的命名方式查看当前设备支持的硬解码 基础知识RGB色彩空间常见的格式对比YUV索引格式分离RGB24像素数据中的R、G、B分量 BMP 文件格式格式组成像素排列顺序RGB24格式…

双指针技巧总结

一、双指针技巧——情景1 通常&#xff0c;我们只需要一个指针进行迭代&#xff0c;即从数组中的第一个元素开始&#xff0c;最后一个元素结束。然而&#xff0c;有时我们会使用两个指针进行迭代。 双指针的典型场景 (1)从两端向中间迭代数组。 (2)一个指针从头部开始&#…

Spark RDD (Resilient Distributed Datasets) 弹性分布式数据集

设计需求 Spark RDD 的设计目的是为了实现快速、可扩展和容错的数据处理。它是一个不可变的分布式数据集&#xff0c;可以在集群中分布式存储和处理数据。RDD 提供了一系列操作来处理数据&#xff0c;包括转换操作和行动操作。转换操作可以将一个 RDD 转换为另一个 RDD&#x…

Arduino学习笔记4

一.声控灯实验 1.源代码 int led2;//定义板子上数字2口控制小灯 int flag0;//定义一个变量记录小灯是亮起还是熄灭 int shengyin3;//定义声音传感器的控制口void setup() {pinMode(led,OUTPUT);//定义小灯为输出模式pinMode(shengyin,INPUT);//定义声音控制口为输入模式 } vo…

python+Django社区疫情防控系统 uniapp微信小程序

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

[jenkins自动化2]: linux自动化部署方式之流水线(下篇)

目录 1. 引言: 2. 进阶操作 流水线 -> 2.1 简介: -> 2.2 最终效果图展示: -> 2.3 有没有心动, 真的像流水线一样, 实现了一键部署启动 3. 实现方式 3.1 下载几个插件 3.2 创建流水线任务 3.3 点击配置 3.4 根据流水线语法 写一个简单的helloworld 3.5 执行…

数字化医院PACS影像系统 三维影像后处理技术应用

PACS影像存取与传输系统以实现医学影像数字化存储、诊断为核心任务&#xff0c;从医学影像设备&#xff08;如CT、CR、DR、MR、DSA、RF等&#xff09;获取影像&#xff0c;集中存储、综合管理医学影像及病人相关信息&#xff0c;建立数字化工作流程。 PACS系统可实现检查预约、…

【C++入门】内联函数

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 目录 什么是内联函数内联函数特性 什么是内联函数 内联函数概念&#xff1a; 内联函数就是以inline修饰的函数叫做内联函数&a…