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