模糊測試
發表于:2009-06-23來源:作者:點擊數:
標簽:
模糊測試(Fuzztesting)是一項對代碼 質量 有著深遠影響的簡單技術。在本文中ElliotteRustyHarold故意將隨機的壞數據插入應用程序,以觀察發生的結果。他也解釋了如何使用如校驗和、XML數據存儲及代碼驗證等防護性編碼技術,來加固您的程序以抵制隨機數據。
模糊測試(Fuzztesting)是一項對代碼
質量有著深遠影響的簡單技術。在本文中ElliotteRustyHarold故意將隨機的壞數據插入應用程序,以觀察發生的結果。他也解釋了如何使用如校驗和、XML數據存儲及代碼驗證等防護性編碼技術,來加固您的程序以抵制隨機數據。他以一個練習進行總結,在練習中他以一個代碼破壞者的角度進行思考——這是一種用于防護代碼的至關重要的技術。
多年來,我驚嘆于有如此大量能夠使MicrosoftWord崩潰的壞文件。少數字節錯位,會使整個應用程序毀于一旦。在舊式的、無內存保護的操作系統中,整個計算機通常就這樣宕掉了。Word為什么不能意識到它接收到了壞的數據,并發出一條錯誤信息呢?為什么它會僅僅因為少數字節被損壞就破壞自己的棧、堆呢?當然,Word并不是惟一一個面對畸形文件時表現得如此糟糕的程序。
本文介紹了一種試圖避免這種災難的技術。在模糊測試中,用隨機壞數據(也稱做fuzz)攻擊一個程序,然后等著觀察哪里遭到了破壞。模糊測試的技巧在于,它是不符合邏輯的:自動模糊測試不去猜測哪個數據會導致破壞(就像人工測試員那樣),而是將盡可能多的雜亂數據投入程序中。由這個測試驗證過的失敗模式通常對
程序員來說是個徹底的震憾,因為任何按邏輯思考的人都不會想到這種失敗。
模糊測試是一項簡單的技術,但它卻能揭示出程序中的重要
bug。它能夠驗證出現實世界中的錯誤模式并在您的軟件發貨前對潛在的應當被堵塞的攻擊渠道進行提示。
模糊測試如何運行
模糊測試的實現是一個非常簡單的過程:
● 準備一份插入程序中的正確的文件。
● 用隨機數據替換該文件的某些部分。
● 用程序打開文件。
● 觀察破壞了什么。
可以用任意多種方式改變該隨機數據。例如,可以將整個文件打亂,而不是僅替換其中的一部分,也可以將該文件限制為ASCII文本或非零字節。不管用什么方式進行分割,關鍵是將大量隨機數據放入應用程序并觀察出故障的是什么。
測試基于C的應用程序
當字符串包含額外的零時,許多用C編寫的程序都會出問題——這類問題太過頻繁以至于額外的零能夠徹底隱藏代碼中其他的問題。一旦驗證出程序存在零字節問題,就可以移除它們,從而讓其他的問題浮現出來。
可以手動進行初始化測試,但要想達到最佳的效果則確實需要采用自動化模糊測試。在這種情況下,當面臨破壞輸入時首先需要為應用程序定義適當的錯誤行為。(如果當輸入數據被破壞時,您發現程序正常運行,且未定義發生的事件,那么這就是第一個bug。)隨后將隨機數據傳遞到程序中直到找到了一個文件,該文件不會觸發適當的錯誤對話框、消息、異常,等等。存儲并記錄該文件,這樣就能在稍后重現該問題。如此重復。
盡管模糊測試通常需要一些手動編碼,但還有一些工具能提供幫助。例如,清單1顯示了一個簡單的
Java??類,該類隨機更改文件的特定長度。我常愿意在開始的幾個字節后面啟動模糊測試,因為程序似乎更可能注意到早期的錯誤而不是后面的錯誤。(您的目的是想找到程序未檢測到的錯誤,而不是尋找已經檢測到的。)
清單1.用隨機數據替換文件部分的類
import
java.io.*;
importjava.security.SecureRandom;
importjava.util.Random;
publi
clearcase/" target="_blank" >cclassFuzzer{
privateRandomrandom=newSecureRandom();
privateintcount=1;
publicFilefuzz(Filein,intstart,intlength)throwsIOException
原文轉自:http://www.anti-gravitydesign.com