ClusterFuzz 源码分析(一)
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:测试
- _internal:核心代码
- local
- bulter:接受外层 bulter 的调用,实际执行具体的任务
- remote:对不同的 os 平台 bot 进行配置
- python
- bot:启动 bot
- platform_requirements.txt:python 依赖的三方库
- appengine:App Engine 组件
- bower.json:web 前端依赖的组件
- butler.py:命令行模式启动 clusterfuzz 的 server、bot、web_server、cron_server、remote 等任务,具体任务的启动脚本在
scr/local/bulter
中