原文:https://www.virusbtn.com/virusbulletin/archive/2015/03/vb201503-dylib-hijacking

0x01 攻擊


跟著我們對OS X平臺下的dylib劫持知識有了基礎的理解以后,現在是時候來看看現實世界中的攻擊場景,并且提供一些實際的防御方法。

高級的黑客知道,盡可能多的攻擊組建自動化對攻擊的重要性。這樣的自動化能提升攻擊的規模和效率。解放攻擊者,讓攻擊者將精力集中到更高的要求或者攻擊中更復雜的方面。

劫持攻擊的第一個自動化組件就是程序漏洞的挖掘。我們用一個Python腳本,dylibHijackScanner.py(下載鏈接【15】),用來完成此項任務。該腳本在收集運行進程列表和系統上所有可執行程序后,智能分析二進制文件的Mach-O頭結構和加載命令。為了挖掘可能通過弱dylib加載命令而被劫持的二進制文件,該腳本試圖尋找指向不存在dylib文件的LC_LOAD_WEAK_DYLIB加載命令。

[email protected]?制文件就有些復雜了。首先,該腳本尋找那些至少包含一個LC_LOAD*_DYLIB加載命令指向run-path依賴庫的二進制文件。如果這樣的加載命令被發現,腳本就繼續分析二進制文件的加載命令,尋找多個LC_RPATH。如果這兩個先決條件都滿足,腳本繼續檢查是否在第一個run-path搜索路徑中找到run-path-denpendent library。如果該庫不存在,腳本就會提示用戶這個程序存在漏洞。執行該程序發現了大量的漏洞程序,當然包括我們的測試程序rPathApp.app。

圖33 自動挖掘漏洞程序

我們可以在圖33中看到,掃描腳本在作者的電腦上找到了近150個漏洞二進制文件。有趣的是,大部分漏洞程序都屬于更加復雜的‘multiple rpath’一類。由于空間局限,完整的漏洞程序列表無法在這里呈現。但是表1列出了幾個廣泛使用的知名程序。這些程序都被掃描腳本探測到了dylib劫持漏洞。

擁有了自動挖掘程序漏洞的工具之后,下一步理所當然就是自動創建兼容的劫持dylib。回顧一下之前為了成功劫持dylib必須手動更新的兩個地方。第一個就是劫持dylib的版本號必須與合法的dylib兼容。第二個(在rpath劫持的情況下)就是劫持dylib必須包含一個re-export(LC_REEXPORT_DYLIB)加載命令指向合法的dylib,并保證所有的需要的符號都被導出。

可以非常直接的自動將生成的dylib修改以滿足上述兩個條件。下面介紹第二個Python腳本,createHijacker.py(下載地址15),用來完成這個功能。首先,腳本尋找并解析目標dylib(漏洞程序加載的那個合法dylib)的相關LC_ID_DYLIB加載命令。這樣可以提取到需要的版本兼容信息。然后對劫持dylib進行同樣的解析,直到找到LC_ID_DYLIB命令。腳本接下來就用提取到的兼容信息來更新劫持腳本的相同加載命令,以保證版本信息的兼容。接下來,在更新劫持dylib的LC_REEXPORT_DYLIB加載命令,讓其指向目標dylib。雖然可以手工完成更新LC_REEXPORT_DYLIB加載命令,但是用install_name_tool命令來處理會更加簡單。

圖34顯示了用Python腳本自動處理生成的劫持dylib。該劫持dylib用來劫持rpathApp.app示例程序。

圖34 劫持dylib的自動生成

Dylib劫持可以用來實現大量的惡意行為。本文知識涉及到其中一些,包括隱秘駐留,加載時注入,安全防護繞過,甚至是繞過Gatekeeper。這些攻擊雖然極具危險性,但是僅僅通過一個簡單的植入惡意dylib就能實施,只是需要利用一下系統加載器的合法行為。正是因此,這看起來有點微不足道,所有不大可能被修補,或者是被個人安全軟件所檢測到。

利用dylib劫持來實現長期隱秘駐留是該攻擊最重要的功能之一。如果一個漏洞程序可以在系統開機或者用戶登錄的時候自動運行,那么一個本地攻擊者就可以利用dylib劫持來實現惡意代碼的開機自動執行。除了能夠實現一種新的駐留方式,這種方式還能很好的隱藏攻擊者。首先,只需要植入一個簡單文件,而不需要更新系統組件(比如啟動配置文件或簽名的系統文件)。這是很重要的,因為這些組件基本都是被安全軟件監控,或者需要簡單驗證的。其次,攻擊者的dylib將會注入到一個可信進程里面,這使得它很難被檢測到,因為不會表現出很大不同。

