很多團隊談到 AI 程式代理,第一個問題常是它能不能自動找出漏洞。但在模糊測試裡,得先追問一層:既有測試到底沒有走到哪些程式路徑?GitHub Security Lab 開源的 Fuzzing Taskflow,嘗試把目標辨識、測試 harness 撰寫、AFL++ 執行和覆蓋率檢視串成一個流程,讓代理反覆追逐尚未觸及的程式區域。它處理的是測試準備和迭代工作的一部分,不能單憑工具名稱推論漏洞檢出能力。

一、Fuzzing Taskflow 要補上模糊測試的哪個缺口?

它試著減少人工尋找測試入口、撰寫 harness、閱讀覆蓋率報告與整理 crash 的重複工作。覆蓋率缺口能提供下一輪測試的方向,卻不能證明已測區域安全,更不能證明沒有漏洞。

模糊測試(fuzzing)會持續把大量變化過的輸入交給程式,觀察是否出現崩潰或錯誤。AFL++ 是開源模糊測試工具,會依執行回饋調整輸入。測試能否走到深層邏輯,仍受入口、輸入格式、初始化條件和時間限制;若資料只能送到簡單解析入口,依賴特定狀態或格式的分支可能一直未被觸及。

要讓 fuzzer(模糊測試器)呼叫函式,通常要準備 harness,也就是一小段測試介面程式,負責把輸入轉成目標函式能接收的參數,並建立必要狀態。測試人員還得準備種子輸入、處理建置方式,再看報告判斷哪些路徑尚未涵蓋。這些步驟需要了解程式介面和資料格式,維護工作常比啟動一次測試更花心力。

因此,程式碼覆蓋率的用途是指出「目前這批測試走到哪裡」,而不是替程式安全性打分。未觸及的分支可能值得追,也可能只是低價值的錯誤處理路徑或第三方程式碼;已觸及的程式也未必以足夠多樣的輸入測過。覆蓋率提高只能作為測試進展訊號,不能等同漏洞減少或安全性獲證明。

GitHub Security Lab 文章作者 Antonio Morales 將模糊測試描述為仍需要人員參與的工作,並指出人員得持續看覆蓋率、補 harness、分流 crash。這個觀察說明 Taskflow 要自動化的對象:反覆操作與初步整理,而非把安全判斷整段交給模型。GitHub Security Lab 文章

二、AI 代理如何把覆蓋率接回 AFL++ 測試?

Taskflow 先辨識 C/C++ 專案可能的測試目標,分析建置條件並產生 harness,再用 AFL++ 執行測試、重播輸入取得覆蓋率,依未觸及路徑調整下一輪。代理透過 MCP 工具介面下達選擇目標與修改方向的指令,工具則觸發建置、測試與結果保存;這個介面分層不代表執行隔離。

依 GitHub Security Lab 的專案說明,流程從指定 GitHub 儲存庫開始。代理嘗試找出適合測試的函式與入口,分析建置系統,產生能呼叫目標程式的 harness,接著建立 AFL++ 測試所需的執行檔。專案以 MCP 工具介面銜接代理決策與命令執行:模型決定要測什麼、修改哪個 harness 或追哪個缺口,再透過工具觸發編譯、模糊測試與覆蓋率計算等命令。

這些命令會直接在 host(執行工具的主機)上執行,狀態則記錄在資料庫供不同階段銜接;MCP 介面本身不提供主機隔離。

每輪測試結束後,Taskflow 會把 AFL++ 找到的輸入重新送進另一個用於覆蓋率分析的版本,產生可讀的程式碼覆蓋報告。代理查看未觸及的分支後,可能新增測試種子、修改 harness 呼叫其他 API、補上專案特有的字典內容,或判斷某些路徑不值得繼續追。種子是提供給 fuzzer 的初始輸入;字典則收錄格式標記或程式中比對的常數,幫助測試更容易通過輸入檢查。

