模糊测试工具运行时,会搜索导致程序崩溃或违反检查条件的输入。当模糊测试工具发现并报告此类测试输入时,就表明存在需要解决的 bug。
通常,首次开发模糊测试工具时,您可以使用 ffx fuzz
。这通常可以立即产生结果。在提交模糊测试工具后,ClusterFuzz 会大规模运行该工具,找到的任何结果都将作为 bug 提交。
处理来自 ffx fuzz
的结果
使用 ffx fuzz
运行模糊测试工具时,输出日志和结果会存储到输出目录中。默认情况下,这是当前的工作目录。可以通过将 --output
选项传递给 attach
来设置其他位置。
崩溃和其他工件的文件名都将类似于 type-of-finding.SHA2-hash-of-input
。文件内容将是输入字节本身。
例如,检查 toy example 生成的崩溃问题可能如下所示:
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
对于不可重现的结果,您仍然可以检查原始模糊测试工具执行过程中的符号化日志以获取线索。
连接调试程序
在重现模糊测试工具结果时,您可能还需要连接调试程序。默认情况下,Fuchsia 上的 libFuzzer 会创建一个附加到模糊测试线程的调试异常渠道,以便在模糊测试期间检测和处理崩溃。每个线程中只能有一个进程执行此操作,因此系统将阻止附加调试程序。
如需阻止 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,请使用 Fuzzing Bug 模板。这可确保您包含某些标签,例如 found-by-fuzzing
、libfuzzer
和 Sec-TriageMe
。这进而有助于安全团队查看模糊测试工具的使用位置,并随时了解他们发现的任何严重问题。
如果您在模糊框架本身中遇到问题或不足,请在 Security>Fuzzing
组件中提交 bug 或功能请求。
与所有潜在的安全问题一样,您无需等待分类系统开始修复 bug! 修复后,请在提交消息中注明错误编号。
处理 ClusterFuzz 中的 bug
ClusterFuzz 会在发现可重现的模糊测试工具结果时自动提交 bug。如果您被分配了此类 bug,请查找以下内容:
详细报告将包含与实验结果有关的详细信息,其中包括:
- 搜索结果的类型。
- 是否会造成安全影响。
- 出现该行为的修订版本。
- 通过哪些堆栈帧可唯一标识崩溃。
ReProducer 测试用例将关联到模糊测试工具工件。您可以下载此工件,然后使用它来重现模糊测试工具结果,如上文所述。
如果您提交修复程序,以使模糊测试工具停止根据输入生成工件,ClusterFuzz 将自动关闭该 bug。