當然,實現這樣隱秘和優雅的駐留,需要一個隨系統啟動的含有劫持漏洞的程序。蘋果公司的iCloud Photo Stream Agent(/Applications/iPhoto.app/Contents/Library/LoginItems/ PhotoStreamAgent.app)程序會在一個用戶登錄時候自動啟動,以此來將本地數據與云端同步。幸運的是,這個程序包含多run-path搜索目錄并且在第一個run-pa[email protected]說,這就是極好的劫持攻擊目標。

圖35 ?有漏洞的蘋果公司相片流工具

使用createHijacker.py腳本,可以輕松的將惡意劫持dylib配置更新為兼容目標dylib和程序。在這個例子中需要注意,因為存在漏洞的導入(’PhotoFoundation’)是在一個框架打包文件(framework bundle 見圖35)里,所以需要重新生成打包文件然后再放置到第一個run-path搜索目錄(/Applications/iPhoto.app/Contents/Library/LoginItems/)。當打包文件放置正確,且惡意劫持dylib(重命名為’PhotoFoundation’)也放置在第一個run-path搜索目錄中時,加載器就會在iCloud Photo Stream Agent啟動的時候發現和加載惡意dylib了。因為程序是由系統啟動的,所以劫持dylib在重啟后可以隱秘的啟動。

圖36 劫持蘋果的照片流工具達到駐留的目的

關于駐留的最后一個需要注意的地方是,如果沒有發現隨系統自動啟動的漏洞程序時,任何可以被用戶手動啟動的含有漏洞的程序(如瀏覽器,郵件客戶端等)都可以成為目標。換句話說,任何正常的程序都可以簡單的通過各種方法變為自啟動程序(比如注冊成為Login Item等)。然后在再進行利用。雖然這種方式增加了攻擊暴露的可能性,但是攻擊者的dylib可以避免任何界面出現在屏幕上。因為,絕大多數用戶都不會注意到一個合法的程序在后臺自動運行。

進程注入,或者強制一個進程加載一個動態庫是dylib劫持攻擊的另外一種很有用的攻擊方法。在本文中,‘injection’代表加載時注入(程序任意時間啟動的時候)而并不是運行時注入。后者看起來應該是更有威力,但是前者更簡單,大多數時候也能造成同樣規模的破壞。

利用dylib劫持來強制一個外部進程加載一個惡意dylib是一種既隱秘又威力十足的技術。和其他大的dylib劫持攻擊技術比起來,它不需要任何對操作系統組件或程序進行修改(例如對目標進程文件打補丁)。同時,因為植入的dylib都會在目標進程每次啟動的時候自動隱秘的加載到進程中,攻擊者也不需要任何監視器組件(來發現目標進程是否啟動,然后注入惡意庫)。因為攻擊者僅僅只需要植入惡意劫持dylib,比復雜的運行時注入要簡單的多。最后,因為注入技術是使用的操作系統加載器的合法功能,所以不容易被安全軟件探測到(安全軟件通過監視‘inter-process’API來阻止遠程進程注入)。

Xcode是蘋果公司的集成開發環境(IDE)。開發者使用它來開發OS X和iOS程序。因此,它是高級黑客喜歡的目標,高級黑客也許希望注入代碼到IDE中然后悄悄的感染開發者的產品(例如,作為一個創新的自動惡意軟件傳播模式)。Xcode和幾種它的輔助工具都存在dylib劫持攻擊的漏洞。特別是,run-path-dependent dylibs,比如DVTFoundation就沒有在Xcode的第一個run-path搜索目錄里面,見圖37。

圖37 蘋果IDE Xcode的漏洞

對Xcode的進程注入可以直截了當的完成。首先,配置好一個劫持dylib,它的版本信息是兼容的,它的re-exported指向合法DVTFoundation的所有符號。然后,將配置好的dylib拷貝到/Applications/Xcode.app/Contents/Frameworks/DVTFoundation.framework/Versions/A/(Frameworks/是第一個run-path搜索目錄)。現在,一旦Xcode啟動,惡意代碼就會自動加載。接下來就可以自由的執行任何功能了,比如中斷編譯請求,悄悄的植入惡意代碼到最終的產品中。

