處理透過模糊化發現的結果

在「模糊工具執行」時,系統會搜尋導致程式當機或違反已檢查條件的輸入內容。當模糊工具找到並回報這類測試輸入內容時,就表示有需要解決的錯誤。

一般來說,您可能會在首次開發模糊工具時使用 ffx fuzz。這通常可以立即產生結果。提交模糊處理工具後,該作業會由 ClusterFuzz 大規模執行,如果發現任何結果,系統會將其回報為錯誤。

處理來自 ffx fuzz 的結果

使用 ffx fuzz 執行模糊作業時,輸出記錄和結果會儲存在輸出目錄中。根據預設,這是目前的工作目錄。您可以設定不同位置,將 --output 選項傳遞至 attach

當機問題和其他構件檔案名稱為 type-of-finding.SHA2-hash-of-input 格式。檔案內容本身就是輸入的位元組。

例如,檢查 toy 範例產生的當機事件可能會如下所示:

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 和/或 Sanitizer 的錯誤處理,而底部可能是模糊引擎本身。

例如,在下列堆疊追蹤中發生 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

檔案模糊錯誤

您可能會想立即修正與模糊結果相關的錯誤,尤其是在十分明顯的情況下。無論這個錯誤有多複雜,都可以提交錯誤報告!

如要回報錯誤,請使用錯誤錯誤範本。這可確保您加入特定標籤,例如 found-by-fuzzinglibfuzzerSec-TriageMe。如此一來,資安團隊就能查看漏洞的使用位置,並瞭解發現的任何重大問題。

如果您在模糊架構「本身」中遇到問題或中斷,請使用 Security>Fuzzing 元件開啟錯誤或功能要求。

就像所有潛在的安全性問題一樣,你不必等待分類即可開始修正錯誤!修正問題後,請在修訂訊息中參照錯誤編號。

處理 ClusterFuzz 的錯誤

當 ClusterFuzz 發現可重現的模糊結果時,會自動回報錯誤。如果您已獲指派此類錯誤,請留意以下事項:

  • 詳細報表內含結果的詳細資料,包括:

    • 搜尋結果的類型。
    • 是否涉及安全性。
    • 哪些修訂版本展現了行為。
    • 哪些堆疊框架能夠明確識別當機事件。
  • ReProducer Testcase 會連結至模糊測試的構件。您可以下載此成果,然後按照所述的方式利用此成果重現模糊結果。

當您提交修正,以便模糊工具停止透過輸入產生構件時,ClusterFuzz 會自動關閉錯誤。

模糊功能發現的錯誤