参考/docs/parallel.txt
1.介绍
每一个afl-fuzz都需要占用一个CPU内核。这意味着在多核系统上,能可以运行几个fuzzing。事实上,如果你在多核系统上只运行一个fuzzing工作,这将造成硬件的浪费。所以,并行化是一个很好的方法。
2.单系统的并行
如果你想在本地的多核系统上并行化的运行一个fuzzing,能只想要新建一个空的文件夹(sync_dir)用来被afl-fuzz进程所共享,并给每一个afl-fuzz命名,如“fuzzer01","fuzzer02"等。
首先运行一个Master进程:
./afl-fuzz -i testcase_dir -o sync_dir -M fuzzer01 [...other stuff...]
然后开始其他的slave进程:
./afl-fuzz -i testcase_dir -o sync_dir -S fuzzer02 [...other stuff...]
./afl-fuzz -i testcase_dir -o sync_dir -S fuzzer03 [...other stuff...]
每一个fuzzer都在sync_dir文件夹中有一个单独的空间来存储其状态,如
/sync_dir/fuzzer01/
每一个fuzzer都会遍历/sync_dir/文件夹中被其他fuzzer所创建的测试用例,并且将它们加入自己的fuzzing队列中,如果它们足够有趣的话。
Master进程与Slave进程的不同之处在于Master进程使用确定性策略进行变异,而Slave进程则是使用随机性策略。如果你不想使用确定性策略,则可以在运行所有afl-fuzz时都加上-S选项。当对目标的模糊测试非常缓慢或复杂时,这是一个很好的选择。
实验上证明,启动多个Master进程是可行的,不过这样通常会造成浪费。
./afl-fuzz -i testcase_dir -o sync_dir -M masterA:1/3 [...]
./afl-fuzz -i testcase_dir -o sync_dir -M masterB:2/3 [...]
./afl-fuzz -i testcase_dir -o sync_dir -M masterC:3/3 [...]
冒号后面的数字,第一个表示这个master进程的ID值,第二个表示总的Master进程数量。注意,如果启动比传递给-M的第二个数字指示的更少的模糊器,则可能会导致覆盖率不高。
你还可以通过命令行的afl-whatsup工具监视你的fuzzing进程,当找不到新的路径时,就是时候停止了。
显式指定-f选项时请务必小心。 每个fuzzer必须使用一个单独的临时文件; 否则事情出现错误。 一个安全的例子可能是:
./afl-fuzz [...] -S fuzzer10 -f file10.txt ./fuzzed/binary @@
./afl-fuzz [...] -S fuzzer11 -f file11.txt ./fuzzed/binary @@
./afl-fuzz [...] -S fuzzer12 -f file12.txt ./fuzzed/binary @@
如果您使用@@而不使用-f并且让afl-fuzz出现文件名,这没有关系。
3.多系统的并行
多系统上的并行操作与单系统上的区别不大。唯一的差别是需要写一个简单的脚本完成2个操作:
-
使用ssh连接到主机上,检索每个fuzzer文件夹中的/path/to/sync_dir/<fuzzer_id>/queue/目录下的tar文件
for s in {1..10}; do ssh user@host${s} "tar -czf - sync/host${s}_fuzzid*/[qf]*" >host${s}.tgz done
-
对这些文件进行解压
for s in {1..10}; do for d in {1..10}; do test "$s" = "$d" && continue ssh user@host${d} 'tar -kxzf -' <host${s}.tgz done done
在/experimental/distributed_fuzzing文件夹中有个脚本实例。
也可以参看这两个网站:
https://github.com/MartijnB/disfuzz-afl
https://github.com/richo/roving
4.远程监控与数据收集
你可以使用screen,nohup,tmux等工具运行远程afl-fuzz实例。原则上,可以使用Master进程的状态屏幕来监控其他的Slave进程并决定何时停止。你还可以依赖该实例的输出目录来收集合成的语料库。
5.不对称设置
值得注意,以下的操作都是允许的:
- 你可以与其他可以提高代码覆盖率的工具一起运行afl-fuzz.
- 你可以使用不同(但相关)的目标二进制文件运行一些同步的fuzzers。
- 有一些以不同的方式调用二进制文件的fuzzers。
- 可以使用不同的起始测试用例或字典来运行同步的fuzzers。