惡意網頁逃避JavaScript沙盒過濾技術及應對介紹
意網頁是目前木馬傳播的一個主要途徑,沙盒過濾技術是檢測惡意網頁的一個可行的方法,而且理論上檢測率是很高的,但在現實實現這種檢測方案時,檢測程序內置的HTML以及JavaScript解析引擎有可能在功能上沒有實現完整,或者一些行為與真實的瀏覽器有偏差,還有運行環境畢竟和真實的客戶機是不同的,總之會與瀏覽器有或多或少這樣或那樣的不同,而這些不同卻可以被惡意網頁的編寫者所利用來躲避檢測程序的跟蹤檢查,本文對惡意網頁可能使用的一些逃避檢測程序的方法進行了介紹。
目前基于WEB的應用越來越普遍,與此同時惡意網頁也成為了木馬傳播的重要途徑,而且有越來越嚴重的趨勢。據統計,目前有80%以上的木馬是通過惡意網頁進行傳播的,微軟最新發布會的“微軟安全情報”報告指出,2007年期間,Windows用戶機器中所感染的特洛伊(Trojan)木馬病毒下載程序猛增300%;攻擊者正逐漸放棄傳統的電子郵件攻擊手段,轉而越來越多地使用網頁攻擊策略。可見阻止木馬傳播的有效方式就是對惡意網頁進行封殺,目前各安全廠家都在不遺余力的加強這方面的研究。具體到網關級安全產品(如入侵保護系統,安全網關,UTM等)來說就是對被保護的內網用戶訪問的網頁進行分析過濾,如果發現惡意網頁就發出告警,在網關處阻止惡意網頁進入內網用戶的主機,從而保護內網用戶。
網關級安全產品阻斷惡意網頁在技術上的一個主要問題就是如何判斷一個網頁是否是惡意網頁。現在大多數惡意網頁中的惡意代碼是用JavaScript編寫的,這些JavaScript通過HeapSpray技術觸發本地ActiveX控件的漏洞而進行木馬下載并運行,而且這些惡意的JavaScript代碼為了躲避檢測一般都進行了混淆加密處理,如下是一段真實的惡意網頁中的JavaScript代碼:
![]() |
1.在DOM中,一些對象有許多別名,如:
document.location ,window.location,document.URL是等價的。
window,window.window,window.self,window.parent,window.self.self.self.self是等價的。
任一個全局變量都自動成為window的成員。
惡意網頁可以利用這一點來檢測自己是否運行在真實的瀏覽器中,例如:
var spi = 5; if(window.parent.window.spi ==5){ //“haha in browser” do_evil(); } else{ //“oh I’m now maybe in sandbox” Return; }
|
在上面的這個網頁代碼中的do_evil()是這個惡意網頁中包含惡意代碼的地方,上面的代碼中的if語句判斷自己當前的運行環境中對DOM別名的特性是否支持,如果安全產品中自己實現的JavaScript解析引擎對DOM別名的特性實現不完整的話,那么很有可能會認為window.parent.window.spi 不等于5,從而讓惡意網頁逃過檢測。
2.通過使用 HTML
tag 的一些功能進行測試,已判斷當前的運行環境是Sandbox還是瀏覽器,例如:
|
在上面的例子中,第一個meta在設定的Set-Cookie時,使用了HttpOnly屬性,HTML協議規定在使用了HttpOnly屬性后,這個meta設定的Cookie也就是”c2=v2”將不能被頁面中的腳本訪問到,也就是說在下面的Javascript代碼中document.cookie的值在真實的瀏覽器中為” c1=V1”,如果安全產品的JavaScript解析引擎對meta的一些特性實現不完整的話,就會可能被惡意網頁利用逃過檢測。
3.Image對象是JavaScript的內建對象,可以通過語句var img = new Image()來創建對象,在創建Image對象后可以通過語句img.src=http://images.51cto.com/files/uploadimg/20090724/1859081.jpg來從網絡上獲取圖片,當瀏覽器遇到這句話時,會向www.exist.com發出http請求,獲取圖片a.jpg,如果這個圖片從www.exist.com成功獲取,瀏覽器會調用img的onload()方法,如果這個圖片在www.exist.com上不存在或者www.exist.com根本就不存在,瀏覽器會調用img的onerror()方法,惡意網頁可以利用這些特性來來判斷當前的運行環境是Sandbox還是瀏覽器,代碼如下:
|
在以上代碼中可以看到當在真實的瀏覽器中語句img.src=http://images.51cto.com/files/uploadimg/20090724/1859081.jpg會讓瀏覽器去獲取圖片a.jpg,然后調用goodman()函數運行惡意代碼,如果安全產品的沙盒對以上特性沒有實現完整的話,就會可能被惡意網頁利用逃過檢測。
4.當javascript代碼中出現語法錯誤或者函數的無窮遞歸調用的錯誤,瀏覽器會調用window.onerror(),惡意網頁中通過故意引入語法錯誤或無窮遞歸調用的錯誤來判斷當前的運行環境是Sandbox還是瀏覽器,代碼如下:
|
從以上代碼可以看出,如果安全產品的沙盒對錯誤處理的實現不完整的話,例如在遇到語法錯誤時可能停止解析了,而沒有象真實的瀏覽器那樣去調用window.onerror,那么就可能被惡意網頁利用逃過檢測。
最后,還有很多其它可以采用的方法如對Ajax的特性進行探測,對事件的處理順序,對plug-in的測試,對同源策略的測試等都可以用來探測當前的運行環境是在瀏覽器里還是在沙盒里。
通過以上分析可以看出要利用沙盒檢測的方式對惡意網頁進行檢測,很重要的一點就是對瀏覽器的一些關鍵特性要盡可能模擬。綠盟科技的安全產品對沙盒檢測以及惡意網頁的反檢測技術進行了持續的研究,在設計之初便針對一些可能的逃避情況進行了關注,目前已有成熟的解決方案并已進入產品化。
【編輯推薦】