Community程式設計與開發github.com

ctoth/coverage-guided-fuzzing

建立並操作帶有執行時期感知探索、重設與重播語意的儀器化模糊測試管道。適用於設定 AFL++、libFuzzer、Go fuzzing、cargo-fuzz、Atheris、Jazzer、Jazzer.js(Node.js/TypeScript)或 FuzzTest,或診斷現有測試活動中覆蓋率不足的問題。瀏覽器 JavaScript 在此無基於覆蓋率引導的路徑。

coverage-guided-fuzzing 是什麼?

此技能提供全面的指引,用於在現代開發工具鏈中建立與操作基於覆蓋率引導的模糊測試(coverage-guided fuzzing)。它涵蓋多種執行時期與平台,包括 AFL++、libFuzzer、Go fuzzing、cargo-fuzz(Rust)、Atheris(Python)、Jazzer(JVM)、Jazzer.js(Node.js/TypeScript)及 FuzzTest(C++),並明確排除瀏覽器 JavaScript 應用程式,因其缺乏程序內(in-process)覆蓋率引導路徑。此技能強調透過理解儀器化(instrumentation)範圍、使用正確的探索模式(如 Go 的種子重播與 Jazzer 的回歸模式),以及保持目標狀態與生命週期控制來避免常見陷阱,以驗證真正的目標可達性(target reach),而非僅依賴語料庫計數(corpus count)等誤導性指標。它引導使用者透過參考文件選擇正確的「管道」(lane),執行具資訊性的先導測試(pilot)以診斷覆蓋率障礙,並正確保留與解讀證據,區分探索與回歸、覆蓋率與語意可達性。此技能旨在提供可操作的參考與常見錯誤檢查清單,而非強制規定單一工具或設定。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ctoth/computational-bugfinding-skills-plugin/tree/HEAD/plugins/bugfinding/skills/coverage-guided-fuzzing

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

基於覆蓋率引導的模糊測試

讓真實目標在回饋機制下執行,搭配預期的測試斷言(oracle)與可重現的生命週期。執行中的模糊測試二進位檔或持續增長的語料庫並不能保證有效的目標可達性:「corpus count 值是用來檢查覆蓋率好壞的不良指標」(AFL++ Fuzzing in Depth §3.g)。

選擇實際的管道

閱讀目標進入點、建置圖形、已啟用功能、執行時期/架構、解碼器與屬性。辨識哪些目標模組會收到儀器化,以及在模糊測試建置下有何變化;僅驅動程式的儀器化路徑或僅在其包裝器上啟用的功能,可能會遺漏實際的實作。cargo-fuzz 的功能選項在轉發之前「控制 fuzz_targets crate」,而 libFuzzer 將儀器化(-fsanitize=fuzzer-no-link)與連結其 main() 分開處理 (Rust Fuzz Book guide, Cargo features, LLVM libFuzzer, Fuzzer Usage)。

使用現有的合適生成器與建置擁有者。僅選擇適用的執行參考:

目標閱讀
原生原始碼/二進位檔、AFL++ 或 libFuzzer原生執行器
Go 或 RustGo 與 Rust
Python/原生擴充或 JVMPython 與 JVM
使用 FuzzTest 的 C++ 屬性領域C++ FuzzTest
Node.js (CJS、ESM、經由 Jest 的 TypeScript)Node.js 搭配 Jazzer.js

瀏覽器應用程式碼沒有程序內的覆蓋率引導路徑:Jazzer.js 將「其他執行時期或瀏覽器支援」列為超出範圍 (Jazzer.js architecture, Constraints)。請將瀏覽器 UI 探索導向負責 UI 事件序列的技能。

在變更設定前,請驗證所選版本的先決條件與已安裝的說明。參考文件記錄的是特定日期的原始碼快照,並不保證每個版本/平台都支援相同的標誌。在使用者現有的權限範圍內呼叫;此技能本身不會授權安裝、目標編輯或外部支出。

執行有限且有資訊性的先導測試

在增加工作執行緒(workers)之前,先建立探索模式、相關的目標儀器化、狀態重設與可運作的測試斷言。Go 種子重播、Jazzer 回歸、Jazzer.js Jest 回歸與 FuzzTest 單元模式與其探索模式不同:純 go test 執行種子「很像單元測試」,「除非明確啟用模糊測試模式,否則 Jazzer 以回歸模式運作」、Jazzer.js 在 Jest 下預設為 "regression",而 FuzzTest 單元模式「在沒有消毒器與覆蓋率儀器化的情況下」執行 (Go fuzzing, Running fuzz tests, Jazzer README, Regression mode, Jazzer.js fuzzing settings, mode, FuzzTest Bazel quickstart, Create and run a fuzz test)。

分別觀察解碼器准入、預期操作、成功效果與屬性評估,而非引擎覆蓋率;對壓縮格式進行位元組突變可能導致「幾乎所有生成的輸入對 uncompress 來說都是無效的」(Google structure-aware fuzzing guide, Example: Compression)。使用可達性、重設與回饋來診斷被拒絕的格式、隱藏狀態或未滿足的依賴。針對已展示的阻礙,選擇字典/比較回饋或結構化突變;每個方法會改變搜尋的不同部分 (AFL++ CmpLog, Google structure-aware fuzzing guide)。

將每個輸入、模糊測試時間、牆上時間、工作執行緒/CPU 與記憶體控制項區分開來;在授權範圍內納入設定/重播成本。AFL++ 的 -V 是「(僅模糊測試時間!)」,而 -E 是「總執行次數的近似值」;兩者都不是聚合的行程 CPU 時間 (AFL++ selected-ref CLI source, usage text)。Go 的 -timeout 不限制模糊測試階段 (Go 與 Rust)。使用獨立擁有的輸出與對所擁有行程的有界清理;libFuzzer 關於確切工件路徑指出:「請勿對多個並行處理程序使用相同路徑」(LLVM libFuzzer, Options)。關於分配決策,請參閱 bugfinding-campaign。

解讀並保留證據

保留確切的輸入/型別化參數、建置/設定/儀器化、初始狀態或序列、指令/限制、原始引擎輸出、目標/屬性計數器與產生的重播素材。跨呼叫的狀態與生命週期差異可能使單一檔案的重現失效:Go 要求「模糊測試目標的狀態不應持續超過每次呼叫的結束」,而 Jazzer 的預設 PER_TEST「更可能在模糊測試執行之間無意中保留狀態」(Go fuzzing, Suggestions, Jazzer Lifecycle implementation)。

回報實際執行的內容、觀察到的屬性、資源使用情況、候選項目與遺漏。區分探索與回歸、覆蓋率與語意可達性,以及候選失敗與產品歸因。使用 corpus-evolution 進行相容的保留/交換,failure-reduction 進行保留見證的縮減,以及 evidence-based-triage 進行歸因。歷史上的種子選擇結果取決於其目標/排程器;Rebert 等人發現一個假設「在最佳排程下為假」,卻又在輪詢排程(Round-Robin)下重新測試。不要將它們轉變為普遍的吞吐量或產出承諾 (Rebert et al., pp.864,871,873)。

對於具體的誤導性運行與修正,請閱讀常見錯誤。此技能不會衍生任何目標特定的新框架。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能