处理通过模糊测试找到的结果

运行模糊测试工具时,它会搜索使程序崩溃或违反的输入 选中的条件。当模糊测试工具找到并报告此类测试输入时,即表示存在错误的证据 需要解决的问题。

通常,您可以在首次开发模糊测试工具时使用 ffx fuzz。这通常会产生 结果。提交模糊测试工具后,系统会通过 ClusterFuzz 及其找到的任何结果都将记录为 bug。

处理来自 ffx fuzz 的结果

使用 ffx fuzz 运行模糊测试工具时,输出日志和结果 存储到输出目录。默认情况下,这是当前工作目录。其他 可以设置位置,并将 --output 选项传递给 attach

崩溃和其他工件的文件名类似 type-of-finding.SHA2-hash-of-input。文件 将是输入字节本身。

例如,检查玩具示例产生的崩溃可能如下所示: 以下:

ffx fuzz run -o results fuchsia.pkg://fuchsia.com/example-fuzzers#meta/toy_example_arbitrary.cm
cd test_data/fuzzing/example-fuzzers/toy_example_arbitrary/latest
hd results/crash-2fda3f03bb699c8a2151724b64b6e36c3b986aea
00000000  2a 48 49 21 2a 00 08 00  00 00 2a 48 49 00 0a 66  |*HI!*.....*HI..f|
00000010  4a 33 00 0a f9                                    |J3...|
00000015

重现结果

您可以使用 ffx fuzz try 使用此输入再次执行模糊测试工具。例如:

ffx fuzz try fuchsia.pkg://fuchsia.com/example-fuzzers#meta/toy_example_arbitrary.cm crash-2fda3f03bb699c8a2151724b64b6e36c3b986aea

如果结果可重现,则将生成一个符号化的日志,其中包含堆栈轨迹。顶部 可能是由 libFuzzer 和/或排错程序进行的错误处理,而 可能就是模糊测试引擎本身。

例如,以下堆栈轨迹中发生 panic 的相关函数为 _toy_example_arbitrary_lib_rustc_static::toy_example

#0    0x000023c56780a61e in _$LT$std..sys_common..backtrace.._print..DisplayBacktrace$u20$as$u20$core..fmt..Display$GT$::fmt::h510ae2e0fe71c88c <>+0x19161e
#1    0x000023c56783399c in core::fmt::write::hb61ef49191e76a74 <>+0x1ba99c
#2    0x000023c5678009b1 in std::io::Write::write_fmt::h41df81fb2b8460af <>+0x1879b1
#3    0x000023c56780eb92 in std::panicking::default_hook::_$u7b$$u7b$closure$u7d$$u7d$::h4e9a8e3c4f33b3f4 <>+0x195b92
#4    0x000023c56780e87c in std::panicking::default_hook::hd85edcd963c04eae <>+0x19587c
#5    0x000023c56780f271 in std::panicking::rust_panic_with_hook::h8960558cc7e69505 <>+0x196271
#6    0x000023c5677973d5 in std::panicking::begin_panic::h97c6d4cd722282c5 /b/s/w/ir/k/rust/src/libstd/panicking.rs:397 <>+0x11e3d5
#7    0x000023c56777f2d0 in _toy_example_arbitrary_lib_rustc_static::toy_example::h573322211ba71c22 ../../out/default/../../examples/fuzzers/rust/src/lib.rs:22 <>+0x1062d0
#8    0x000023c567780a03 in _toy_example_arbitrary_lib_rustc_static::_::toy_example_arbitrary::hc02c288d17b25ac2 ../../out/default/../../examples/fuzzers/rust/src/lib.rs:35 <>+0x107a03
#9    0x000023c56778136c in LLVMFuzzerTestOneInput ../../out/default/../../examples/fuzzers/rust/src/lib.rs:33 <>+0x10836c
#10   0x000023c56772ab86 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) <>+0xb1b86
#11   0x000023c567716ae5 in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned long) ../recipe_cleanup/clangshYTOG/llvm_build_dir/tools/clang/stage2-bins/runtimes/runtimes-x86_64-unknown-fuchsia-bins/compiler-rt/lib/fuzzer/FuzzerDriver.cpp:296 <>+0x9dae5
#12   0x000023c56771c535 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) <>+0xa3535
#13   0x000023c5677457e3 in main ../recipe_cleanup/clangshYTOG/llvm_build_dir/tools/clang/stage2-bins/runtimes/runtimes-x86_64-unknown-fuchsia-bins/compiler-rt/lib/fuzzer/FuzzerMain.cpp:19 <>+0xcc7e3
#14   0x000041fad9a9243b in start_main ./../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:112 +0x9343b

对于无法重现的结果,您仍然可以检查原始模糊测试工具执行的符号化日志 寻找线索。

连接调试程序

在重现模糊测试工具结果时,您可能还需要附加调试程序。默认情况下,libFuzzer 处于开启状态 Fuchsia 会在 以便在模糊测试期间检测和处理崩溃。每个线程只能有一个进程执行此操作 无法连接调试程序。

如需阻止 libfuzzer 创建调试异常渠道,请将 debug 模糊测试工具选项设置为 true。

例如,若要在重现特定测试用例时使用 zxdb,请执行以下操作:

ffx debug connect
[zxdb] attach my-fuzzer
[zxdb] break LLVMFuzzerTestOneInput

现在,在单独的终端中,使用您的测试用例启动模糊测试工具:

ffx fuzz shell
fuzz >> attach fuchsia-pkg://fuchsia.com/my-fuzzers#meta/my-fuzzer.cm
fuzz >> set debug true
fuzz >> try my_input_file

文件模糊测试 bug

您可能很想立即修复与模糊测试工具结果相关的 bug,尤其是当 bug 显而易见无论 bug 有多小,都请提交错误报告!

如需提交 bug,请使用 Fuzzing bug 模板。这样可以确保 某些标签,如 found-by-fuzzinglibfuzzerSec-TriageMe。这反过来又有助于 安全团队可以看到模糊测试工具的使用位置,并密切注意它们存在的任何严重问题 查找。

如果您遇到了模糊测试框架本身的问题或缺陷,请修正错误或 Security>Fuzzing 组件中的功能请求。

与所有潜在的安全问题一样,您无需等待分类再开始修复错误! 修复后,请在提交消息中引用 bug 编号。

处理 ClusterFuzz 中的 bug

ClusterFuzz 会在发现可重现的模糊测试工具结果时,自动提交 bug。如果您 请查找以下内容:

  • 详细报告中会包含相应结果的详细信息,其中包括:

    • 搜索结果的类型。
    • 是否具有安全隐患。
    • 哪些修订版本表现出这种行为。
    • 显示哪些堆栈帧来唯一标识崩溃。
  • ReProducer 测试用例将关联到模糊测试工具工件。你可以下载这个制品 使用它来重现模糊测试工具结果,如上文所述。

如果您提交修复程序以使模糊测试工具停止根据输入生成工件,ClusterFuzz 将 并自动关闭 bug。

通过模糊测试发现的错误