模糊測試
模糊測試 (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.