張偉 李寧 楊康
南京郵電大學(xué)計算機學(xué)院 江蘇 210046
本文分析基于此漏洞傳播的惡意軟件的工作方式以及感染lnk病毒后的癥狀和解決方法,使得更多的用戶認(rèn)識該漏洞,減少此漏洞造成的危害。本文分為四部分,第一部分介紹lnk漏洞的背景;第二部分描述漏洞行為,包括感染該漏洞后的癥狀以及利用此漏洞病毒的傳播方式;第三部部分分析漏洞原理;第四部分實驗測試,設(shè)計實現(xiàn)了一個惡意的lnk文件來觸發(fā)該漏洞,并對其繞過殺毒軟件的能力進(jìn)行了測試。
lnk漏洞中毒的典型癥狀為系統(tǒng)運行緩慢、打開程序很久沒有反應(yīng)。網(wǎng)速的反應(yīng)遲緩,如果所裝的殺毒軟件開啟了實時監(jiān)控,會不時彈出非法訪問的提示,系統(tǒng)的各個盤符下莫名其妙出現(xiàn)autorun.inf和各種無規(guī)律的exe可執(zhí)行文件。
lnk漏洞對傳播者而言具有非常好的觸發(fā)性,形象描述為“看一眼就中毒”,病毒傳播者構(gòu)造一個特殊的lnk文件和一個lnk調(diào)用的病毒文件。通過U盤、移動硬盤、數(shù)碼存儲卡復(fù)制傳播這些文件,也可以將病毒文件打包在正常程序的壓縮包中。病毒被復(fù)制或解壓到目標(biāo)位置,當(dāng)用戶使用資源管理器軟件去訪問這些文件夾時,不需要其它任何操作,病毒程序就會被立即執(zhí)行。如果病毒保存在USB存儲器上,對于多數(shù)啟動了U盤自動運行功能的電腦,插入U盤的動作即可運行病毒。在局域網(wǎng)的共享文件夾中若存在這樣的文件,正常電腦訪問這些共享文件夾,就會立即中毒。也可以通過及時聊天工具,如QQ、MSN、UC等軟件的聊天信息,或發(fā)送垃圾郵件的方式附帶基于lnk漏洞的病毒文件進(jìn)行傳播。
為了方便用戶操作,Windows操作系統(tǒng)中用戶可以創(chuàng)建各類文件的快捷方式,快捷方式實質(zhì)上只保存了打開該文件的路徑,或稱為鏈接(link)。其作用就是使用戶在其它方便的地方打開該文件或程序雙擊程序的快捷方式,再由快捷方式啟動相應(yīng)的程序??旖莘绞降臄U(kuò)展名為lnk,lnk文件多存在于桌面、開始菜單的各個程序組、任務(wù)欄的快速啟動欄。lnk文件結(jié)構(gòu)如表1。
表1為lnk文件整體結(jié)構(gòu),其中內(nèi)容2至內(nèi)容8在lnk文件中是可選項,即不是必須存在的,但是如果存在,則必須按照圖1的順序組織。出現(xiàn)漏洞的控制面板程序的快捷方式?jīng)]有內(nèi)容3到內(nèi)容8,所以這里只介紹和lnk漏洞相關(guān)的文件頭和shell Item Id List段。
表1 lnk文件結(jié)構(gòu)
(1)文件頭:內(nèi)容1為lnk文件的文件頭,其偏移0x14處的值是重要的Flags,用來標(biāo)識.lnk文件中有哪些可選屬性,也就是哪些節(jié)是可選的,F(xiàn)lags的含義如表2。
表2 lnk文件結(jié)構(gòu)
(2)Shell Item Id List 段:該段是可選結(jié)構(gòu),由文件頭中偏移 0x14位置處的bit值來決定,bit值為1時,表示該lnk文件包含該結(jié)構(gòu)。如果存在該結(jié)構(gòu),偏移0x4c的位置的一個unsigned short int是Shell Item Id List結(jié)構(gòu)的大小標(biāo)識,后面緊跟一個SHITEMID結(jié)構(gòu),該結(jié)構(gòu)體定義如下:
typedef struct _SHITEMID
{
unsigned short int cb;
unsigned char abID[0];
}SHITEMID,*LPSHITEMID;
SHITEMID結(jié)構(gòu)的第一個成員cb標(biāo)識的是SHITEMID數(shù)據(jù)的大小,因為SHITEMID結(jié)構(gòu)的第二個成員abID是一個指針,存儲具體數(shù)據(jù),大小不固定,其指向的第0項里的數(shù)據(jù)是不能修改的(通常為電腦的GUID),否則lnk文件無法運行。圖1是用WinHex打開的控制面板程序上的“顯示”快捷方式。
圖1是一個控制面板程序的快捷方式,從偏移0x14處的值0x81,對照前面表2中每個bit位代表的含義可以看出該lnk文件沒有表1所示的內(nèi)容3至內(nèi)容8。
圖1 控制面板程序“顯示”的lnk文件
Windows操作系統(tǒng)為了在快捷方式顯示對應(yīng)的圖標(biāo),會派發(fā)一個任務(wù)給 Shell32.dll去完成快捷方式圖標(biāo)的解析工作。對于一般文件的快捷方式,它會解析這個lnk文件的內(nèi)容 8,即圖標(biāo)文件段,然后試圖讀取圖標(biāo)文件。但是對于沒有圖標(biāo)文件段的控制面板程序(以CPL為后綴的文件),其快捷方式的偏移0x7A 位置有一個值,這個值是系統(tǒng)圖標(biāo)的ID,系統(tǒng)默認(rèn)有多個圖標(biāo)ID,圖1中的9CFFFF是其中的一個。Shell32可以通過這個ID獲得圖標(biāo),具體解析控制面板程序快捷方式圖標(biāo)的過程如圖2所示。
圖2 shell32解析控制面板程序快捷方式圖標(biāo)的過程
lnk漏洞的關(guān)鍵在于調(diào)用LoadLibrary函數(shù),當(dāng)偏移0x7A處的值為0時,也就是shell32無法通過此處的數(shù)值獲得預(yù)設(shè)的圖標(biāo),那么shell32就會調(diào)用LoadLibrary函數(shù)來加載目標(biāo)文件,即一個cpl文件(cpl文件是一種特殊的dll文件)來獲取圖標(biāo)信息。lnk漏洞就是利用了這個解析機制的安全缺陷,攻擊者惡意構(gòu)造一個特殊的控制面板程序的lnk文件,使其0x7A處的偏移為0,需要加載的目標(biāo)文件為攻擊者構(gòu)造的惡意dll文件,當(dāng)shell32將這個惡意dll文件加載到內(nèi)存中執(zhí)行時,病毒獲得執(zhí)行。所以Windows在顯示lnk文件并解析惡意構(gòu)造的lnk文件時被觸發(fā)惡意代碼,造成“看一眼就中毒”的現(xiàn)象。
為了不受lnk漏洞的影響,用戶應(yīng)該及時打上微軟發(fā)布的補丁,對于無法及時打上補丁的用戶,可以采用下面的一些臨時防范方法:①不要打開未知或不可信任來源的帶有l(wèi)nk擴(kuò)展名的文件或瀏覽其屬性;②下載360safe、金山、瑞星、趨勢科技、nod32等病毒專殺工具;③關(guān)閉快捷方式圖標(biāo)顯示,不過這會讓桌面變的很簡陋。
為了對上述的漏洞原理進(jìn)行驗證,我們實現(xiàn)了一個惡意lnk文件來呈現(xiàn)lnk漏洞被利用的過程。實驗環(huán)境為Windows 7操作系統(tǒng),使用的分析工具包括winhex、VS2008和ollydbg。
實驗首先創(chuàng)建一個正常的“顯示”lnk文件,步驟如下:到“控制面板”下面,右鍵點“顯示”,點“創(chuàng)建快捷方式”,把快捷方式創(chuàng)建在桌面上。然后在桌面用WinHex打開“顯示.lnk”文件,如上面圖1所示。
實驗第二步對該lnk文件進(jìn)行修改,把偏移7A處的9C FF FF FF改成00 00 00 00,把后面的文件名C:WINDOWSsystem32desk.cpl改成C:ox.dll(UNICODE格式)。保存文件,并把這個文件復(fù)制到任意目錄下,當(dāng)用戶瀏覽該目錄時,就會加載C:ox.dll文件,圖3為修改后的lnk文件。
圖3 修改過的lnk文件
lnk的目標(biāo)文件存放在Shell Item Id List的SHITEMID結(jié)構(gòu)里面,這個結(jié)構(gòu)按照層來表示一個目標(biāo)的,每一層就是前面講述的一個SHITEMID結(jié)構(gòu)。圖3顯示lnk文件中,第一層是
00000040 14 00
00000050 F 50 E0 4F D0 20 EA 3A 69 10 A2 D8 08 00 2B 30
00000060 30 9D
14 00代表長度,后面的16字節(jié)是“我的電腦”的GUID{20D04FE0-3AEA-1069-A2D8-08002B30309D}。第二層是
00000060 14 00 2E 00 20 20 EC 21 EA 3A 69 10 A2 DD
00000070 08 00 2B 30 30 9D
14 00代表長度,后面的是“控制面板”的 GUID{21EC2020-3AEA-1069-A2DD-08002B30309D}。第三層就是后面長度為0xA2的目標(biāo)文件,圖3中顯示的Shell Item Id List所指向的文件就是:我的電腦->控制面板->C:ox.dll。
實驗第三步是提供一個惡意的dll,把一個寫好的box.dll放入C盤,我們的例子調(diào)用此dll文件就會彈出一個對話框,瀏覽lnk文件所在的快捷方式,系統(tǒng)就會加載這個box.dll。
圖4是測試用的一個簡單的dll程序代碼,該dll文件有一個入口函數(shù)DllMain,當(dāng)dll文件被載入內(nèi)存后就會先執(zhí)行DllMain函數(shù),所以把觸發(fā)木馬或病毒的程序放在 DllMain適當(dāng)?shù)奈恢?,?dāng)用戶瀏覽快捷方式的目錄時就會激活惡意代碼。
實驗結(jié)果如圖 5,當(dāng)僅僅瀏覽快捷方式所在的目錄時就會彈出一個hello的對話框,這也證實了前面對于漏洞的分析。
我們將測試用的lnk文件上傳到VirusTotal上檢測其繞過反病毒軟件的能力,VirusTotal是一款免費提供對可疑文件進(jìn)行分析Web服務(wù),通過各種知名反病毒引擎,對所上傳的文件進(jìn)行檢測,以判斷文件是否被病毒,蠕蟲,木馬,以及各類惡意軟件感染。
圖4 測試用box.dll 的代碼
圖5 測試結(jié)果
Windows lnk漏洞不需要用戶運行任何程序,僅僅瀏覽其所在目錄就可觸發(fā),其影響范圍比較廣泛。隨著微軟發(fā)布了官方的補丁,加上眾多安全軟件對lnk病毒的查殺,預(yù)計這個漏洞和利用此漏洞的病毒可能很快會消失。分析該漏洞的本質(zhì),其利用了lnk文件的解析過程和dll文件裝載過程的安全檢查不夠的缺陷,dll文件的安全裝載并不是一個新問題,lnk漏洞只不過是發(fā)現(xiàn)了該缺陷的一個新應(yīng)用場合,所以加強主動性防御才是根本性解決方法。
[1]Windows快捷方式LNK文件自動執(zhí)行文件漏洞.http://www.hackbase.com/news/2010-07-18/36546.html.
[2]windows lnk 漏洞. http://news.mop.com/domestic/2076668.shtml.
[3]lnk 0day漏洞完全解析.http://bbs.ijinshan.com/thread-13020-1-1.html.