這種回饋迴圈把「跑測試、看報告、調整輸入或入口」接在一起。專案也保留跨輪測試語料,避免每次都從原始種子重新探索。不過,代理每次提出的改動都依賴它對原始碼、建置設定和資料格式的理解。如果入口判錯、harness 漏掉狀態設定,或種子不符合程式實際格式,之後的覆蓋率回饋仍可能繞著錯誤的測試設計打轉。

crash 整理包含縮小觸發異常的輸入、在 AddressSanitizer(用於偵測記憶體錯誤的工具)下重播、依堆疊合併相似結果,再由代理撰寫報告。報告會標示可能漏洞、harness 錯誤、逾時或待調查等情況;成因、可達性與修補建議仍需工程師重現檢查。

GitHub Security Lab 作者 Antonio Morales 在文中提醒,代理給出的判讀應作為人員檢查的起點,不應視為最終結論;這是對原文的轉述,其分析也可能受模型對目標程式的理解程度限制。原文

五個流程節點依序呈現辨識 C/C++ 測試目標、產生 harness、執行 AFL++、測量覆蓋率與調整 harness 和種子,並以回返箭頭表示進入下一輪。
覆蓋率回饋用來調整下一輪測試方向,不能單獨證明程式安全。

三、什麼樣的 C/C++ 專案適合先試跑?

GitHub 官方文件以 Linux 工作區(包括 GitHub Codespaces 雲端開發環境)示範試跑;較合適的起點是入口清楚、依賴和建置流程可辨識的小型 C/C++ 專案。特殊建置工具、封閉依賴或仰賴外部狀態的輸入格式,可能需先整理環境與測試介面。

專案 README 將適用範圍放在 C/C++,並說明 AFL++ 需要原生編譯與插樁。若程式依賴自訂 Bazel 規則、專有建置工具、特殊系統函式庫或難以在乾淨環境重現的步驟,代理未必能把原始建置命令轉成 AFL++ 可用的版本。建置失敗不是單純的模型回答問題,也可能代表工具鏈、依賴版本或目標架構和專案預期不相容。

輸入格式是另一個關鍵。簡單的位元組資料相對容易變異;JSON、XML 或自訂二進位封包則可能有欄位順序、長度標記、校驗或狀態要求。Taskflow 提供部分格式資產,也能掃描原始碼中的字串與數值常數,產生專案相關的變異線索。這些機制有助於準備輸入,卻不保證完整理解格式規格。格式知識若藏在未公開文件、測試服務或外部狀態裡,生成的輸入仍可能無法到達有意義的邏輯。

團隊也要確認目標函式可以在測試環境中獨立呼叫。若測試前必須連接資料庫、載入大型服務、準備憑證或啟動其他程序,就要先判斷這些依賴能否安全地模擬。harness 需要控制初始化、清理與錯誤狀態;如果它本身寫錯,fuzzer 可能只是反覆觸發 harness 的問題。試跑時應保留目標函式、輸入、編譯方式與重現命令,確認報告能回到真實程式路徑。

證據目前主要來自 GitHub Security Lab 的官方文章和程式庫文件,足以描述設計流程、支援範圍與明示限制。這些材料無法回答它在各種專案的漏洞檢出率,也沒有提供足以比較人工測試或其他工具的獨立效能證據。因此,官方展示案例只能用來理解工作方式,不能推論到任意 C/C++ 專案都能得到相同結果。

四、接入現有測試管線要估哪些成本與風險?

團隊要盤點建置依賴、執行時間、模型使用與資料保存成本,也要先隔離代理執行環境。官方明確警告,代理呼叫的 AFL++、編譯器和建置命令會直接在主機執行,沒有容器隔離;因此不宜在共用、正式或存有敏感憑證的主機直接試跑。

成本包含模型服務、AFL++、編譯器及專案依賴的維護,以及測試消耗的 CPU、磁碟和時間。整合 CI 前要訂出觸發時機、執行上限、失敗回報方式和語料保存規則。模型服務費用應納入成本評估;網路可達範圍與資料處理條款則應列入安全及治理審查。

