ProFuzzBench搭建

概述

论文:ProFuzzBench - A Benchmark for Stateful Protocol Fuzzing

会议:2021年第30届ACM SIGSOFT软件测试与分析国际研讨会(ISSTA)

项目地址:https://github.com/profuzzbench/profuzzbench

ProFuzzBench是网络协议状态模糊化的基准。它包括一套用于流行协议(如TLS、SSH、SMTP、FTP、SIP)的代表性开源网络服务器,以及自动化实验的工具。

ProFuzzBench提供了三个模糊器来模糊目标的自动化脚本:AFLnwe(AFL的一个网络启用版本,它通过TCP/IP套接字而不是文件发送输入)、AFLNet(一个为有状态网络服务器量身定制的模糊器)和StateAFL(另一个用于有状态网络服务器的模糊器)。

1.设置环境变量

git clone https://github.com/profuzzbench/profuzzbench.git
cd profuzzbench
export PFBENCH=$(pwd)
export PATH=$PATH:$PFBENCH/scripts/execution:$PFBENCH/scripts/analysis

文件结构如下:

2.构建docker镜像

以下命令创建一个标记为lightftp的docker image,image应该具有可用于模糊处理和代码覆盖率收集的所有内容。

cd $PFBENCH
cd subjects/FTP/LightFTP
docker build . -t lightftp

3.运行模糊处理

运行deprizzbench_exec_common.sh脚本开始一个实验。该脚本包含8个参数,如下所示。

第一个参数(DOCIMAGE):docker映像的名称

第二个参数(RUNS):运行次数,每次运行产生一个独立的Docker容器

第三个参数(SAVETO):保存结果的文件夹的路径

第四个参数(FUZZER):FUZZER名称(例如,aflnet)--此名称必须与Docker容器中FUZZER文件夹的名称匹配(例如/home/ubuntu/aflnet

第五个参数(OUTDIR):在docker容器内创建的输出文件夹的名称

第六个参数(OPTIONS):除了在目标特定的run.sh脚本中编写的标准选项之外,模糊处理所需的所有选项

第七个参数(TIMEOUT):模糊处理的时间(秒)

第八个参数(SKIPCOUNT):用于计算一段时间内的覆盖率。例如,SKIPCOUNT=5意味着我们在每5个测试用例之后运行gcovr,因为gcovr需要时间,并且我们不希望在每个测试用例之后都运行它

以下命令运行4个AFLNet实例和4个AFLnwe实例,在60分钟内同时模糊LightFTP。

cd $PFBENCH
mkdir results-lightftp
#AFLNet实例
profuzzbench_exec_common.sh lightftp 4 results-lightftp aflnet out-lightftp-aflnet "-P FTP -D 10000 -q 3 -s 3 -E -K" 3600 5 &
#AFLNwe实例
profuzzbench_exec_common.sh lightftp 4 results-lightftp aflnwe out-lightftp-aflnwe "-D 10000 -K" 3600 5

4.收集运行结果

所有结果(在tar文件中)都应存储在步骤3中创建的文件夹中(results-lightftp),这些tar文件是所有模糊实例生成的输出文件夹的压缩版本。

如果模糊器是基于afl的(例如,AFLNet、AFLnwe),则每个文件夹都应该包含子文件夹,如崩溃、挂起、队列等。

使用deprizzbench_generate_csv.sh脚本收集随时间变化的代码覆盖率结果,并将其保存到results.csv。

脚本的五个参数如下:

第一个参数(PROG):主题程序的名称(例如,lightftp)
第二个参数(RUNS):运行次数
第三个参数(FUZZER):模糊器名称(例如aflnet)
第四个参数(COVFILE):保存结果的CSV格式输出文件
第五个参数(APPEND):追加模式;对于第一个模糊器,将其设置为0,对于后续模糊器,设置为1。

cd $PFBENCH/results-lightftp

profuzzbench_generate_csv.sh lightftp 4 aflnet results.csv 0
profuzzbench_generate_csv.sh lightftp 4 aflnwe results.csv 1

 实例中给出的csv文件使用了唯一的result名称,所以脚本在开始会先删除之前存在的result.csv

results.csv文件有六列,显示时间戳、主题程序、模糊器名称、运行索引、覆盖率类型及其值。

该文件包含线路覆盖率和分支覆盖率随时间变化的信息,每个覆盖率类型都有两个值,分别为百分比(_per)和绝对数(_abs)。

5.分析运行结果

 步骤4中收集的结果(即result.csv)可用于绘图。实例提供了一个示例Python脚本来绘制随时间变化的代码覆盖率。

cd $PFBENCH/results-lightftp

profuzzbench_plot.py -i results.csv -p lightftp -r 4 -c 60 -s 1 -o cov_over_time.png

 ubuntu18.04 默认使用了python2,这里可以调整成为python3

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 20

这个命令将把/usr/bin/python链接到/usr/bin/python3,并把python3优先级设置为20(也就是默认Python版本)

 

6.StateAFL

StateAFL扩展了 AFL 模糊器的原始想法,自动演化模糊输入以最大化代码覆盖率。 除了代码覆盖率之外,StateAFL 还寻求最大化协议状态覆盖率。 StateAFL 通过拍摄进程内存中长期存在的数据的快照,并应用模糊散列将内存中的状态映射到唯一的协议状态,自动推断服务器的当前协议状态。

ProFuzzBench 附带 Dockerfiles 和脚本来运行 StateAFL 基准测试。 每个目标都包含一个构建 StateAFL 模糊器的 Dockerfile-stateafl。 

cd $PFBENCH
cd subjects/FTP/LightFTP
docker build . -t lightftp
docker build . -f Dockerfile-stateafl -t lightftp-stateafl

使用 StateAFL 对单个目标进行模糊测试,就像之前的模糊器一样

cd $PFBENCH
mkdir results-lightftp

profuzzbench_exec_common.sh lightftp-stateafl 4 results-lightftp stateafl out-lightftp-stateafl "-P FTP -D 10000 -q 3 -s 3 -E -K -m none -t 1000" 3600 5

 

posted @ 2023-07-28 12:49  EleclouD  阅读(548)  评论(0编辑  收藏  举报