/fuzz-bench

在线模糊测试平台

Primary LanguageGoMIT LicenseMIT

fuzz-bench

在线模糊测试平台

用户系统

  1. 用户注册
  2. 用户登录时生成更新数据库token,是其他api接口的访问凭证
  3. 个人历史操作和设置记录、支持对历史版本的查看,支持回滚操作
  4. 用户自定义的种子集、fuzzer、测试实例
  5. 自定义用户profile,如密码等

测试Fuzzer

  1. 预定义Fuzzer:AFL、LibFuzzer、Vuzzer以及各自诸多衍生Fuzzer,支持内在的各种参数设置

  2. 默认情况下无种子训练集

  3. 种子训练集来源

    • 平台内置训练集,手动为每一个收集到的benchmark生成测试集

    • 平台自定义种子生成算法(或者用户自定义),运行 n(n 由用户自定义)小时,可选择对种子集去重

      种子集去重算法:

      • 访问的汇编代码唯一(按理说和下一条一样)
      • afl的边唯一
      • afl的边+访问次数唯一
    • 用户上传

  4. 用户可自行上传Fuzzer,这里需要一个很完备的接口,暂时还没想好怎么弄

    • 上传fuzz的exe文件和一个shell脚本来执行fuzzer(暂定)
  5. 预支test bench:google fuzz suite、lava-m

  6. 支持用户自定义上传test bench以及设置参数

  7. 一个实例在即将被清理时,备份所有合法种子文件并销毁docker

存储

  1. 每个文件的内容唯一、即需要对用户上传的文件做去重处理
    • 相同内容的文件只需要给不同的名字即可(秒传接口)
  2. 文件的元信息存储在数据库内,内容具体存放在服务器目录下
  3. 查询时,不同服务器上文件根据需要进行同步,在进行传输时查询到特定服务器目录下
  4. 灾容备份,对数据库和文件本身冗余操作

插件系统

  1. 在搭建一个测试bench时,运行用户在fuzzer的上下游自定义任意顺序和数量个插件(相关借口需要严格定义
    • Advanced:用户可以在html上自由拖动组件位置和连线方式来确定api的数据流动顺序
  2. 提供一套插件相关的api供用户使用,或让用户提供一个web服务接口,接口需要满足插件的api接口定义

文件系统

  1. 对已经有的Fuzzer进行改变

    • 对模板的改变,之后该用户新增的测试实例都基于已经改动过的模板
    • 对已经产生的Fuzzer的改变

    ps:上述操作仅对针对个人,文件改动之后不会影响系统内置的模板

  2. 在线编辑器与控制台(难度较大)

    • 提供在线的文件编辑,以及对应的语法提示
    • 提供在线终端,模拟ssh进行远程调试
  3. 文件查看与上传下载

    • 重复文件可以用秒传
    • 大文件需要分块上传
    • 断点上传下载

数据展示

  1. 对于每一个测试的实例,都需要由一套完整的图表展示,用缓存加速图标的生成速度,请求绘图时可以选择清空缓存

  2. f(x)对t的图像集,这里的fx包括但不限于(不限于是我还没想到...)

    程序覆盖范围、cover的边、种子数量、crash数量

    ps:对于程序覆盖范围,这个比较难做,直观的想象是一个图或者树状的结构,然后根据静态解析出来的边的总数和已经覆盖的边的总数和覆盖的方向,能在图上以不同深色的颜色标记对应的位置

  3. 支持对于任意时刻的数据总和所有bench放在一起看,例如24h的表a+表b等

高可用

  1. 各个服务应该在各自容器内运行
  2. 容器根据需要自动扩容、增加、减少
  3. 数据自动备份

文档

  1. How to build & run
  2. 功能和api使用方式说明

NOTE

  1. 所有与用户有关的行为,必须检验token,且该行为为用户私有。
  2. 用户相关种子、测试集、Fuzzer或是参数设置可以分享给他人,需要以邮件的形式确认