OS X平臺的Dylib劫持技術(下)

wyzsk發表於2020-08-19
作者: vvun91e0n · 2015/10/11 13:57

原文: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.

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章