張偉 李寧 楊康
南京郵電大學計算機學院 江蘇 210046
本文分析基于此漏洞傳播的惡意軟件的工作方式以及感染lnk病毒后的癥狀和解決方法,使得更多的用戶認識該漏洞,減少此漏洞造成的危害。本文分為四部分,第一部分介紹lnk漏洞的背景;第二部分描述漏洞行為,包括感染該漏洞后的癥狀以及利用此漏洞病毒的傳播方式;第三部部分分析漏洞原理;第四部分實驗測試,設計實現了一個惡意的lnk文件來觸發該漏洞,并對其繞過殺毒軟件的能力進行了測試。
lnk漏洞中毒的典型癥狀為系統運行緩慢、打開程序很久沒有反應。網速的反應遲緩,如果所裝的殺毒軟件開啟了實時監控,會不時彈出非法訪問的提示,系統的各個盤符下莫名其妙出現autorun.inf和各種無規律的exe可執行文件。
lnk漏洞對傳播者而言具有非常好的觸發性,形象描述為“看一眼就中毒”,病毒傳播者構造一個特殊的lnk文件和一個lnk調用的病毒文件。通過U盤、移動硬盤、數碼存儲卡復制傳播這些文件,也可以將病毒文件打包在正常程序的壓縮包中。病毒被復制或解壓到目標位置,當用戶使用資源管理器軟件去訪問這些文件夾時,不需要其它任何操作,病毒程序就會被立即執行。如果病毒保存在USB存儲器上,對于多數啟動了U盤自動運行功能的電腦,插入U盤的動作即可運行病毒。在局域網的共享文件夾中若存在這樣的文件,正常電腦訪問這些共享文件夾,就會立即中毒。也可以通過及時聊天工具,如QQ、MSN、UC等軟件的聊天信息,或發送垃圾郵件的方式附帶基于lnk漏洞的病毒文件進行傳播。
為了方便用戶操作,Windows操作系統中用戶可以創建各類文件的快捷方式,快捷方式實質上只保存了打開該文件的路徑,或稱為鏈接(link)。其作用就是使用戶在其它方便的地方打開該文件或程序雙擊程序的快捷方式,再由快捷方式啟動相應的程序。快捷方式的擴展名為lnk,lnk文件多存在于桌面、開始菜單的各個程序組、任務欄的快速啟動欄。lnk文件結構如表1。
表1為lnk文件整體結構,其中內容2至內容8在lnk文件中是可選項,即不是必須存在的,但是如果存在,則必須按照圖1的順序組織。出現漏洞的控制面板程序的快捷方式沒有內容3到內容8,所以這里只介紹和lnk漏洞相關的文件頭和shell Item Id List段。

表1 lnk文件結構
(1)文件頭:內容1為lnk文件的文件頭,其偏移0x14處的值是重要的Flags,用來標識.lnk文件中有哪些可選屬性,也就是哪些節是可選的,Flags的含義如表2。

表2 lnk文件結構
(2)Shell Item Id List 段:該段是可選結構,由文件頭中偏移 0x14位置處的bit值來決定,bit值為1時,表示該lnk文件包含該結構。如果存在該結構,偏移0x4c的位置的一個unsigned short int是Shell Item Id List結構的大小標識,后面緊跟一個SHITEMID結構,該結構體定義如下:
typedef struct _SHITEMID
{
unsigned short int cb;
unsigned char abID[0];
}SHITEMID,*LPSHITEMID;
SHITEMID結構的第一個成員cb標識的是SHITEMID數據的大小,因為SHITEMID結構的第二個成員abID是一個指針,存儲具體數據,大小不固定,其指向的第0項里的數據是不能修改的(通常為電腦的GUID),否則lnk文件無法運行。圖1是用WinHex打開的控制面板程序上的“顯示”快捷方式。
圖1是一個控制面板程序的快捷方式,從偏移0x14處的值0x81,對照前面表2中每個bit位代表的含義可以看出該lnk文件沒有表1所示的內容3至內容8。

圖1 控制面板程序“顯示”的lnk文件
Windows操作系統為了在快捷方式顯示對應的圖標,會派發一個任務給 Shell32.dll去完成快捷方式圖標的解析工作。對于一般文件的快捷方式,它會解析這個lnk文件的內容 8,即圖標文件段,然后試圖讀取圖標文件。但是對于沒有圖標文件段的控制面板程序(以CPL為后綴的文件),其快捷方式的偏移0x7A 位置有一個值,這個值是系統圖標的ID,系統默認有多個圖標ID,圖1中的9CFFFF是其中的一個。Shell32可以通過這個ID獲得圖標,具體解析控制面板程序快捷方式圖標的過程如圖2所示。

