被詛咒的油畫 圖片病毒技術的內幕(轉)

BSDLite發表於2007-08-15
被詛咒的油畫 圖片病毒技術的內幕(轉)[@more@]  一、被詛咒的油畫

  在網路上流傳著一幅詭異的油畫,據說很多人看後會產生幻覺,有人解釋為油畫的構圖色彩導致的視覺刺激,也有人認為是心理作用,眾說紛紜,卻沒有令人信服的答案。在網路公司上班的秘書小王也從一個網友那裡得知了這幅畫,她馬上迫不及待的點選了網友給的圖片連線。

  圖片出來了,小王終於見識到了傳說中詭異的油畫,面對著螢幕上那兩個看似正常的孩子,她卻覺得背後涼颼颼的。那網友也很熱心的和她聊這幅畫的來源,小王入神的聽著,絲毫沒有注意到IE瀏覽器左下角的狀態列開啟頁面的進度條一直沒停止過。

  如果說小王剛才只是背後發冷的話,那麼現在她已經是全身發冷了:電腦光碟機自動彈了出來,剛按回去又彈了出來,她著急的請教那個網友,那邊很平靜的說:“哦,也許是光碟機壞了吧,我有事先下了,你找人修一下。”然後頭像暗了。

  小王已經無法回覆他的話了:滑鼠正在不聽使喚的亂跑,鍵盤也沒了反應,過了一會兒,電腦自己重啟了,而且永遠停留在了“NTLDR is missing...”的出錯資訊上。

  顯而易見,這又是一個典型的木馬破壞事件,但是小王開啟的是圖片,難道圖片也會傳播病毒了?答案很簡單也很出人意料:小王開啟的根本不是圖片。

  IE瀏覽器的功能很強大,它可以自動識別並開啟特定格式的檔案而不用在乎它是什麼檔案字尾名,因為IE對檔案內容的判斷並不是基於字尾名的,而是基於檔案頭部和MIME。當使用者開啟一個檔案時,IE讀取該檔案的頭部資訊並在本機登錄檔資料庫內查詢它對應的MIME格式描述,例如開啟一個MIDI檔案,IE先讀取檔案前面一段資料,根據MIDI檔案的標準定義,它必須包含以“RIFF”開頭的描述資訊,根據這段標記,IE在登錄檔定位找到了“x-audio/midi”的MIME格式,然後IE確認它自己不具備開啟這段資料的能力,所以它根據登錄檔裡的檔案字尾名資訊找到某個已經註冊為開啟字尾名為“.MID”的檔案,然後提交給此程式執行,我們就看到了最終結果。

  正是因為這個原理,所以IE很容易受傷。入侵者透過偽造一個MIME標記描述資訊而使網頁得以藏蟲,在這裡也是相同的道理,小王開啟的實際上是一個字尾名改為圖片格式的HTML頁面,它包含上述兩個漏洞的病毒檔案和一個高度和寬度都設定為100%的圖片IMG標記,所以在小王看來,這只是一個圖片檔案,然而,圖片的背後卻是惡毒的木馬。木馬程式體積都比較大,下載需要一定時間,這就是IE進度條一直沒停止的原因。入侵者為了確保受害者開啟頁面的時間可以使整個木馬檔案下載完畢,就採用了社會工程學,讓受害者不會在很短的時間內關閉頁面,當木馬下載執行後,“圖片”的詛咒就應驗了。

  二、點陣圖特性的悲哀

  他是一家公司的網路管理員,在伺服器維護和安全設定方面有足夠多的經驗,因此他無需懼怕那些利用瀏覽器漏洞實現的病毒。這天他在一個技術論壇裡看到一個網友發的關於AMD某些型號的處理器存在運算瑕庇的帖子,並給出一個測試頁面連線,根據官方描述,如果你用的CPU存在瑕庇,那麼你會看到頁面上的測試圖片顯示得破損錯亂。他心裡一驚:自己用的CPU正是這個型號。他馬上點選了頁面連線。

  看著頁面上亂七八糟的一幅圖片,他心裡涼了一截:這臺機器的CPU居然有問題,而他還要用這臺機器處理公司的重要資料的!他馬上去管理部找負責人協商,把顯示著一幅胡裡花哨圖片的機器晾在一邊。

  管理部答應儘快給他更換一臺機器,讓他把硬碟轉移過去,因為上面有重要的業務資料。他回來時看到那幅圖片還在耀武揚威,他厭惡的關閉了頁面,照例開啟存放資料的資料夾,他的腦袋一下子空白了:資料不見了!誰刪除了?他慌亂的查詢硬碟每個角落,可那些檔案卻像蒸發了一樣。許久,他終於反應過來了:機器被入侵了!他取下硬碟直奔資料恢復公司而去。

  事後他仔細分析了原因,因為機器已經透過了嚴格的安全測試而且打了所有補丁,透過網頁漏洞和溢位攻擊是不可能的了,唯一值得懷疑的只有那個所謂的瑕庇測試網頁了,他迅速下載分析了整個頁面程式碼,看著頁面原始碼裡字尾名為“.BMP”的IMG標記和一堆複雜的指令碼程式碼,他知道自己是栽在了BMP木馬的手上。

  那幅“測試瑕庇”的圖片,無論到什麼機器上都是一樣有“瑕庇”,因為它根本不是圖片檔案,而是一個以BMP格式檔案頭部開始的木馬程式。

  為什麼看似溫順的圖片檔案也變成了害人的兇器?這要從點陣圖(Bitmap)格式說起,許多朋友應該都知道流傳了很久的被稱為“圖片藏字”的“密文”傳播方式,即在點陣圖檔案尾部追加一定量的資料而不會對原點陣圖檔案造成太大破壞,這是點陣圖格式的限制寬鬆而造成的。系統判斷一個點陣圖檔案的方法並不是嚴格盤查,而是僅僅從檔案頭部的54位元組裡讀取它的長寬、位數、檔案大小、資料區長度就完成了圖片的識別,寬鬆的盤查機制使得BMP木馬得以誕生。

  不過先要澄清一點概念,BMP木馬並不是在BMP點陣圖檔案屁股後追加的EXE檔案,而是一個獨立的EXE可執行檔案,但是它的檔案PE頭部已經用點陣圖檔案頭部替換了,由於系統的盤查機制,這個EXE檔案就被瀏覽器認成點陣圖檔案了。既然是點陣圖,在瀏覽器的程式邏輯裡,這是需要下載到Internet快取記憶體資料夾然後顯示在頁面上的檔案,但是因為這個檔案本來就不是點陣圖,它被強制顯示出來以後自然會變成一堆無意義的垃圾資料,在使用者眼裡,它就成了一幅亂七八糟的影像。但這不是引起木馬危機的原因,要留意的是這些文字:“需要下載到Internet快取記憶體資料夾”!這說明瀏覽器已經請狼入室了——木馬已經在硬碟上安家了,但是目前它還在沉睡中,因為它的檔案頭部被改為點陣圖格式,導致它自身已經不能執行,既然不能執行,理所當然就不能對系統構成危害,那麼這隻狼在硬碟呆多久也是廢物一個,入侵者當然不能任由它浪費,因此他們在做個頁面給瀏覽器下載木馬的同時,也會設定頁面程式碼讓瀏覽器幫忙脫去這隻狼的外衣——把點陣圖格式頭部換成可執行檔案的PE頭部,然後執行它。經過這些步驟,一隻惡狼進駐了系統。

  這個無法修補的漏洞十分可怕,使用者很難知道他們正在瀏覽的頁面是否正在偷偷下載著木馬資料,因為即使他們打好了所有補丁也無濟於事,木馬是被IE“合法”下載的,不屬於程式碼漏洞,而且單靠程式本身也很難判斷這個影像是不是木馬程式,機器靠二進位制完成處理工作,而不是視網膜成象交給大腦判斷。但是,由於這也是需要下載檔案的入侵方式,它能否下載完畢以及使用者願不願意去看頁面就要取決於入侵者的社會工程學了,在任何一個頁面裡放出一個亂七八糟的圖片或者來一個隱藏的圖片框都不是最明智的選擇,除非利用一些“暇庇宣告”或更能引起人的興趣的伎倆。那家公司的網管之所以會這麼不設防,就是因為攻擊者偷用了人們的“心理盲區”,因為人們對安全、漏洞、病毒、暇庇等內容會特別敏感,所以入侵者發個專業暇庇案例就欺騙了一大堆人,這次是拿真實的事件:AMD某些型號CPU會導致影像顯示出問題的暇庇來做魚餌,下一次又該拿什麼了呢?

  三、魔鬼的詛咒

  對於某娛樂論壇的大部分使用者來說,今天是個黑色的日子,因為他們在看過一個《被詛咒的眼睛》油畫帖子後,系統遭到了不明原因的破壞。

  論壇管理層的技術人員立即對這個帖子進行了多次分析,可是整個頁面就只有一個JPEG圖片的連線,其他惡意程式碼和程式根本不存在。入侵者靠什麼破壞了看帖使用者的機器?難道竟是這個JPEG圖片?

  答案恐怕讓人難以接受,的確就是這幅JPEG圖片讓使用者感染了病毒。儘管病毒研究一直未曾停止,可是發展到這個地步,實在讓人不能承受:再下去是不是開啟一個文字檔案都會被感染病毒?

  圖片帶毒來襲,實在讓所有人都擦了一把汗,然而我們都知道,JPEG、GIF等格式圖片不具備可以執行自身並散播病毒的條件,這不符合邏輯。回憶一下2004年9月14日的事,微軟釋出了MS04-028安全公告:JPEG處理(GDI+)中的緩衝區溢位可能使程式碼得以執行。沒錯,就是這個漏洞,它的術語叫GDI+,對應的動態連結庫為GdiPlus.dll,這是一種圖形裝置介面,能夠為應用程式和程式設計師提供二維媒介圖形、映像和版式,大部分Windows程式都呼叫這個DLL完成JPEG格式圖片的處理工作。但是現在,正是這個“公眾人物”成了眾矢之的。

  說到這裡,有基礎的讀者應該明白了吧:並不是圖片自己能傳播病毒,而是系統負責圖形處理工作的模組會在處理圖片時發生溢位導致圖片內攜帶的惡意指令得以執行破壞。如果某個圖片工具不呼叫這個系統模組,而是使用自己的處理模組,那麼同樣包含惡意指令的圖片就不能達到破壞目的。但是因為這個系統模組是預設的處理模組,所以大部分程式在“JPEG病毒”面前紛紛落馬。

  這個溢位是怎麼產生的呢?這要從系統如何讀取JPEG格式圖形的原理說起,系統處理一個JPEG圖片時,需要在記憶體里載入JPEG處理模組,然後JPEG處理模組再把圖片資料讀入它所佔據的記憶體空間裡,也就是所說的緩衝區,最後我們就看到了圖片的顯示,然而就是在圖片資料進入緩衝區的這一步出了錯——Windows規定了緩衝區的大小,卻沒有嚴格檢查實際容納的資料量,這個帶缺陷的邊界檢查模式導致了噩夢:入侵者把一個JPEG圖片的資料加工得異常巨大並加入惡意指令,那麼這個圖片在系統載入記憶體時候會發生什麼情況呢?圖片資料會漲滿整個JPEG處理模組提供的緩衝區並恰好把惡意指令溢位到程式自身的記憶體區域,而這部分記憶體區域是用於執行指令的,即核心區,於是惡意指令被程式誤執行了,入侵者破壞系統或入侵機器的行為得以正常實施。有人也許會疑惑,入侵者都是神運算元嗎,他們為什麼能準確的知道會是哪些資料可以溢位執行?答案很簡單,因為Windows在分配JPEG處理模組的空間時,給它指定的記憶體起始地址是固定的,入侵者只要計算好這個空間大小,就能知道會有哪些資料被執行了,所以JPEG病毒迅速傳播起來。

  所謂JPEG病毒,並不是JPEG圖片能放出病毒,而是系統處理JPEG圖片的模組自己執行了JPEG圖片攜帶的病毒,所以我們大可不必人心惶惶,只要補上了GDIPLUS.DLL的漏洞,那麼即使你機器上的所有JPEG圖片都帶有病毒資料,它們也無法流竄出來搞破壞,正如美國馬薩諸塞州立大學助理教授奧斯汀所言:“病毒不僅僅是可自我複製的程式碼,他們需要透過可執行程式碼的方式來進行傳播。JPEG檔案不能執行程式碼,他們是由應用軟體開啟的資料檔案。應用軟體不會去查詢資料檔案中的可執行的程式碼,為此不會執行這些病毒程式碼。”

  四、防範

  對於虛假圖片檔案的欺騙手法,只要使用者補上了MIME和IFRAME漏洞,那麼入侵者讓你停留多久也無濟於事;至於BMP木馬,它的防範是幾乎不可避免,但是它有個最大的弱點,大部分情況下只能在Win9x環境正常執行,用Win2000以上的使用者不必草木皆兵了;而對於JPEG病毒來說更好辦了,微軟已經提供JPEG模組的更新了,你倒是去補一下啊!即使真的一點也不會,買個防病毒軟體在後臺監視也OK了,但是為什麼國內使用者卻偏偏喜歡徒勞的恐慌?

  縱觀這一系列圖片病毒的原理和手法,我們可以發現“社會工程學”這個身影的擴大化趨勢。如何避免被騙,這隻能看你自己了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-959663/,如需轉載,請註明出處,否則將追究法律責任。

相關文章