原理
由於
輸入表中只包含DLL名而沒有它的路徑名,因此載入程式必須在磁碟上搜尋
DLL檔案。首先會嘗試從當前程式所在的目錄載入DLL,如果沒找到,則在
Windows系統目錄中查找,最後是在
環境變數中列出的各個目錄下查找。利用這個特點,先偽造一個系統同名的DLL,提供同樣的
輸出表,每個輸出函式轉向真正的系統DLL。程式調用系統DLL時會先調用當前目錄下偽造的DLL,完成相關功能後,再跳到系統DLL同名函數裡執行。這個過程用個形象的詞來描述就是系統DLL被劫持(hijack)了。
利用這種方法取得控制權後,可以對主程式進行補丁。此種方法只對除kernel32.dll、ntdll.dll等核心繫統庫以外的DLL有效,如網路應用程式的
ws2_32.dll、遊戲程式中的
d3d8.dll,還有大部分應用程式都調用的lpk.dll、
sxs.dll,這些DLL都可被劫持。
偽造的dll製作好後,放到程式當前目錄下,這樣當原程式調用
原函式時就調用了偽造的dll的同名函式,進入劫持DLL的代碼,處理完畢後,再調用原DLL此函式。
這種補丁技術,對
加殼保護的軟體很有效,選擇掛接的函式最好是
在殼中沒有被調用的,當掛接函式被執行時,相關的代碼已被解壓,可以直接補丁了。在有些情況下,必須用計數器統計掛接的函式的調用次數來接近OEP。此方法巧妙地繞過了殼的複雜檢測,很適合加殼程式的補丁製作。
一些木馬或病毒也會利用DLL劫持技術搞破壞,因此當在應用程式目錄下發現系統一些
DLL檔案存在時,如lpk.dll,應引起注意。
如何防止
DLL劫持利用系統未知DLL的搜尋路徑方式,使得程式載入當前目錄下的系統同名DLL。所以可以告訴系統DLL的位置,改變載入系統DLL的順序不是當前目錄,而是直接到系統目錄下查找。
是調用系統DLL的首要查找目錄。例如裡面有RE_SZ類型的"ntdll"="ntdll.dll"項,則系統載入"ntdll"時會直接從系統目錄載入。
由此,添加"LPK"="LPK.DLL"即可防止LPK被劫持,同理可以阻止一些其他DLL被劫持,例如"USP10"。
在Windows NT系統,XP默認只有少數關鍵DLL在此鍵值下,Win7下面此鍵值已經相當齊全,在Win7系統下發生DLL劫持的機率要比XP小很多。
一 回顧DLL挾持的發展
2010年08月24日微軟發布安全公告2269637,提到三方軟體編程不安全存在一個DLL挾持的缺陷可以導致遠程攻擊
2010年08月24日流行的漏洞信息共享網站exploit-db馬上就爆出多個DLL挾持漏洞涉及的軟體有:
Wireshark(免費
嗅探器),Windows Live email(信箱客戶端), Microsoft MovieMaker(
視頻編輯處理),Firefox(
網頁瀏覽器), uTorrent (
BT下載工具),PowerPoint 2010(
辦公軟體)等
2010年08月25日-26日漏洞信息共享網站exploit-db繼續爆出
Winamp,Google Earth,
Photoshop等軟體存在DLL挾持漏洞,同時發布這個blog之前筆者的電腦中已經發掘存在的流行軟體有,QQ影音,
QQ音樂,
美圖秀秀,ppstream等
二新老DLL挾持的攻擊原理分析和防禦
windows xp sp2系統以上會默認開啟SafeDllSearchMode,安全dll搜尋模式下DLL檔案的搜尋順序如下所示
(1)可執行程式載入的目錄(可理解為程式
安裝目錄比如 C:\Program Files\
uTorrent)(2)系統目錄(即
%windir%\system32 )(3)16位系統目錄(即 %windir%\system)(4)Windows目錄(即 %windir%)(5)運行某檔案的所在目錄,比如C:\Documents and Settings\Administrator\
Desktop\test)(6)PATH
環境變數中列出的目錄
2 老DLL挾持觸發的原理解析和防禦(漏洞觸發在DLL搜尋流程的第一層,運行程式即載入病毒)
(1)老DLL挾持的特點:
為了增加觸發的機率,通常會使用usp1.dll,
ws2_32.dll,lpk.dll等
應用程式所必須的系統dll檔案,然後利用DLL搜尋第一順位是程式
安裝目錄,在程式安裝目錄釋放一個同名DLL檔案,搶先載入惡意病毒
DLL檔案,從而達到破壞的作用。這裡可執行程式相當於惡意dll的載入器
(2)老DLL挾持病毒利用回顧重現
2007年羅姆病毒(ws2_32.dll導致很多防毒軟體無法打開),2009年春節
貓癬病毒(usp10.dll導致很多用戶重灌系統都無法解決病毒問題)
通常使用老DLL挾持的病毒木馬會枚舉電腦裡面的所有exe目錄,然後將惡意的usp10.dll釋放到每個exe所在的目錄。當用戶執行一個應用程式的時候,將會把惡意的usp10.dll檔案優先載入從而感染系統
根據前面介紹的DLL載入順序,運行程式的時候會優先到程式執行的目錄下載入必須檔案,下圖顯示了
utorrent.exe在
安裝目錄下的找到了usp10.dll檔案並把它載入到記憶體中。
(3)老DLL挾持的通用免疫方案
可以通過編輯HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs來添加需要面議的
DLL檔案,比如:新建一個ws2_32 指向ws2_32.dll
3 新DLL挾持觸發的原理解析和防禦(漏洞觸發在DLL搜尋流程的第五層,運行圖片即載入病毒)
(1)新DLL挾持的特點:
應用程式為了擴展或者兼容等目的需要載入相應的DLL檔案,但是因為某些原因導致這個DLL檔案默認不存在於當前系統,比如plugin_dll.dll檔案默認情況下不存在utorrent的
安裝目錄,dwmapi.dllxp環境下不存在(Vista以上系統存在),
ie6環境下沒有
ieframe.dll(ie7以上版本存在)。正是因為程式需要的
DLL檔案在DLL搜尋順序的(1)-(4)中都不可能存在,此時就會嘗試載入檔案所在目錄下的惡意
dll檔案,從而達到破壞的作用。這裡運行的檔案(比如mp3)相當於觸發者,根據
檔案關聯它會啟動一個應用程式去播放mp3檔案。而因為應用程式存在DLL挾持漏洞(比如QQ影音),此時QQ影音就會因為設計上的不足導致成為惡意DLL的載入器。相當於老DLL挾持,簡直達到了運行圖片/視頻檔案就會執行惡意檔案的目的,當然前提是大
灰客們能猜中你電腦裡面的默認查看的軟體是否存在DLL挾持漏洞了,目前已經發現的存在DLL挾持缺陷的主要有以下幾類
① 特定系統環境下的檔案
典型的有
dwmapi.dll檔案,xp環境下不存在,vista以上版本存在,也就是說需要觸發這個漏洞的系統環境只能是XP系統
② 特定軟體版本下的檔案
③ 特定的庫檔案
④ 程式自己需要的
dll檔案,可能是為了功能擴展或者兼容
典型的有:plugin_dll.dll
⑤ 其它未知
(2)新DLL挾持利用重現
通常
灰客們會先通過DLL挾持挖掘工具尋找存在DLL挾持漏洞的流行應用程式,然後構造相應的檔案上傳到網路上供用戶下載(具體的傳播方式請看下一章),如果用戶的電腦存在漏洞那么運行相應檔案的時候就會執行存在漏洞的程式,從而使得惡意dll被不知不覺載入
根據前面介紹的DLL載入順序和新DLL挾持的特點,程式在前四個流程都沒有找到需要的檔案,只能勉為其難的在第五流程-當前檔案目錄下載入惡意
dll檔案,下圖就顯示了
uTorrent載入plugin_dll.dll順序(前四個流程都是 name not found)並且載入當前目錄下惡意plugin_dll.dll檔案(第五流程顯示的是success )的過程
(3)新DLL挾持的免疫
目前微軟沒有提供有效的免疫方案可以使用,建議升級你常用軟體到最新版本.
三 新DLL挾持可能存在的攻擊方式
exploit-db公布了存在DLL Hijacking的大量常用軟體,這些軟體裡面有視頻音頻播放器,
圖像設計瀏覽軟體,IM聊天工具,
文字處理軟體,
網頁瀏覽器,
下載軟體,防毒軟體。根據在下的一點拙見如果病毒作者想要利用這個漏洞來實現廣泛傳播的話主要有幾種方式。
挖掘出支持BT下載的流行軟體(比如uTorrent )的DLL Hijacking漏洞,然後構造一個惡意dll檔案(估計會設定隱藏屬性,這樣你解壓以後將不會看到這個檔案)和BT
種子檔案打包成
壓縮檔上傳到網上供用戶下載,用戶一旦下載了這個壓縮檔雙擊
BT種子檔案的時候會調用uTorrent 打開,uTorrent 運行的時候由於設計上的不河蟹根據dll載入的順序最後會將種子所在目錄的惡意dll載入
2 美女圖片分享傳播
挖掘出流行圖片瀏覽工具(比如
美圖秀秀)的DLL Hijacking漏洞,然後構造一個惡意
dll檔案(估計會設定隱藏屬性,這樣你解壓以後將不會看到這個檔案)和圖片
檔案打包成
壓縮檔上傳到網上供用戶下載,用戶一旦下載了這個壓縮檔,解壓瀏覽美女靚照的時候可能會調用圖片瀏覽工具打開從而觸發漏洞載入惡意dll檔案
3 軟體下載包含的網頁檔案傳播
挖掘出流行網頁瀏覽工具(比如firefox)的DLL Hijacking漏洞,然後構造一個惡意
dll檔案(估計會設定隱藏屬性,這樣你解壓以後將不會看到這個檔案),應用程式和htm等網頁檔案打包成軟體壓縮檔並上傳到網上供用戶下載。用戶一旦下載了這個軟體壓縮檔,解壓以後運行安裝必看.htm之類的網頁檔案會調用網頁瀏覽工具打開從而觸發漏洞載入惡意dll檔案
挖掘出流行視頻音頻播放工具(比如QQ影音)的DLL Hijacking漏洞,然後構造一個惡意dll檔案(估計會設定隱藏屬性,這樣你解壓以後將不會看到這個檔案)和
rmvb等視音頻
檔案打包壓縮檔並上傳到網上供用戶下載。用戶一旦下載了這個壓縮檔,解壓播放相應視頻的時候從而觸發漏洞載入惡意dll檔案
5 目前公布的部分軟體列表
Google Earth
Nullsoft Winamp 5.581
Media Player Classic 6.4.9.1
Mozilla Thunderbird
Microsoft Office PowerPoint 2007
Adobe InDesign CS4
Nvidia Driver
Adobe Illustrator CS4
Adobe Premier Pro CS4
Skype <= 4.2.0.169
TechSmith Snagit 10
Safari v5.0.1
uTorrent
Microsoft Visio 2003
Adobe Photoshop CS2
avast! <= 5.0.594
Adobe Dreamweaver CS5
Opera v10.61
Firefox <= 3.6.8
四 DLL安全編程,避免產生DLL挾持問題
(1) 調用
LoadLibrary, LoadLibraryEx, CreateProcess的,或者 的ShellExecute 等涉及到模組載入的函式的時候,指定DLL載入的完整路徑,貌似應該有API可以獲取當前程式運行的目錄的
(2)考慮使用 的DLL
重定向 或 Manifests檔案 ,以確保您的應用程式使用正確的DLL。
(3)確保DLL安全搜尋模式被激活。未使用安全搜尋設定的話,第二載入項就是當前目錄。
HKLM\System\CurrentControlSet\Control\Session Manager \ SafeDllSearchMode
(4)從搜尋列表中取消當前目錄,可以通過調用SetDllDirectory 參數設定為一個
空字元串