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