像Ken Thompson在他的文章‘Reflections on Trusting Trust’【16】中寫到的一樣,當你不能信任你的編譯器的時候,你都不能信任你自己編寫的代碼。

圖38 通過dylib劫持來進程注入。

除了隱秘駐留和加載時注入,dylib劫持還可以用于個人安全軟件的繞過。具體是通過dylib劫持,攻擊者可以使一個受信任的進程自動加載惡意代碼,然后在執行一些之前被阻止或警告的行為,現在就不會被檢測到了。

個人安全產品(PSPs)通過特征碼,啟發式行為分析來探測惡意代碼,或者簡單的在用戶執行某個動作時彈出以一個警告。因為dylib劫持是一個比較新的利用系統合法功能的技術,基于特征碼和基于啟發的產品都能輕易的被繞過。像防火墻一類的安全產品,警告用戶任何從一個未知進程發起的出口連接,會對攻擊者造成一些挑戰。Dylib劫持也可以輕易的擊敗這類產品。

個人防火墻在OS X平臺上很流行。它們通常使用一些算法,完全信任從已知程序發出的出口網絡連接,對未知和不信任進程的網絡活動向用戶給出警告。這確實對以探測基礎的惡意軟件很有效,但是高級黑客可以輕松的找到它們的弱點:信任。之前提到了,一般來說這類產品都擁有一個默認的配置規則,允許用戶創建新的規則給已知的受信的進程(例如:允許任何來自進程X的出口連接)。但是這要求合法的功能不能被破壞,如果一個攻擊者可以植入惡意代碼到一個可信進程里,這些代碼就繼承了進程的信任屬性,因此防火墻將允許它的出口連接。

GPG工具【17】是一個OS X平臺下的信息加密工具,提供密鑰管理,發送加密郵件,或者通過插件,提供加密服務到任意程序。不幸的是,它也存在dylib劫持漏洞。

圖39 GPG工具集中存在漏洞的keychain程序

因為GPG Keychain要求各種Internet功能(比如從密鑰服務器獲取密鑰),所有基本上它會擁有一條‘允許任意出口連接’的規則。見圖40。

圖40 GPG Keychain的訪問規則

使用dylib劫持,攻擊者可以將惡意的dylib加載到GPG Keychain程序的地址空間中。所以該dylib將會繼承和進程一樣的信任等級,因此就可以發起出口連接而不引起任何警報。測試結果說明了劫持dylib可以無限制的訪問Internet。見圖41。

圖41 通過dylib劫持繞過個人防火墻(LittleSnitch)

一些有防御意識的人會準確的指出,在這種情況下,可以讓防火墻針對GPG Keychain規則的更加嚴格,以此來抵御攻擊。只允許出口連接到特定的遠程端口(比如已知的密鑰服務器)。然而,還存在很多的漏洞程序,它們可以被劫持,然后同樣無限制的訪問網絡。或者,在本例中,Little Snitch防火墻默認允許任意進程連接到iCloud.com的端口,此規則在系統層面都不能被刪除。只需這一條已經足夠來進行繞過防火墻了(比如,用一個遠程的iCloud iDrive作一個C&C服務器)。

到此,dylib劫持方法都已經介紹了。可以看到他們是如此的有威力,優雅,并且隱秘。但是它們都需要接觸到用戶的電腦。然而,dylib劫持技術同樣可以被遠程攻擊者使用,用來協助更加容易的控制一臺遠程電腦。

有很多辦法來感染一臺Mac電腦,但是最簡單最可靠的是直接發送惡意內容到目標。這種比較低端的方式讓用戶手工去下載安裝一個惡意文件。攻擊者可以創造性的利用多種技術來達到目的,比如提供需要的插件,虛假升級包或補丁,虛假安全工具,或者是一個被感染的種子文件。

圖42 偽裝過的惡意內容

如果用戶被欺騙下載并執行了任何惡意文件,他們就會被感染。雖然是低端技術,但是這種技術的影響卻不可小覷。例如:當一款名叫Mac Defender的欺詐安全軟件使用這種方式傳播的時候,成千上萬的OS X用戶被感染,AppleCare接到超過6萬次請求來處理這個感染【18】。