更需先處理命令執行權限。專案說明指出,工具會直接在主機執行 AFL++、clang 及模型選擇的建置命令;若代理受到惡意指示影響,命令可能取得執行帳號原有權限。

官方指出流程沒有容器隔離。試跑應放在可丟棄的 GitHub Codespaces 雲端開發環境或虛擬機,避免管理員權限,並限制網路、雲端身分、原始碼與憑證存取。共用建置主機或正式 CI runner 若未隔離,風險也會波及其他工作負載。

測試語料與 crash 報告可能暴露內部資料或程式缺陷。接入 CI 前,應訂定存取權限、保存期限、外部服務使用與敏感輸入清除方式。

採用前也要核對 Taskflow 專案的 LICENSE、相依套件授權條款與企業使用政策,確認使用、修改及散布條件;尚未完成核對前,不應推定可任意用於商業環境。

AFL++ 文件說明原始碼模糊測試步驟;Taskflow 在此流程串接代理決策與覆蓋率回饋。AFL++ 模糊測試深入說明;Taskflow 專案安全說明

可丟棄虛擬機框住代理、AFL++、編譯器與測試專案,旁邊標示低權限、受限網路及憑證限制。
命令會在執行主機上運作,試跑時應以隔離環境和受限權限縮小影響範圍。

五、如何判斷試跑結果值得納入日常測試?

固定程式版本、測試時間與既有覆蓋率基準後比較目標路徑的變化;另行確認 crash 能重播且經人工判讀,並檢查隔離與產物管理,再決定是否接入 CI。

選小型 C/C++ 專案,固定程式版本、依賴及測試時間,並以同一條件下的既有測試結果作基準;重複試跑時沿用這些設定。若需特殊主機或手動修補,記為整合限制。

對照基準確認覆蓋率變化是否落在目標路徑,並調查未觸及區域。另以精簡輸入重現 crash,再由程式負責人獨立檢查堆疊、成因與代理建議;覆蓋率變化不能取代 crash 的重現和人工確認。

納入 CI 前,指定維護者並設定資源上限及失敗處理方式。

採用前檢查清單

  1. 固定小型專案版本與依賴,在可丟棄環境試跑。
  2. 核對目標、建置、harness 和覆蓋率,保存重現步驟。
  3. 重播 crash,確認人工判讀、權限及產物保存規則。
  4. 估算 CI 資源,指定維護者。
  • Taskflow 串接目標辨識、harness、AFL++、覆蓋率回饋和 crash 初步分流。
  • 覆蓋率不代表漏洞已找齊;crash 標籤和修補建議仍需人工判讀。
  • 官方警告建置命令會直接在主機執行。應先在低權限、可丟棄且網路和憑證受限的環境評估,再決定是否接入 CI。

GitHub Security Lab 作者 Antonio Morales 建議只在可丟棄環境(例如 Codespace 或一次性虛擬機)中執行,且不要使用提升權限的帳號。原文

常見問題

Q1:Fuzzing Taskflow 能保證找出程式漏洞嗎?

不能。它協助自動化部分測試準備、執行和初步分流,測試結果受程式入口、輸入格式、建置環境與執行時間影響。覆蓋率或 crash 報告都不能證明已找到所有漏洞。

Q2:它可以直接加入任何 C/C++ 專案嗎?

不能假設任何專案都可直接使用。官方列出的限制包含建置系統相依性和模型理解目標程式的能力。使用特殊建置工具或複雜依賴的專案,可能需要自行整理工具鏈或測試入口。

Q3:可以在公司共用 CI 主機執行嗎?

官方提醒相關命令會直接在主機執行,沒有容器隔離。應先用可丟棄、低權限的環境試跑,限制網路和憑證存取,評估完成後再設計與正式 CI 的隔離方式。