阿碼外傳-阿碼科技非官方中文 Blog: 談掛馬偵測: HackAlert 的架構與技術

2008年8月14日

談掛馬偵測: HackAlert 的架構與技術

看到我們技術長 Walter 貼了一篇自動爬行功能正式啟動的文,讓我想到許多往事,回家之前,貼一篇好了!

全網監控,說穿了就是爬行(Web crawling)的功能。其實整個 HackAlert 系統,我們早在 2001 年就實做過一遍,並在 2002 年大量掃瞄美國前五百大企業的網站掛馬情形,在 2002 年寫完論文投稿,被 WWW 2003 接受並提名年度最佳論文。雖然現在的系統是 Walter 帶領 X-Solve 團隊開發的,加上德籍 Web 2.0 介面設計團隊的火力,成品跟我們當年幾隻小貓的研究雛形當然不可同日而語,然而整個 HackAlert 系統,基本上還是分成兩個主要部分:A. 爬行器(crawler)的設計 與 B. Sandbox 的設計。(A) 是阿碼科技本來擅長的,而 (B) 則是生力軍 X-Solve 吃飯的本行。我先講 (A) 吧!

我們在 2001 年開始設計爬行器(crawler)時,就發現爬行器不容易設計:許多連結要填了表單(form)才能看到(還要填得對才算!),許多則要執行 javascript 或 flash 才會出現。除了這些,如何將各式各樣 encoding 的 URL 正規化(canonicalize),如何避免無窮回圈(recursive crawling),在網站不吐標準 error 404 的請況下如何判斷有效 URL... 都是爬行器設計時的挑戰。

如果現在回去看我們的 WWW 2003 論文,整篇有一半在講爬行器(crawler)的設計!爬行器的基本原理很簡單:給一個開始的連結(URL),然後利用這個 URL 找出其他的 URL,根據條件停止(例如其他 URL 都要在開始的 URL 之下等等)。

這篇論文是 2002 年寫完投稿的,那時我們把一個網頁中,會告訴我們新的連結(URL)的方法有(直接將論文畫面捕捉貼出):


最後自動填表單(form)指的不是亂填,而是要懂得意義的填,例如要名字填名字,要 email 填 email,要住址填住址,要郵遞區號填郵遞區號...

論文中我們說:「我們建立了一個測試網站,然後請用很多開放源碼或商用的爬行器(crawler)來爬行,也請 Google 來爬。我們測了:GoogleTeleport Pro(六年級的還記得吧?)、WebSphinxHarvestLarbinWebGlimpse,發現除了 Teleport,沒有其他爬行器可以處理第四種以上的 URL 產生方式,所以我們把我們的爬行器跟 Teleport 來做比較」。

比較的結果如下(直接將論文畫面捕捉貼出):


我自己看了一下,哇!當年原來我們有把趨勢科技的網站當測試資料ㄝ!根據我們這篇論文,當年趨勢的網站一共有70個表單,我們爬了5,781頁而 Teleport 只爬了 2,939 頁,差不多是我們的一半,嘿嘿,研究做得不錯喔!

嗯嗯,平均來說,我們的系統 WAVES 比 Teleport 多爬了 28% 的網頁。

這是怎麼達到的?簡單的來說,我們做了以下幾點是其他爬行器所沒有的:

1. 那時我們透過 COM 的 IWebBrowser2 直接使用 IE 的引擎,所以我們不但可以執行網頁裡所有的 javascript / flash / Java applet,還可以虛擬使用者的滑鼠擊點(click)。碰到 flash 的時候我們就每隔幾個畫素就按一次,碰到 javascript 的選單的時候也是一樣。

2. 因為我們直接掌握了 IE 的引擎,所以我們可以知道整個 DOM(document object model)最後被畫出來(render)的樣子,也就是說,我們知道每個字以及每個物件的位置。所以當我們看到一個要填字的空格(textbox)時,我們就水平地去找這個 textbox 左邊的字,然後我們有一整個智慧庫(knowledgebase),可以根據這個 textbox 周圍的文字描述,以及他本身的 HTML 名字與變數,綜合起來決定,這個欄位要的是什麼值(姓名、電話、email、住址?)。

為什麼我們花這麼多時間做爬行器(crawler)?因為對於黑箱的技術來說,不論是偵測網站掛馬,或是做自動的黑箱滲透測試,都需要好的爬行器。今天的網站,動不動上千頁,沒有好的自動爬行技術,連攻擊點(attack surface)都會蒐集不完全,更何況其他。自動滲透測試的話,如果一個表單十個欄位,你想自動 SQL inject 其中一個欄位,那你最好把其他九個欄位填對。只要有一個欄位你沒填對,例如要郵遞區號結果你填 email,那在伺服器端的程式(server-side script),會還沒做到資料庫指令(SQL command)就先停了,因為你有欄位沒填好。當然如果他每個欄位都有檢查,那就沒有漏洞,那沒話說,但是通常不是這樣,很多人都只檢查特定幾個欄位,那麼其他欄位就會有 SQL injection 漏洞了。阿...我說得太亂了嗎?簡單的說,填對越多,越有機會 pass 過前端的 validation procedure 啦!

所以說,爬行器很難做;喔,應該說,「好的」爬行器很難做,爛的滿街都是。事實上我覺得,爬行器會是一個黑箱技術好壞的關鍵。

