綠盟科技 · 2015/11/21 14:28javascript
本文簡要介紹了流行的三個瀏覽器動態Fuzz工具cross_fuzz、grinder、X-Fuzzer的原理及其優缺點,並提供了一種經過動靜結合的方式兼顧可重現性、通用性、高效性、自動化程度高的瀏覽器fuzz方法。css
Fuzz(模糊測試)是一種側重於發現軟件安全漏洞的方法。典型地模糊測試過程是經過自動的或半自動的方法,反覆驅動目標軟件運行,併爲其提供」精心」構造的輸入數據,同時監控軟件運行的異常,進而根據異常結果及輸入數據查找軟件的安全漏洞。隨着Smart Fuzz的發展,RCE(逆向代碼工程)需求的增長,其特徵更符合一種灰盒測試。其簡要流程圖以下:html
Web瀏覽器是網絡應用中使用最普遍的軟件之一,IE、FireFox、Chrome等三款主流瀏覽器佔據了Web瀏覽器市場的大部分份額,其自身的安全性備受關注、影響普遍。本文介紹的瀏覽器fuzz則是以上述三款瀏覽器做爲fuzz的主要目標,之內容(css、html、js)隨機的html頁面做爲被測瀏覽器的輸入,並監控瀏覽器運行的異常狀況,查找其安全漏洞。html5
瀏覽器fuzz是查找瀏覽器漏洞的一個經常使用且有效的方法,公開的動態瀏覽器fuzz工具備cross_fuzz、grinder、X-Fuzzer等,這些工具基本都經過javascript腳本進行fuzz操做,同時經過hook函數、localStorage本地存儲等技術手段動態記錄fuzz操做日誌,捕獲到異常後再根據記錄日誌進行還原。java
現有瀏覽器fuzz工具動態記錄日誌方式可能會影響被測瀏覽器的執行環境進而致使有時不可以重現異常;且其在記錄日誌方法上通用性(如IE的ActiveXObject)、穩定性(grinder hook函數)欠佳。node
不少瀏覽器fuzz工具每運行一個測試用例都會重啓待測瀏覽器進程,由於瀏覽器重啓在運行一個測試用例過程當中耗時佔比較大,進而致使fuzz效率不高。web
有的瀏覽器fuzz工具(如經典的cross_fuzz)在遇到crash時會中止fuzz,自動化程度不夠。數據庫
本文在總結了現有動態瀏覽器fuzz工具優缺點的同時,提供了一種經過動靜結合的方式兼顧可重現性、通用性、高效性、自動化程度高的瀏覽器fuzz方法及其工具NBFuzz(New Browser Fuzz)。瀏覽器
cross_fuzz由google的安全研究人員Michal Zalewski開發,支持多個瀏覽器fuzz,並專門針對IE瀏覽器做了優化。這個工具及在其基礎上衍生的瀏覽器fuzz工具發現了大量的瀏覽器安全漏洞,其設計思想對瀏覽器漏洞挖掘產生了深遠的影響。安全
cross_fuzz主要闡述了瀏覽器fuzz的設計思想,只是個演示性的功能模塊,還不是一個完整的瀏覽器自動化fuzz工具,如關鍵的操做日誌記錄、異常監控等還須要用戶本身來實現。
X-Fuzzer是由安全研究人員Vinay Katoch開發的一款輕量級的動態瀏覽器fuzz工具,其日誌記錄採用了主流瀏覽器通用localStorage本地存儲、document.cookie,即便瀏覽器異常崩潰時日誌也可以保存。此工具dom元素fuzz操做、日誌記錄都很簡單,還需自行完善;並且此工具沒有異常監控模塊,不能實現自動化fuzz。
grinder是一個自動化瀏覽器fuzz框架,客戶端node主要採用ruby語言編寫。
其日誌記錄經過向被測瀏覽器進程注入grinder_logger.dll ,進而hook javascript函數parseFloat在jscript9.dll、mozjs.dll等腳本引擎中的實現函數,這樣須要記錄日誌時只需調用parseFloat函數,日誌記錄功能由grinder_logger.dll中相應的hook回調函數完成。須要注意的是下載相應dll符號文件後才能完成hook操做,且最近版本的Firefox已不包含mozjs.dll致使hook函數失敗。此日誌記錄方法穩定性、通用性欠佳。
監控模塊( dbghelp.dll 、 symsrv.dll )負責啓動、監控被測瀏覽器,記錄其異常信息,完成fuzz自動化 。
重現模塊( testcase.rb )根據日誌重現POC。
具體fuzz操做須要用戶自行完善。
NBFuzz 日誌記錄方法總結
經過測試用例生成程序生成大量指定瀏覽器的fuzz測試用例,將生成的測試用例和調度頁面一併置於web服務端,監控模塊打開待測瀏覽器訪問調度頁面,調度頁面經過內嵌iframe頁面順序調用測試用例;監控模塊記錄被測瀏覽器異常或者超時重啓被測瀏覽器進程,保障瀏覽器fuzz的自動化;最後分析監控模塊記錄的異常信息,找出可疑crash,根據其異常時間查找web服務端log文件中修改時間與之相匹配的文件,獲取調度頁面發來的致使異常的測試用例名稱,進而重現crash,進一步判斷漏洞的可利用性。
界面
根據選定的瀏覽器類型生成大量包含其特性(不一樣的屬性、函數、垃圾回收機制等)的測試用例,因爲使用了IE特有的ActiveXObject進行本地文件操做因此要求使用IE運行此程序,使用js寫包含js的測試用例。
流程圖
爲解決每個測試用例重啓瀏覽器進程瀏覽器啓動耗時佔比大的問題,NBFuzz的調度模塊經過內嵌iframe打開測試用例,一個測試用例完成後調度頁面reload操做執行下一個測試用例,爲防止頁面不響應異常監控模塊在超時後重啓待測瀏覽器;同時爲了防止web服務端記錄log文件過多加入了不夠精確的異常判斷機制,由於超時重啓將致使異常標誌不能正常置false,產生誤報,儘管如此也會大大減小log日誌。
調度模塊流程圖以下:
隨着瀏覽器的安全機制(如IE的延遲釋放、隔離堆等)不斷增強,其安全漏洞井噴之勢已經獲得遏制;而目前仍應用普遍的flash因爲其安全機制的不健全逐漸成爲安全研究的熱點,安全漏洞亦呈現爆發的態勢,能夠預見不久的未來若其仍固步自封,必將步java的後塵,逐漸被用戶所」拋棄」。
flash fuzz框架只需在NBFuzz框架的基礎上進行些許的改變便可,如需增長as3測試用例編譯成swf的過程。