模糊測試或模糊測試是一種測試方式,可隨機對目標介面產生輸入內容,以自動找出瑕疵和/或安全漏洞。
換句話說,模糊化就是以自動化方式測試用產生的資料測試 API。
模糊工具是用來模糊介面的程式。一般來說,它會重複執行三個步驟:
- 產生新的輸入內容。這個部分的這個部分稱為「模糊引擎」。
- 使用輸入內容調整指定介面,或要測試的程式碼。這稱為「模糊目標函式」。
- 監控測試的程式碼是否有異常狀況。這稱為「檢測設備」。
本文旨在說明模糊現象。如需如何模糊處理 Fuchsia 軟體的詳細指南,請參閱「Fuzzing in Fuchsia」。
搜尋記錄
雖然在測試中使用隨機資料可以追溯至午餐卡時代,但這個詞稱為 Barton Miller,起源於 1990 年左右,因為在雷雨期間,有許多 Unix 程式會在雷雨期間傳送遠端指令當機,導致當機。在後續的努力中,他和學生發現的常用 Unix 公用程式共有超過四分之一的當機問題。
經過一段時間後,我們逐漸將模糊化發展成多種不同形式,包括:
- Dumb 模糊化:這是最常見的格式,只有提交隨機資料以及監控當機事件。這種錯誤常常停在淺層錯誤路徑上。
- 以產生版本為主的模糊化:模型會用來說明產生的資料應如何呈現。 這個做法通常可以更深入瞭解程式碼,因為模型可確保輸入內容能通過更簡單的驗證。不過,建立及維護資料模型通常需要投入大量時間和精力。
- 以簡化為基礎的模糊化:這份表單不是以模型描述資料,而是以實際的有效輸入內容開始,並在其中加入隨機變異。這組「種子」輸入統稱為「語料庫」。設定可能會簡單許多,但有許多異動會因為簡單的驗證失敗。
覆蓋範圍模糊
事實顯示,異動型模糊化的變化版本稱為「涵蓋率引導模糊化」,為參與工作產生了大量錯誤。這是 Google 建議的模糊形式,也是 Fuchsia 透過 LLVM 的 libFuzzer 支援的主要形式。
「程式碼涵蓋率」衡量的是因處理特定輸入而執行的操作說明。在涵蓋範圍引導式模糊化中,測試中的程式碼除了監控異常狀況外,也會檢測要收集程式碼涵蓋率資料。模糊引擎會使用這項資料判斷哪些輸入內容會擴大整體程式碼涵蓋範圍,並以這些輸入內容產生後續輸入內容的基礎。
涵蓋範圍模糊的引擎範例包括 libFuzzer、syzkaller 和 AFL。每個項目都有各自的策略,用於根據語料庫中的輸入內容變更輸入內容,以及從檢測設備取得的意見回饋。
涵蓋範圍指引的檢測作業範例包括 LLVM 的消毒工具,例如 ASan。這些檢查功能會檢查特定條件 (例如記憶體損毀),同時提供回呼,登錄執行的程式碼區塊。
在下圖中,模糊的作者會提供模糊目標函式和選用的語料庫。這會與模糊引擎、檢測用的消毒液,以及要測試用來建立模糊工具的程式庫程式碼結合。模糊化工具會傳回可呈現軟體瑕疵和其他構件的輸入內容,例如記錄檔和/或堆疊追蹤。
模糊基礎架構
模糊引擎和檢測設備可讓您輕鬆建立新的模糊工具。模糊基礎架構可以讓您輕鬆執行模糊工具。模糊基礎架構可能會將許多模糊程序自動化,例如:
- 擷取及部署目前測試的程式碼。
- 持續執行模糊作業。
- 在同時執行模糊效果器時同步處理語料庫。
- 重現特定輸入造成的軟體瑕疵。
- 盡量減少觸發特定軟體瑕疵所需的輸入資料。
- 隔離首次發現軟體瑕疵的版本。
- 只要輸入內容發現可重現的新軟體瑕疵,系統就會開啟錯誤報告。
- 在不再發現先前可重現的軟體瑕疵時關閉錯誤報告。
將專案與模糊基礎架構整合需要耗費大量心力,但還能帶來許多優勢。透過完整模糊的基礎架構,模糊的作者只需要提供模糊目標函式和建構方式,就能取得可做為行動依據的錯誤報告。
模糊基礎架構的範例包括 ClusterFuzz、syz-ci 和 OSS Fuzz。
模糊效果
模糊的動機很清楚。事實證明,找出錯誤時成效驚人。與引擎和基礎架構進行模糊化後,發現數萬個錯誤,例如:
尤其是模糊和涵蓋範圍引導模糊作業,對於測試及找出程式碼中的錯誤特別重要:
- 接收來自不受信任來源的輸入內容,且必須安全無虞。
- 具有包含同等意義的複雜演算法 (例如壓縮和解壓縮),而且必須正確。
- 處理大量的輸入和/或不可靠的依附元件,且必須為穩定版。
單元測試和模糊化
另一個關鍵面向是開發人員在編寫和維護模糊方面的整體成本低廉。如果程式碼通過單元測試,只需要執行少許額外作業,就可能會模糊不清。單元測試會說明如何呼叫 API,並有助於實現模糊目標函式的基礎。
如果程式碼經過完美的單元測試,開發模糊工具雖然不容易,但仍然非常實用。編寫模糊工具可讓程式碼更易於單元測試:
- 系統可能會提示重構程式碼以公開較容易模糊的 API,例如將二進位檔轉換為程式庫周圍的精簡包裝函式。這些變更也讓程式碼更容易進行單元測試。
- 涵蓋率模糊的模糊工具會產生一個「語料庫」或一組「有趣的」輸入內容。語料庫通常包含邊緣案例和其他無預期輸入,這在新增單元測試時很實用。
紫紅色的模糊效果
Fuchsia 針對想使用 Fuchsia 軟體的開發人員提供了一些指南:
- 如要建立模糊工具,請參閱「撰寫模糊效果」。
- 如要建構並套件模糊工具,請參閱「建構模糊工具」。
- 如要部署及執行模糊作業,請參閱「執行模糊工具」。
- 如要管理經由模糊化功能發現的錯誤,請參閱處理透過模糊化功能找到的結果。