Fuzzing Arrow C++#

为了使无效输入处理更健壮,我们已在 Arrow C++ 功能集的几个部分启用了模糊测试,目前包括

  • IPC 流格式

  • IPC 文件格式

  • Parquet 文件格式

我们欢迎任何贡献来扩展模糊测试的范围,并涵盖可能摄取无效或恶意数据的领域。

模糊目标和实用程序#

通过传递 -DARROW_FUZZING=ON CMake 选项(或等效地,使用 fuzzing 预设),您将构建与上述 Arrow 功能相对应的模糊目标,以及其他相关实用程序。

生成种子语料库#

模糊测试本质上是通过随机改变先前测试过的输入来探索域空间,而无需对正在模糊测试的领域有任何高级理解。然而,域空间如此巨大,以至于仅靠这种策略可能无法实际产生任何“有趣”的输入。

因此,为了指导该过程,提供一个包含有效(或无效但值得注意)输入的种子语料库很重要,模糊测试基础设施可以从中派生新的输入进行测试。提供了一个脚本来自动化该任务。假设模糊测试可执行文件可以在 build/debug 中找到,则种子语料库可以这样生成

$ ./build-support/fuzzing/generate_corpuses.sh build/debug

持续模糊测试基础设施#

模糊测试过程计算密集,因此受益于专用计算设施。Arrow C++ 由 Google 运营的 OSS-Fuzz 持续模糊测试基础设施进行测试。

OSS-Fuzz 发现的问题会通知有限的 核心开发人员 并提供给他们。如果您是 Arrow 核心开发人员并希望被添加到该列表,您可以在 邮件列表 上提出请求。

本地重现#

当模糊测试发现崩溃时,通常下载用于产生崩溃的数据并使用它来重现崩溃以便调试和调查是很有用的。

假设您位于 cpp 目录下的子目录中,以下命令将允许您构建具有调试信息和各种 sanitizer 检查的模糊目标。

$ cmake .. --preset=fuzzing

然后,假设您已下载了崩溃数据文件(我们称之为 testcase-arrow-ipc-file-fuzz-123465),您可以通过在该文件上运行受影响的模糊目标来重现崩溃

$ build/debug/arrow-ipc-file-fuzz testcase-arrow-ipc-file-fuzz-123465

(您可能希望在调试器下运行该命令,以便更仔细地检查程序状态)

使用 conda#

模糊测试可执行文件必须使用 clang 编译并链接到提供模糊测试运行时的库。如果您使用 conda 来提供您的依赖项,您可能需要在构建模糊目标之前安装这些依赖项

$ conda install clang clangxx compiler-rt
$ cmake .. --preset=fuzzing