模糊測試 (fuzz testing, fuzzing)是一種軟件測試技術。其核心思想是將自動或半自動生成的亂數據輸入到一個程式中,並監視程式異常,如崩潰,斷言(assertion)失敗,以發現可能的程式錯誤,比如記憶體流失。模糊測試常常用於檢測軟件或電腦系統的安全漏洞。
模糊測試最早由威斯康星大學的Barton Miller於1988年提出。[1][2]他們的工作不僅使用隨機無結構的測試數據,還系統的利用了一系列的工具去分析不同平台上的各種軟件,並對測試發現的錯誤進行了系統的分析。此外,他們還公開了原始碼,測試流程以及原始結果數據。
模糊測試工具主要分為兩類,變異測試(mutation-based)以及生成測試(generation-based)。模糊測試可以被用作白盒,灰盒或黑箱測試。[3]檔案格式與網絡協定是最常見的測試目標,但任何程式輸入都可以作為測試對象。常見的輸入有環境變數,滑鼠和鍵盤事件以及API呼叫序列。甚至一些通常不被考慮成輸入的對象也可以被測試,比如資料庫中的數據或共用主記憶體。
對於安全相關的測試,那些跨越可信邊界的數據是最令人感興趣的。比如,模糊測試那些處理任意用戶上載的檔案的代碼比測試解析伺服器設定檔的代碼更重要。因為伺服器設定檔往往只能被有一定權限的用戶修改。
歷史
1988年,威斯康星大學的Barton Miller教授率先在他的課程實驗提出模糊測試[1][2]。實驗內容是開發一個基本的命令列模糊器以測試Unix程式。這個模糊器可以用亂數據來「轟炸」這些測試程式直至其崩潰。類似的實驗於1995年被重複,並且包括了圖形介面程式(例如X Window System),網絡協定和系統API庫[3]。一些後續工作可以測試Mac和Windows系統上的命令列程式與圖形介面程式。
關於模糊測試更早的想法可以追溯到1983年前。Steve Capps於當時開發了一個叫做The Monkey的Macintosh程式以測試Mac程式,並曾被用於發現MacPaint的程式錯誤。[4]
另一個早期的模糊測試工具是crashme,於1991年發佈。其主要功能是讓Unix以及類Unix系統去執行隨機機器指令以測試這些系統的健壯性。[5]
用途
模糊測試通常被用於黑箱測試。其回報率通常比較高。[6]當然,模糊測試只是相當於對系統的行為做了一個隨機採樣,所以在許多情況下通過了模糊測試只是說明軟件可以處理異常以避免崩潰,而不能說明該軟件的行為完全正確。這表明模糊測試更多是一種對整體質素的保證,並不能替代全面的測試或者形式化方法。作為一種粗略的可靠性度量方法,模糊測試可以提示程式哪些部件需要特殊的注意。對於這些部件可以進一步使用代碼審計,靜態分析以及代碼重寫。
技術
模糊測試工具通常可以被分為兩類。變異測試通過改變已有的數據樣本去生成測試數據。生成測試則通過對程式輸入的建模來生成新的測試數據。[3]
最簡單的模糊測試是通過命令列,網絡包或者事件向一個程式輸入一段隨機位元流。這種技術目前依然是有效的發現程式錯誤的方法。另一個常見且易於實現的技術是通過隨機反轉一些位元或者整體移動一些數據塊來變異已有的輸入數據。但是,最有效的模糊測試需要能夠理解被測試對象的格式或者協定。這可以通過閱讀設計規格來實現。基於設計規格的模糊工具包含完整的規格,並通過基於模型的測試生成方法去遍歷規格,並在數據內容,結構,訊息,序列中引入一些異常。這種「聰明的」模糊測試也被稱作健壯性測試,句法測試,語法測試以及錯誤注入。[7][8][9][10]這種協定感知的特性也可以啟發式的從例子中生成。相關的工具有Sequitur。
模糊測試也可以與其他技術結合。白盒模糊測試結合了符號執行技術與約束求解技術。演化模糊測試則利用了一個啟發的反饋來有效的實現自動的探索性測試。
參考文獻
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.