模糊测试 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
内的子目录中,以下命令将允许您使用调试信息和启用的各种清理器检查来构建模糊测试目标。
$ 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