AFL是一种fuzz test工具,可以用来测试各种输入是否引起被测工具崩溃,比如gcc之类的。但是如果是网络模块,比如redis,nginx,没有好的模拟网络的办法。下面是一个演示示例,结合preeny来mock网络

准备工作

编译afl ,tarball在这里https://lcamtuf.coredump.cx/afl/下载

CC=/usr/local/bin/gcc make -j#注意自己的gcc版本。如果不需要考虑这个问题直接make
make install
#cmake指定,编译自己的二进制,指定g++
cmake ../ -DCXX_COMPILER_PATH=/usr/local/bin/afl-g++
#如果不是cmake,指定CC
CXX=/usr/local/bin/afl-g++ make -j

编译preeny没什么难的 参考https://github.com/zardus/preeny readme即可

测试

preeny可以把标准输入强制转换成socket输入,指定好LD_PRELOAD即可 参考链接 2 3 分别给了redis和nginx的例子

我这里使用的是redis,环境是wsl,参考的参考链接2生成的用例

LD_PRELOAD=/mnt/d/github/preeny/x86_64-linux-gnu/desock.so afl-fuzz -m 8G -i fuzz_in -o fuzz_out/ ./redis-server

测试preeny是否生效可以使用

LD_PRELOAD=/mnt/d/github/preeny/x86_64-linux-gnu/desock.so ./redis-server ./redis.conf  < set a b

跑了一个周末,没有发现崩溃的现象。

注意

wsl setsockopt TCP_NODELAY会报错invalid argument。屏蔽掉即可


ref

本文参考

  1. 主要思路 https://copyninja.info/blog/afl-and-network-programs.html
  2. https://volatileminds.net/2015/08/20/advanced-afl-usage-preeny.html
  3. https://lolware.net/2015/04/28/nginx-fuzzing.html

几个afl使用例子

  1. http://0x4c43.cn/2018/0722/use-afl-for-fuzz-testing/ 测试imageshark的
  2. https://stfpeak.github.io/2017/06/11/Finding-bugs-using-AFL/ 举例测试输入漏洞
  3. https://www.freebuf.com/articles/system/191536.html fuzz介绍,原理
  4. http://zeroyu.xyz/2019/05/15/how-to-use-afl-fuzz/ afl使用指南
  5. https://paper.seebug.org/496/ 原理
  6. https://www.fastly.com/blog/how-fuzz-server-american-fuzzy-lop