本文簡要介紹了流行的三個瀏覽器動態Fuzz工具cross_fuzz、grinder、X-Fuzzer的原理及其優缺點,并提供了一種通過動靜結合的方式兼顧可重現性、通用性、高效性、自動化程度高的瀏覽器fuzz方法。
Fuzz(模糊測試)是一種側重于發現軟件安全漏洞的方法。典型地模糊測試過程是通過自動的或半自動的方法,反復驅動目標軟件運行,并為其提供”精心”構造的輸入數據,同時監控軟件運行的異常,進而根據異常結果及輸入數據查找軟件的安全漏洞。隨著Smart Fuzz的發展,RCE(逆向代碼工程)需求的增加,其特征更符合一種灰盒測試。其簡要流程圖如下:
Web瀏覽器是網絡應用中使用最廣泛的軟件之一,IE、FireFox、Chrome等三款主流瀏覽器占據了Web瀏覽器市場的大部分份額,其自身的安全性備受關注、影響廣泛。本文介紹的瀏覽器fuzz則是以上述三款瀏覽器作為fuzz的主要目標,以內容(css、html、js)隨機的html頁面作為被測瀏覽器的輸入,并監控瀏覽器運行的異常情況,查找其安全漏洞。
瀏覽器fuzz是查找瀏覽器漏洞的一個常用且有效的方法,公開的動態瀏覽器fuzz工具有cross_fuzz、grinder、X-Fuzzer等,這些工具基本都通過javascript腳本進行fuzz操作,同時通過hook函數、localStorage本地存儲等技術手段動態記錄fuzz操作日志,捕獲到異常后再根據記錄日志進行還原。
現有瀏覽器fuzz工具動態記錄日志方式可能會影響被測瀏覽器的執行環境進而導致有時不能夠重現異常;且其在記錄日志方法上通用性(如IE的ActiveXObject)、穩定性(grinder hook函數)欠佳。
很多瀏覽器fuzz工具每運行一個測試用例都會重啟待測瀏覽器進程,因為瀏覽器重啟在運行一個測試用例過程中耗時占比較大,進而導致fuzz效率不高。
有的瀏覽器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的過程。