當初這篇論文 WAVES ,為了要投上 WWW,我們把自動黑箱滲透測試與自動掛馬偵測兩個技術都寫入其內。很多人問我們為何將網頁掛馬自動偵測技術產品化,而自動黑箱滲透測試卻沒有?答案其實很簡單,當初的 WAVES 系統整個都沒有商品化。現在的 HackAlert,是 X-Solve 與我們結合後他們團隊做出來的,跟我們原本的 WAVES 系統沒有關係;HackAlert 在各種方面,也複雜,成熟許多(當然啦!經過了六年了!)。至於原本 WAVES 的自動黑箱滲透測試部分,則由於我們後來做了白箱源碼檢測 WebSSARI 技術,重新商品化成 CodeSecure 之後,就沒有必要再做黑箱的了。

好,講完(A)爬行器的技術,來談談(B)sandbox 的技術吧!

Web 測惡意程式都經過層層的加殼與變形,要偵測 Web 惡意程式,無法用靜態的分析來達成,必須用動態的 sandboxing 技術。事實上,Web 的惡意程式已經對防毒產業造成的相當的困擾。底下這個圖是擷取於賽門鐵克 2007 後半年威脅報告(Symantec Internet Threat Report 2007):



這個圖是每半年,新的惡意程式出現的數量。賽門鐵克的報告中將 2007 年惡意程式在數量上的驚人成長,歸咎於 Web 惡意程式的氾濫。事實上也是如此。

Web 惡意程式,大都經過加殼,不論是 javascript 掛馬,或後續再下載回來的惡意程式,都會經過加殼變形。這其中尤其又以 javascript 為最難,DEFCON 我聽到一場演講,講師(現在是我好朋友了)展示了一種新的 javascript 變形觀念,非常具有創意,也不容易偵測(我之後會寫)。

其實即使一般 javascript 編碼/變形,就不容易偵測了。除了大家熟悉的 MPack 商用加殼軟體外,現在線上的 javascript 編碼/變形服務也到處都是:看這裡這裡

要解出這些加殼或變形的惡意程式,靠防毒軟體沒有太大效果,必須要靠動態的 sandbox (沙盒)。

不止要有 sandbox,還需要有整個 DOM(Document Object Model);或乾脆說,要有整個瀏覽器的環境。很多人想偷懶,用 spidermonkey 來做(SANS最近也玩了一下),但是就如同 SANS 的 Daniel Wesemann 說的:「But SpiderMonkey is only a JavaScript engine - it doesn't emulate the browser and doesn't even have a "document" or "location" object...」。

Spidermonkey 是一個 javascript 執行器,但是不是一個瀏覽器,還缺很多環境,雖然可以用它貼貼補補來做惡意程式偵測,我們當初還是決定打正規戰--建立完整的沙盒(sandbox)環境。

當年我們的 WAVES 論文,是利用 detours 這個含式庫,來建立自己的 sandbox,一共攔截了以下的含式(直接將論文畫面捕捉貼出):



當時關於沙盒的建立,資訊還不太多,大部分靠社群朋友的分享。

現在好的 sandbox 很多了,我前幾天貼的文--Black Hat 2008 第一天觀察中就有提到,像是 Paul Royal,講的就是他利用 Intel VT 建立的一個 sandbox 環境,並且有跟其他 sandboxing 技術比較。

Sandboxing 大致上可以說有四個目的: 1) 限制惡意程式不能讓其逃離 sandbox,2) 要讓惡意程式正常執行,包含正常脫殼與攻擊等,3) 不可以讓惡意程式發現它正被放在 sandbox 中執行, 4) 需要讓惡意程式展現行為。很多 sandboxing 技術做到了 1-3,但是無法做到(4)。

例如,如果惡意程式就是硬等個三十分鐘,才觸發攻擊,那麼如果 sandbox 只有三分鐘觀察時間(HackAlert 總不能掃一個網頁要三十分鐘吧?),就無法觀測出惡意的行為,而會提早收工而誤判了。

這就是當初我們 WAVES 論文中所提的「Behavior Stimulation(行為觸發)」的概念。在這方面,X-Solve 的加入是超級的生力軍,他們帶來了 Archon 引擎,也催生了 HackAlert

HackAlert 是免費的服務,歡迎各位註冊使用;如果想很快看看它的介面,可以看一下 Walter 貼的「自動爬行功能正式啟動」那篇。

如果要比較 HackAlert 偵測惡意程式的功力到底如何,可以找一些厲害的惡意程式試看看,如果手上沒有,MalwareGuru裡有一些;MalwareGuru 是一個 wiki,歡迎您直接註冊帳號參與 :)

至於很多人問我,為何最近都談惡意程式沒有談我們的白箱工具 CodeSecure ?是的,CodeSecure 還是我們主力產品,原因很簡單,HackAlert 隨便一寫就花我兩三個小時去了,CodeSecure 的技術更難,大家更不熟(喔?你 advanced compiler / formal methods / model checking / programming language 都修過?okok...我是指正常人),我每次想寫就手軟(尤其 CodeSecure 的工程師都超忙,更不可能幫我)...不過既然大家這麼有興趣,我下次再寫好了,先讓我把 Black Hat 還有 DEFCON 寫完吧!

最後,看到今天的 HackAlert 做得這麼成熟,心裡真的很高興,把當初論文上登的 WAVES 畫面切下來貼一下好了。現在 Walter 帶著 X-Solve 團隊做,以前這東東幾乎我一個人寫的勒!雖然跟 HackAlert 沒太大關連,貼一下紀念紀念啦!



作者 Wayne 為阿碼科技 CEO

2 篇回應 :

greysign 提到...

so coool

ic 提到...

这篇没写多少关于hackalert的东西。。。

張貼留言