圖2 shell32解析控制面板程序快捷方式圖標的過程
lnk漏洞的關鍵在于調用LoadLibrary函數,當偏移0x7A處的值為0時,也就是shell32無法通過此處的數值獲得預設的圖標,那么shell32就會調用LoadLibrary函數來加載目標文件,即一個cpl文件(cpl文件是一種特殊的dll文件)來獲取圖標信息。lnk漏洞就是利用了這個解析機制的安全缺陷,攻擊者惡意構造一個特殊的控制面板程序的lnk文件,使其0x7A處的偏移為0,需要加載的目標文件為攻擊者構造的惡意dll文件,當shell32將這個惡意dll文件加載到內存中執行時,病毒獲得執行。所以Windows在顯示lnk文件并解析惡意構造的lnk文件時被觸發惡意代碼,造成“看一眼就中毒”的現象。
為了不受lnk漏洞的影響,用戶應該及時打上微軟發布的補丁,對于無法及時打上補丁的用戶,可以采用下面的一些臨時防范方法:①不要打開未知或不可信任來源的帶有lnk擴展名的文件或瀏覽其屬性;②下載360safe、金山、瑞星、趨勢科技、nod32等病毒專殺工具;③關閉快捷方式圖標顯示,不過這會讓桌面變的很簡陋。
為了對上述的漏洞原理進行驗證,我們實現了一個惡意lnk文件來呈現lnk漏洞被利用的過程。實驗環境為Windows 7操作系統,使用的分析工具包括winhex、VS2008和ollydbg。
實驗首先創建一個正常的“顯示”lnk文件,步驟如下:到“控制面板”下面,右鍵點“顯示”,點“創建快捷方式”,把快捷方式創建在桌面上。然后在桌面用WinHex打開“顯示.lnk”文件,如上面圖1所示。
實驗第二步對該lnk文件進行修改,把偏移7A處的9C FF FF FF改成00 00 00 00,把后面的文件名C:WINDOWSsystem32desk.cpl改成C:ox.dll(UNICODE格式)。保存文件,并把這個文件復制到任意目錄下,當用戶瀏覽該目錄時,就會加載C:ox.dll文件,圖3為修改后的lnk文件。

圖3 修改過的lnk文件
lnk的目標文件存放在Shell Item Id List的SHITEMID結構里面,這個結構按照層來表示一個目標的,每一層就是前面講述的一個SHITEMID結構。圖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字節是“我的電腦”的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的目標文件,圖3中顯示的Shell Item Id List所指向的文件就是:我的電腦->控制面板->C:ox.dll。
實驗第三步是提供一個惡意的dll,把一個寫好的box.dll放入C盤,我們的例子調用此dll文件就會彈出一個對話框,瀏覽lnk文件所在的快捷方式,系統就會加載這個box.dll。
圖4是測試用的一個簡單的dll程序代碼,該dll文件有一個入口函數DllMain,當dll文件被載入內存后就會先執行DllMain函數,所以把觸發木馬或病毒的程序放在 DllMain適當的位置,當用戶瀏覽快捷方式的目錄時就會激活惡意代碼。
實驗結果如圖 5,當僅僅瀏覽快捷方式所在的目錄時就會彈出一個hello的對話框,這也證實了前面對于漏洞的分析。
我們將測試用的lnk文件上傳到VirusTotal上檢測其繞過反病毒軟件的能力,VirusTotal是一款免費提供對可疑文件進行分析Web服務,通過各種知名反病毒引擎,對所上傳的文件進行檢測,以判斷文件是否被病毒,蠕蟲,木馬,以及各類惡意軟件感染。

圖4 測試用box.dll 的代碼

圖5 測試結果
Windows lnk漏洞不需要用戶運行任何程序,僅僅瀏覽其所在目錄就可觸發,其影響范圍比較廣泛。隨著微軟發布了官方的補丁,加上眾多安全軟件對lnk病毒的查殺,預計這個漏洞和利用此漏洞的病毒可能很快會消失。分析該漏洞的本質,其利用了lnk文件的解析過程和dll文件裝載過程的安全檢查不夠的缺陷,dll文件的安全裝載并不是一個新問題,lnk漏洞只不過是發現了該缺陷的一個新應用場合,所以加強主動性防御才是根本性解決方法。
[1]Windows快捷方式LNK文件自動執行文件漏洞.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.