ClusterFuzz是 Google 开源的一个模糊测试平台,它集成了多种 Fuzz 引擎,如 Libfuzzer、AFL、Honggfuzz 等,支持跨平台,且具有高度可扩展性。

一、简介

ClusterFuzz 官网的运作流程图如下:

Fuzz 测试中,编写 fuzzer 和修复 bug 需要人工操作,ClusterFuzz 将这两个环节之外的部分都给自动化了,包括 Fuzz 执行、crash 去重、testcase 精简等。

ClusterFuzz 有两个核心组件:

  • App Engine instance:App 引擎,提供一个 web 界面,供用户提交任务、查看结果、展示统计数据等,此外这个 App 引擎还负责调度定时任务。
  • Fuzz Bots pool:实际执行 Fuzz 的一组 Bot,每个 Bot 从任务队列中挑出任务并执行,这些任务包括但不限于:
    • fuzz:执行一次 fuzz 测试 session
    • progression:检查一个 testcase 是否可复现,或者已修复
    • regression:查找 crash 被引入的版本范围
    • minimize:最小化 testcase
    • corpus_pruning:精简 corpus 语料库(仅限 Libfuzzer)
    • analyze:检查手动上传的 testcase 是否引发 crash

ClusterFuzz 定义的 Fuzz Bot 有两种类型:

  • 可抢占的:机器可以随时关闭,且只能运行 fuzz 任务
  • 不可抢占的:机器不会关闭,能不间断运行各种类型的任务

二、代码概览

Google 开源了 ClusterFuzz 的 代码仓,项目 python 为主,读起来相对容易。

代码结构大致为:

  • bot:bot 相关文件
  • configs:配置文件
  • docker:docker 镜像文件
  • docs:官方说明文档
  • local:本地运行时需要的文件
  • resources:bot 依赖的外部资源文件
  • src:源码根目录
    • appengine:App Engine 组件
      • handlers:处理 web 请求
      • libs:web 后端的公共库文件
      • private:web 前端模板代码
      • resources:web 前端使用的资源
    • clusterfuzz
      • _internal:核心代码
        • base:通用基础模块
        • bot:
          • fuzzers:封装各种 fuzzer 引擎,如 Libfuzzer、AFL、Honggfuzz
          • init_scripts:各 os 平台的初始化脚本
          • minimizer:最小化 testcase
          • tasks:定义各项任务
          • tokenizer:分词工具
          • web_server:在 bot 上启动一个 server,处理 testcase 相关请求
        • build_management:根据用户上传的文件,创建 fuzz 任务
        • config:读取配置文件,获取配置项
        • crash_analysis:crash 的分析、比较和分级
        • datastore:基于 ndb 定义数据结构和处理操作
        • fuzzer_utils:提供 fuzz 基础操作,如 mutator 算子和 testcase 处理
        • fuzzing:提供 fuzz 高级操作,如管理 fuzz 产生的 corpus、设置 fuzz 策略、挑选 fuzz 任务等
        • google_cloud_utils:基于 gcs 封装 clusterfuzz 与存储相关的接口
        • metrics:监控运行数据,提供统计报表
        • platforms:封装各 os 平台的键鼠操作
        • protos:gRPC 的 proto 文件
        • scripts:脚本
        • system:封装各 os 平台的系统操作
        • tests:测试
      • environment:初始化 fuzz 相关的环境变量
      • fuzz:启动 fuzz 任务,实际由 bot 中定义的 fuzzer 执行
      • prune:启动 corpus 精简任务
      • reproduce:启动 testcase 复现任务
      • stracktraces:分析 crash 调用栈
      • tests:测试
    • local
      • bulter:接受外层 bulter 的调用,实际执行具体的任务
      • remote:对不同的 os 平台 bot 进行配置
    • python
      • bot:启动 bot
    • platform_requirements.txt:python 依赖的三方库
  • bower.json:web 前端依赖的组件
  • butler.py:命令行模式启动 clusterfuzz 的 server、bot、web_server、cron_server、remote 等任务,具体任务的启动脚本在 scr/local/bulter