一、被詛咒的油畫
在網絡上流傳著一幅詭異的油畫,據說很多人看後會產生幻覺,有人解釋為油畫的構圖色彩導致的視覺刺激,也有人認為是心理作用,眾說紛纭,卻沒有令人信服的答案。在網絡公司上班的秘書小王也從一個網友那裡得知了這幅畫,她馬上迫不及待的點擊了網友給的圖片連接。圖片出來了,小王終於見識到了傳說中詭異的油畫,面對著屏幕上那兩個看似正常的孩子,她卻覺得背後涼飕飕的。那網友也很熱心的和她聊這幅畫的來源,小王入神的聽著,絲毫沒有注意到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圖片攜帶的病毒,所以