模糊測試
![本頁使用了標題或全文手工轉換](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/American_fuzzy_lop%27s_afl-fuzz_running_on_a_test_program.png/220px-American_fuzzy_lop%27s_afl-fuzz_running_on_a_test_program.png)
模糊測試 (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。
模糊測試也可以與其他技術結合。白盒模糊測試結合了符號執行技術與約束求解技術。演化模糊測試則利用了一個啟發的回饋來有效的實現自動的探索性測試。
參考文獻
[編輯]- ^ 1.0 1.1 Barton Miller (2008). "Preface". In Ari Takanen, Jared DeMott and Charlie Miller, Fuzzing for Software Security Testing and Quality Assurance, ISBN 978-1-59693-214-2
- ^ 2.0 2.1 Fuzz Testing of Application Reliability. University of Wisconsin-Madison. [2009-05-14]. (原始內容存檔於2021-01-20).
- ^ 3.0 3.1 3.2 Michael Sutton, Adam Greene, Pedram Amini. Fuzzing: Brute Force Vulnerability Discovery. Addison-Wesley. 2007. ISBN 0-321-44611-9.
- ^ Macintosh Stories: Monkey Lives. Folklore.org. 1999-02-22 [2010-05-28]. (原始內容存檔於2021-03-21).
- ^ crashme. CodePlex. [2012-06-26]. (原始內容存檔於2012-08-11).
- ^ Justin E. Forrester and Barton P. Miller. An Empirical Study of the Robustness of Windows NT Applications Using Random Testing. [2013-12-04]. (原始內容存檔於2021-02-14).
- ^ Robustness Testing Of Industrial Control Systems With Achilles (PDF). [2010-05-28].[失效連結]
- ^ Software Testing Techniques by Boris Beizer. International Thomson Computer Press; 2 Sub edition (June 1990). Amazon.com. [2010-05-28]. (原始內容存檔於2021-11-18).
- ^ Kaksonen, Rauli. (2001) A Functional Method for Assessing Protocol Implementation Security (Licentiate thesis). Espoo. Technical Research Centre of Finland, VTT Publications 447. 128 p. + app. 15 p. ISBN 951-38-5873-1 (soft back ed.) ISBN 951-38-5874-X (on-line ed.). (PDF). [2010-05-28]. (原始內容存檔 (PDF)於2016-10-18).
- ^ Software Fault Injection: Inoculating Programs Against Errors by Jeffrey M. Voas and Gary McGraw. John Wiley & Sons. January 28, 1998.