在內部應用安全測試中使用模糊測試
問:一位研究員最近用模糊測試發現了許多蘋果和微軟的漏洞。在內部軟件開發過程中如何使用模糊測試來發現漏洞呢?
答:現在,很多軟件開發員、正規的安全研究者和網絡罪犯都在使用模糊測試技術——一種用大量無效的、意料之外的,或者隨機的數據來轟擊運行中的程序的輸入的技術——來測試代碼的堅固性。如果模糊數據導致程序在響應這個參數操作時出現失效、崩潰、鎖起、消耗內存,或者不可控制的錯誤的話,開發者或研究者就會知道代碼中存在缺陷。這就是模糊工具常被稱為錯誤注入器的原因,而模糊測試也被稱為堅固性測試或者負面測試。最初的模糊工具Fuzz是Wisconsin Madison大學的教授Barton Miller和他的學生們在1989年開發的。
微軟通過運行上百萬次的模糊測試在Office2010中發現了超過1800個錯誤,這些測試不光在他們實驗室的機器上運行,也在他們公司內部的閑置個人計算機上運行。早期模糊測試需要測試員在一臺機器上設置一個模糊測試軟件,然后讓它運行一個星期。我認為你的應用程序不太會和微軟Office一樣大型和復雜,但是可以肯定模糊測試一樣會在你的軟件開發生命周期中發揮作用。
由于模糊測試生成無效的輸入,它對測試錯誤處理流程和發現緩沖區溢出、拒絕服務(DoS)、SQL注入、跨站點腳本(XSS)和格式化字符串漏洞很有效果。它在發現C或者C++程序中和內存相關的漏洞(可能會成為安全漏洞)方面也很有用。顯然,你需要保存模糊測試中所生成的數值,并保留模糊測試器所生成的任何debug信息,這樣如果發生了一個錯誤,你就可以重現它。實現這一目的的***辦法是建立一個簡單的測試來隔離錯誤,并使得問題更容易理解和解決。
模糊測試的一個常見方式是定義危險值列表,也就是模糊載體,然后把它們注入到程序中。例如,在程序要求輸入正的整數的時候,你應該給它輸入零、負數以及很大的數字。對字符,你會輸入可識別的字符、引用和系統命令,而如果應用程序讀取或者使用其他文件,你會給它發送損壞的或者意料之外的文件格式。不過一個模糊測試器對應用了解的越多,就越不太可能發現“非常規”錯誤。所以一些程序員喜歡使用窮舉和隨機的方法,不用對軟件行為有任何的預知。模糊測試可以幫助發現潛在的邏輯錯誤,但是要重現那個引起程序邏輯錯誤的事件和值可能會很困難。由于不同的模糊測試器會發現不同的漏洞,用不同的測試器運行不同的測試可能會很有用。你可以嘗試的一些免費的測試器包括JbroFuzz、WSFuzzer、Powerfuzzer和SPIKE。
在內部軟件的開發流程中增加模糊測試肯定會提高軟件的可靠性和安全性,因為它可以發現那些通常代碼檢查和人工測試很難發現的錯誤。由于這個方式涉及到使用那些被黑客用來發現漏洞的工具,它還可能幫你趕在黑客之前發現漏洞。但是,模糊測試需要與其他測試技術相結合;模糊器不總能發現那些不會引起程序崩潰的漏洞,例如加密或者其他的數據保護流程的不足。重要的是要把模糊測試作為一個漏洞發現方式,而不是一種質量保證方式。
【編輯推薦】