在最近項目的測試中,我們引入了模糊測試(Fuzz testing)。在這個過程中,接觸到了Sulley,一款用Python實現的用于網絡協議fuzz testing的開源測試框架。跟其他的開源工具比起來,使用上比較靈活,而且也很方便。
舉例來說,在測試過程中如果出現了目標程序crashing的情況,會導致后續的測試無法繼續進行下去。針對這種情況,Sulley提供了一個用Python實現的進程監控的Agent(process_monitor.py),它的功能就是類似于watchdog,一旦檢測到程序崩潰,會自動重啟目標程序,使后續測試能順利進行下去。如果程序的內部數據,比如某些配置已經由于之前的Fuzz testing被破壞掉了,只是簡單重啟目標程序還不足以讓后續的測試正常的進行,可以選擇在測試之初,直接把目標程序裝在vmware虛擬機上,同樣的,Sulley也提供了一個用來控制vmware虛擬機的Agent(vmcontrol.py),可以完成對虛擬機及snapshot的操作。有個這個Agent的協助,我們可以在目標程序環境準備好之后但是測試開始之前,對虛擬機做個vsnapshot,然后在測試開始之后,一旦發現crash,可以利用這個Agent直接把虛擬機rollback到之前預存好的snapshot狀態,然后測試繼續,夠直接吧,呵呵。
網上關于Sulley的資料不多,在這里做點筆記,供大家參考。
什么是模糊測試(Fuzz testing)
模糊測試(Fuzz testing),根據WiKi上給出的定義,就是指一種軟件測試方法:通過給程序提供不合法的,沒有考慮到的,隨機的輸入,一旦程序出錯了(比如crashing,或斷言失敗),則Bug被發現。根據程序輸入的不同,模糊測試可以應用在很多方面,比如文件格式,網絡協議,環境變量,鍵盤,鼠標事件,數據庫,共享內存等,當然最常見的還是文件格式和網絡協議。
根據這個定義,要成功實施Fuzz testing找出程序中的bug,在測試過程中我們需要解決以下2個問題:
- 如何生成隨機但有效的輸入
- 何能夠對目標程序監控以保證及時地發現, 定位目標程序錯誤
而這也正是模糊測試工具力圖解決的問題。
什么是Sulley
”工欲善其實,必先利其器“,為了能更方便地進行Fuzz testing,工具自然是少不了的。Sulley,正是一款用Python實現的開源Fuzz testing框架,主要應用于網絡協議方面的測試. 目前現在關于這方面的測試工具也挺不少,不管是開源的(比如歷史悠久的SPIKE, 或者是本文介紹的Sulley)還是商業的(比如Mu Dynamics公司的產品),更多可以看這里.
事實上,在Sulley出來之前,這方面的工具已經有一些了,但是為什么Sulley的作者還要選擇重新造輪子呢?根據Sulley的文檔,他這么做的理由是,當時已有的工具主要是專注在”數據生成“部分,而僅僅做到這一步對Sulley是不夠的,因為Sulley設計的目標是:不僅要簡化數據生成,同樣要簡化與目標系統的之間的數據傳輸,以及目標系統的監控。因此我們可以把剛才這段話理解成,Sulley要做的是一個能支持fuzz testing的整個測試流程的框架。在這一點上,顯然Sulley的定位比起之前的工具高出了很多。而且事實上,Sulley的作者也不算是在造一個全新的輪子,比如在具體實現Sulley的時候,他也借鑒了一些當時已經成熟很成熟的Fuzz框架(SPIKE)的經驗,比如用“塊”結構的方式來構造數據,這點從Sulley構造Request所用的API接口就可以看出來,包括對于特定數據類型所用到的fuzz library也都直接從SPIKE拿過來,這些內容,我們會在后面的文章中介紹。
好了,基本的背景知識了解完畢,接下來我們會開始介紹Sulley的整個框架中四個主要的組成部分:數據表示,會話管理,Agent 以及 Utilities.
原文轉自:http://www.anti-gravitydesign.com