模糊测试工具ClusterFuzz环境搭建及基础使用

模糊测试是指用随机坏数据(也称做 fuzz)攻击一个程序,然后等着观察哪里遭到了破坏。(出自 模糊测试)。一直以来都有不少的模糊测试工具,但大多只集中在数据生成,执行和异常检测依赖人工,没有比较完整的方案。

模糊测试工具ClusterFuzz环境搭建及基础使用

早在八年前,google 内部就在建设和使用模糊测试的工具来测试其内部的应用,而在两年前, google 推出了 OSS-Fuzz 服务,用于给开源项目的进行免费的模糊测试服务,可自动在新版本代码提交后自动完成 测试->异常检测->issue登记->老版本issue回归及自动关闭 的功能。背后使用的就是 ClusterFuzz 技术。流程图如下:

OSS-Fuzz 工作流程

而在过年前,google 开源了 ClusterFuzz ,并解决了原有 ClusterFuzz 必须依赖 Google Cloud 提供的服务这个问题,提供了本地运行的解决方案。根据官方介绍,它具备如下功能:

  • 高度可扩展,谷歌的内部实例运行在超过 25000 台机器上
  • 准确的去副本化(Accurate deduplication)
  • 问题跟踪器的全自动错误归档和关闭
  • 最小化测试用例
  • 通过二分法回归查找
  • 提供分析 fuzzer 性能和崩溃率的统计信息
  • 易于使用的 Web 界面,用于管理和查看崩溃
  • 支持引导模糊(例如 libFuzzer 和 AFL)和黑盒模糊测试

其大致执行流程如下:

ClusterFuzz 执行流程

当然,方案并不完美,如模糊数据统计、崩溃数据统计等功能由于依赖 google cloud 强大的数据处理能力,本地运行时是用不了的。官方说的总是美好的,现实是否这么完美呢?曾有人说,实践是检验真理的唯一标准,为了更好地了解这个工具,当然就要本地跑个demo玩下啦。

本地搭建及运行

要获得 ClusterFuzz 的完整功能,需要连接 Google Cloud Platform。但结合国情,我们更期望了解它纯本地运行能做到什么,因此这次尝鲜主要尝试纯本地运行。

注意:虽然运行可以脱离 Google Cloud Platform ,但部分安装时用到的工具需要到 Google 站点下载,所以,你懂得。

以下步骤均是在 macOS 10.14 上进行。

环境搭建

1、下载源码

git clone https://github.com/google/clusterfuzz
cd clusterfuzz

2、安装 google cloud sdk
进入 https://cloud.google.com/sdk/ ,按照引导安装 sdk 并配置好环境变量(mac 下可以直接用解压后的 install.sh 脚本一键安装),确认命令行可调用 gcloud 命令

$ gcloud -v

3、安装 python 和 go 运行环境

特别注意:如果你使用的是 macOS 或者 Ubuntu、Debain,直接执行第4步即可,脚本里会自动安装 Python 和 go
python 要求 2.7.10 以上,但不能是 python 3。在 mac 上可以直接运行 brew install python@2 安装
go 未要求版本,在 mac 上可以直接运行 brew install go 安装。我用的是 go1.11.5 darwin/amd64
4、安装其他依赖
针对

  • Ubuntu (14.04, 16.04, 17.10, 18.04, 18.10)
  • Debian 8 (jessie) or later
  • Recent versions of macOS with homebrew (experimental)

几个系统,官方已经内置了安装依赖的脚本,直接运行即可:

local/install_deps.bash

执行完毕,会出现

Installation succeeded!
Please load virtualenv environment by running 'source ENV/bin/activate'.

问题一,官方的脚本里第一行用了 -ex 参数,会导致运行脚本时如果有命令执行出错(如 brew install 时有些应用本地已经安装过,但非最新版本),直接退出程序。
解决办法:可以通过 sed-i'''s/bash -ex/bash -x/'local/install_deps* 命令直接去掉 -e 参数。已经给官方提了 issue 。
问题二,官方脚本里使用 python butler.py bootstrap 初始化环境时,会自动去 google 站点下载 chromedriver 相关的文件。
解决办法:全局搜索了下源代码,只有跑单测的时候有用到 chromedriver ,所以可以直接注释掉这个函数:

diff --git a/src/local/butler/common.py b/src/local/butler/common.py
index 94b17b3..3e9de99 100644
--- a/src/local/butler/common.py
+++ b/src/local/butler/common.py
@@ -275,7 +275,7 @@ def install_dependencies(platform_name=None):
   _remove_invalid_files()
   execute('bower install --allow-root')

上一页123下一页


留言