模糊測試(fuzz testing)是一種安全測試方法,他介於完全的手工測試和完全的自動化測試之間。為什么是介於那兩者之間?首先完全的手工測試即是滲透測試,測試人員可以模擬黑客惡意進入系統、查找漏洞,這對測試人員的要求比較高。能力強的測試人員可以發現比較多或者高質量的安全性問題,但是如果測試人員的能力不夠,可能就不能找到足夠多、威脅大的安全漏洞。所有滲透測試對人員能力的依賴性強,成本高,難以大規模的實施。
但是想用完全的自動化來實現滲透測試也不可行,同一套測試用例和方法不可能不加修改的就用在不同的產品上,因為各個產品的需求、實現、功能等等都不一樣。測試過程中還需要測試人員的介入來分析結果、判斷漏洞等等。那么,這種情況下我們就可以引入模糊測試。
為了簡單起見,假定我們要測試的應用是一個C/S應用的服務端程序。這個程序運行在Unix平台上,名字叫做Tserver。我們唯一知道的信息就是客戶端和Tserver之間使用基於TCP/IP的自定義協議進行通訊。這種情況下,我們該如何嘗試找到應用系統中可能的漏洞?
方法1:
如果我們手頭上有Tserver的源代碼,通過代碼審查顯然可以找到可能的漏洞。就算沒有源代碼,通過逆向工程方式,用代碼審查的方式也可以達到找到漏洞的目的。當然,這必然要求審查者具有足夠好的技能,而且,被測應用規模越大,需要付出的成本也就越高。
方法2:
我們可以在知道產品服務器端和客戶端的通信協議后,根據協議的格式、定義,自己准備大量的測試數據,從客戶端發送給服務器端,從而試圖找到一些安全漏洞。
但是分析通信協議很難,而且自己准備數據成本太高,那么我們就可以用模糊測試的方式,讓機器生成測試數據,病發送給服務器,最后測試人員再對測試結果進行分析。
模糊測試充分利用了機器的能力:隨機生成和發送數據;同時,也嘗試將安全專家在安全性方面的經驗引入進來。從執行過程來說,模糊測試的執行過程非常簡單:
- 測試工具通過隨機或是半隨機的方式生成大量數據;
- 測試工具將生成的數據發送給被測試的系統(輸入);
- 測試工具檢測被測系統的狀態(如是否能夠響應,響應是否正確等);
- 根據被測系統的狀態判斷是否存在潛在的安全漏洞。
比如我們知道一個Tserver和客戶端的通信協議的定義和格式,我們就可以用一種模糊測試工具用模板方式把協議描述出來,然后工具根據模板生成大量的測試數據,然后把測試數據發送給Tserver。同時測試人員監控Tserver(可以通過其他工具),假如Tserver出現異常比如無響應、響應錯誤等等,測試人員就可以通過日志等資料分析問題,並報告異常。
可以閱讀《模糊測試——強制發掘安全漏洞的利器》來了解更多模糊測試。
模糊測試工具:
一般有Spike,Bunny,teenage mutant ninja turtles,sulley等等,Cisco用Codenomicon。
參考:http://www.ibm.com/developerworks/cn/java/j-fuzztest.html
https://en.wikipedia.org/wiki/Fuzz_testing