靠一些小騙術來感染遠程目標在針對有電腦安全知識的人群來說就顯得沒有那么有效了。一個更可靠(盡管更加先進)的技術是當用戶下載合法軟件時進行中間人攻擊。由于蘋果商店的限制大多數軟件依然是通過開發者或者公司的網站來下載。如果這樣的軟件通過一條不安全的連接(比如:http)來下載軟件,可以接觸到傳輸網絡的攻擊者可以在傳輸過程中感染下載的文件。當用戶運行了被感染的軟件,它們的電腦就會被感染,如圖43所示。

圖43 中間人攻擊下載過程

讀者可能會想,現在是2015年了,大多數軟件都是通過安全渠道下載的,對嗎?不幸的是,即使是今天,大部分第三方軟件都是通過不安全的渠道分發的。舉個例子,在筆者的電腦上,66%的軟件都是不安全渠道下載的。

圖44 筆者機器上通過http協議下載的軟件

更多研究顯示,幾乎全部第三方OS X平臺的安全軟件都是使用不安全方式下載的,見圖45。

圖45 大部分OS X平臺下的安全產品的不安全的下載

蘋果也意識到了這些攻擊的危害,從版本OS X Lion(10.7.5)開始,Mac電腦都內置了一款安全軟件GateKeeper,用來直接抵御攻擊。

Gatekeeper的概念很簡單,但是很有效:阻止任何不受信的軟件執行。在后臺實現起來還是有點復雜,但是從本文的角度來說,一個概括性的解釋就足夠了。當任何可執行文件下載后,會被標記上隔離屬性。這個文件第一次執行時,Gatekeeper會驗證這個文件。是否執行取決于用戶的設置,如果這個軟件沒有用一個已知的蘋果開發者ID簽名(默認),或者不是來自蘋果商店,Gatekeeper將不會允許程序執行。

圖46 Gatekeeper執行

隨著新的版本的OS X自動安裝并開啟Gatekeeper之后,欺騙用戶安裝惡意軟件的方法或是感染后的不安全下載文件(這將破壞數字簽名)都基本上失效了。(當然,攻擊者可能試圖獲得一個有效的蘋果開發者證書,然后簽署他們的惡意軟件。然而,蘋果對分發此類證書相當謹慎,而且,有一個有效的證書撤銷程序,如果發現任何證書濫用就可以阻止證書。此外,如果被設置為只允許從蘋果應用程序商店的軟件,這種濫用的情況是不可能的。)

不幸的是,使用dylib劫持技術可以讓攻擊者繞過Gatekeeper來執行未簽名的惡意代碼,就算用戶設置將設置設為僅允許來自蘋果商店并簽名的代碼。這就重新打開之前講述攻擊方式的大門,將OS X用戶又置于危險之中。

理論上,通過dylib劫持繞過Gatekeeper是合乎邏輯的。雖然Gatekeeper完全驗證正在執行的軟件包的內容(例如,應用程序包中的每一個文件),但是它不驗證“外部”組件。

圖47 理論上dmg和zip文件都能繞過Gatekeeper

通常情況下,這不是一個問題,為什么一個下載(合法)的應用程序的應用程序會加載相對外部代碼?(提示:相對的,不是外部文件。)

因為Gatekeeper只驗證內部內容,如果一個蘋果簽名或來之蘋果商店的程序包含一個相對外部的可以劫持的dylib,攻擊者就可以繞過Gatekeeper。具體的,攻擊者可以生成(或者在傳輸途中感染)一個.dmg或.zip文件,該文件有必要的文件夾結構以滿足在外部相對的位置來包含惡意dylib。當合法程序被可信用戶執行時,Gatekeeper將會驗證程序包然后允許它執行。在進程加載階段,dylib劫持會被觸發,相關的外部惡意dylib會被加載,即使Gatekeeper被設置為只允許執行來自蘋果商店的程序!

找到一個可以滿足先決條件的漏洞程序也非常簡單。Instruments.app是一個蘋果簽名Gatekeeper認可的程序,安裝在Xcode.app的子目錄中。它依賴于程序包以外的關聯dylib,這些dylib就可以被劫持。

圖48 含有漏洞的蘋果的Instruments app。

通過一個含有漏洞的可信程序,一個惡意的.dmg文件可以繞過Gatekeeper。首先,Instruments.app被打包進該文件。然后,建立一個包含惡意動態庫的外部文件夾結構(CoreSimulator.framework/Versions/A/CoreSimulator)。

圖49 惡意.dmg文件

