AutoHarness 是一个自动为你生成模糊测试(fuzzing)桩的工具。这个想法源于当前模糊测试代码库中的一个并行问题:大型代码库拥有数千个函数和代码片段,它们可能深嵌在库中。即使对于智能模糊测试器来说,要触及这些代码路径也非常困难,有时甚至不可能。 即使是像 oss-fuzz 这样的大型模糊测试项目,代码库中仍有部分区域未被模糊测试覆盖。因此,这个程序试图在一定程度上缓解这个问题,并为安全研究人员提供一个可用于初步测试代码库的工具。该程序仅支持用 C 和 C++ 编写的代码库。
该程序利用 llvm 和 clang 配合 libfuzzer,使用 Codeql 查找函数,并使用 Python 作为整体程序。该程序已在 Ubuntu 20.04 上使用 llvm 12 和 Python 3 进行了测试。以下是初始设置:
sudo apt-get update;
sudo apt-get install python3 python3-pip llvm-12* clang-12 git;
pip3 install pandas lief subprocess os argparse ast;
请按照 https://github.com/github/codeql 上的说明安装 Codeql。 确保安装了 CLI 工具和库。在测试中,我将工具和库都存放在一个文件夹下。 最后,克隆此仓库或下载一个发行版。 以下是程序在 nginx 上运行并启用多参数模式后的输出结果。 这是我使用的命令:
python3 harness.py -L /home/akshat/nginx-1.21.0/objs/ -C /home/akshat/codeql-h/ -M 1 -O /home/akshat/autoharness/ -D nginx -G 1 -Y 1 -F "-I /home/akshat/nginx-1.21.0/objs -I /home/akshat/nginx-1.21.0/src/core -I /home/akshat/nginx-1.21.0/src/event -I /home/akshat/nginx-1.21.0/src/http -I /home/akshat/nginx-1.21.0/src/mail -I /home/akshat/nginx-1.21.0/src/misc -I /home/akshat/nginx-1.21.0/src/os -I /home/akshat/nginx-1.21.0/src/stream -I /home/akshat/nginx-1.21.0/src/os/unix" -X ngx_config.h,ngx_core.h
结果:
通过进一步调试编译过程、添加更多头文件等方式,完全有可能提高成功率。注意,nginx 项目在编译后没有任何共享对象。不过,该程序具有一项功能,可以将 PIE 可执行文件转换为共享库。
当前程序对多参数函数进行模糊测试的方式是使用 fuzzing data provider。这一整合还有一些改进空间;但我认为我可以将这一特性与数据结构结合起来。编码过程中遇到的一个问题是 Codeql 和嵌套结构体。如果不为每个函数编写多个不同的查询,处理起来会特别困难。简而言之,这一功能需要更多工作。我也考虑过使用 protobuf 的简单解决方案。
利用 Codeql,可以生成控制流图,映射函数中参数是如何初始化的。利用这些信息,我们可以创建更好的桩。另一种方式是查找库中已有的函数实现,并利用这些信息对函数的桩实现做出有根据的猜测。目前我在这一方面遇到的问题是如何使用 Codeql 生成控制流图。
我可以创建一个简单的程序,运行所有桩,并使用 ASAN 捕捉任何常见的误报。此外,我还可以创建一个新界面,一次性运行所有桩并显示它们的统计信息。
如果您发现此程序有任何错误,请创建一个 issue。我会尝试修复。另外,如果您对新功能、性能提升的实现方式或当前计划中的功能有任何想法,请创建一个合并请求(pull request)或带有 (contribution) 标签的 issue。
此工具会生成一些误报。请先分析崩溃,确认是有效 Bug 还是实现问题。此外,如果某些函数无法编译,您可以启用调试模式。这有助于您了解是否缺少某些头文件或存在链接问题。如果您正在处理的项目没有共享库而是可执行文件,请确保以 PIE 形式编译该可执行文件,以便此程序可以将其转换为共享库。