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