為了使惡意的.dmg文件更加可信,外部文件可以設置為隱藏,在最上層的別名(和一個用戶的圖標)指向Instruments.app。背景也更換掉,整個文件設置為只讀(所有雙擊的時候會自動顯示)。最后的結果見圖50。

圖50 最終版的惡意.dmg文件。

將惡意.dmg(雖然看起來是無害的)文件上傳到一個公共的URL地址來進行測試。當進過Safari下載后執行,Gatekeeper標準的‘this is downloaded from the Internet’消息窗口彈了出來。重要的是這個消息針對任何的下載內容都會彈出,這并不是出現了什么異常。

一旦這個消息窗口被取消,惡意代碼就會悄悄的同合法程序一起加載。當然,這是不應該被執行的,因為Gatekeeper的設置時最嚴苛的(只允許執行蘋果商店下載的程序)。見圖51。

圖51 通過dylib劫持繞過Gatekeeper

因為惡意dylib會在程序的main方法之前加載和執行,所有可以實現不顯示任何窗口。在本例中,惡意的.dmg文件偽裝成一個Flash安裝包,該惡意dylib可以阻止Instuments.app程序的界面彈出。取而代之的是一個合法的Flash安裝包。

有了繞過Gatekeeper和加載為簽名的惡意代碼的技術,攻擊者可以回頭使用他們的老伎倆讓用戶安裝虛假的補丁,更新包或者安裝包,虛假的殺毒產品,或者被感染的盜版程序。更糟糕的是,擁有網絡級攻擊技術的高級黑客(可以截斷不安全的連接的黑客)現在可以任意的感染合法軟件下載。再也不需要擔心Gatekeeper了。

0x02 防御


Dylib劫持對于OS X平臺來說是一種新型的有威力的攻擊技術,提供給本地和遠程攻擊者廣泛的惡意攻擊方法。不幸的是盡管和蘋果公司聯系多次,他們也沒有對此問題表示出任何興趣。而且,也沒有簡單的辦法來解決dylib劫持的核心問題,因為這是利用的操作系統的合法功能。無論如何,Gatekeeper的作者應該修補一下Gatekeeper來防止未簽名的惡意代碼執行。

用戶也許想知道他們自己能做什么來保護自己。第一,直到Gatekeeper得到修復之前,不推薦下載不可信軟件或者經過不安全渠道(比如:在Internet上通過HTTP)下載合法軟件。重新回顧下之前的內容可以確定的一件事就是遠程攻擊者通過本文里介紹的方法是不能接觸到一臺新的電腦的。由于OS X平臺上dylib劫持技術還很新,攻擊者或者OS X惡意軟件現在就在本地利用此技術攻擊不大可能,無論如何,它也不會傷人是確定的。

為了探測本地劫持,同時發現漏洞程序,作者開發了一款新程序Dynamic Hijack Scanner(or DHS)。DHS通過掃描整個文件系統所有的運行進程來嘗試發現劫持攻擊和漏洞。該程序可以在objective-see.com網站下載。

圖52 Objective-see的DHS掃描器

0x03 總結


DLL劫持是影響Windows系統的廣為人知的攻擊手段。之前人們一直認為,OS X平臺對此類攻擊免疫。但本文推翻了這個假設。進行了模擬dylib劫持攻擊演示。通過利用弱依賴或則run-path-denpendent導入,找到了大量的蘋果和第三方程序存在的漏洞,這種攻擊技術可以利用到多種攻擊場景,包括本地和遠程攻擊。從本地隱秘駐留技術到給遠程攻擊提供捷徑的Gatekeeper繞過技術,dylib劫持技術正變為OS X平臺黑客手中的有力武器。蘋果公司對此種攻擊技術表示無視時。現在,OS X用戶只能下載安全軟件和DHS一類的工具來保證自己是安全的…但僅僅是現在而已。

參考

【15】 dylibHijackScanner.py & createHijacker.py. https://github.com/synack/.

【16】 Reflections on Trusting Trust. http://cm.bell-labs.com/who/ken/trust.html.

【17】 GPG Tools. https://gpgtools.org/.

【18】 Apple support to infected Mac users: ‘You cannot show the customer how to stop the process’. https://nakedsecurity.sophos.com/2011/05/24/apple-support-to-infected-mac-users-you-cannot-show-the-customer-how-to-stop-the-process.

您的支持將鼓勵我們繼續創作!

[微信] 掃描二維碼打賞

[支付寶] 掃描二維碼打賞