1. 程式人生 > 實用技巧 >Shield——一個防止在macOS上進行程序注入的應用程式

Shield——一個防止在macOS上進行程序注入的應用程式

最近有開發人員開發了一個基於Apple的Endpoint Security框架的應用程式(該應用程式的程式碼託管在GitHub上),可以防止macOS上的某些程序注入技術。但由於開發人員至今仍然沒有獲得生產端點安全性授權,因此無法釋出已簽名的版本。如果你想使用它,你至少需要獲得開發端點安全授權。

在過去的兩年中,研究人員開始深入研究macOS安全性問題,隨著研究的愈加深入,該研究人員發現除了記憶體損壞漏洞之外,macOS的首要問題是在其他應用程式的上下文中執行程式碼。奇熱其原因在於macOS的安全模型(實際上也包括* OS),每個應用程式都有一個許可權列表,可授予該應用程式各種許可權。如果我們僅使用第三方應用程式,則大多數情況是圍繞沙盒(例如,訪問網路)或在沒有沙盒的情況下可以做什麼,可以訪問哪個隱私(TCC)保護區域,例如攝像機,麥克風,訊息等。在TCC的情況下,如果我們不擁有這些許可權,即使我們以root身份執行,也無法訪問這些資源或位置。

對於Apple二進位制檔案有數百種不同的Apple私有許可權是第三方應用程式無法擁有的例如它們可以控制對SIP保護區域的訪問或載入核心擴充套件的能力。

要新增到此列表中XPC跨程序通訊的基本保護之一是控制誰可以與特定XPC服務進行通訊的能力,尤其是在其中一個程序具有特權的情況下。對於蘋果公司來說,這通常是通過授權來完成的,而對於第三方而言,這是通過程式碼簽名驗證來完成的。在這兩種情況下,如果我們都可以代表XPC客戶端執行程式碼,就能夠與特權XPC服務進行通訊。

該列表可以不停地進行,鑰匙串有時還根據程式碼簽名來控制訪問。

這意味著,如果我們可以嚮應用程式中注入程式碼,則可以獲得其許可權,這就是為什麼過程注入功能在macOS上受到嚴格控制的原因。蘋果公司在保護自己的應用程式方面做得很好,儘管有時他們也會有疏忽,例如

CVE-2019-8805

不幸的是,第三方應用程式並不是很好。這就導致了大量的XPC漏洞,這些漏洞通常會允許使用者將其特權升級到root。繞過TCC進行攻擊的場景也很常見,攻擊者可以在攻擊中訪問敏感位置,例如:Microsoft AutoUpdate中的LPE或Zoom程式中的TCC繞過

流程注入通常可以歸結為以下3種主要情況

1.通過環境變數進行dylib注入

2.dylib劫持或代理

3.通過任務埠注入Shell程式碼如果Electron應用程式在macOS上變得非常流行,則可以通過在除錯模式下執行Electron應用程式或使用Electron特定的環境變數來注入程式碼

巧的是本文的作者也是一位Mac使用者,當發現還有攻擊者能夠執行上述操作來發起攻擊時,他就決定編寫一個小型應用程式來防止這些攻擊。

開發過程

隨著KEXT(kext檔案是一個Mac OS X核心擴充套件,常見於Hackintosh。它們通常用於裝置驅動程式,運行於系統的核心基底。)的消失,研究人員決定嘗試使用新的Endpoint Security框架。其實必須首先承認,本文的作者不認為自己是開發人員,而且從未真正從事過開發工作,因此可能編寫了拙劣的程式碼,儘管如此,開發人員還是盡最大努力建立了一個可靠的應用程式,以確保可以優化程式碼。

在這種情況下,我非常地依賴於Patrick Wardle開發的程式碼,該程式碼是他的Objective-See工具的開源部分。2018年美國國家安全域性前僱員、Digita Security首席研究官Patrick Wardle在蘋果最新High Sierra作業系統發現一個關鍵的零日漏洞,允許安裝在目標系統中的惡意應用程式虛擬“點選”安全提示,獲得核心訪問許可權並完全控制電腦。實際上,經過一些修改,研究人員重用了他的過程監控庫和來自LuLu的一些程式碼,這對理解如何建立ES(端點安全)代理以及如何將所有內容組合在一起有很大幫助。

另外,研究人員還花了一些時間研究Stephen Davis的Crescendo程式碼庫。儘管它是用Swift編寫的,而我是用Objective-C編寫的Shield但它幫助我瞭解了ES的其他方面,比如與代理通訊,以及如何安裝它,如果我們不把它作為守護程序執行,而是作為系統擴充套件。

經過多次編碼,研究人員對編碼結果已經足夠滿意了,且已經向公眾釋出了。不過研究人員並不有多瞭解了Objective-C、編碼、用Xcode進行專案製作、用Xcode構建應用程式等知識,從研究人員最初將Shield作為ES守護程式執行的最初計劃,到現在它作為系統擴充套件(SE)執行,其中包含主要的應用程式邏輯,這也就是進行保護的地方,在選單欄中有一個幫助程式可以自動執行它的輔助工具,進而通過主要應用程式來控制SE。

目前釋出的版本只是測試版,因為只有研究人員對其進行了測試,儘管過去3個月這個測試版本並沒有遇到任何問題,但仍然只有普通使用者許可權。不過經過多次努力後,研究人員已經成功地通過程式碼注入技術實現了#1和#3,阻止dylib劫持仍然在待開發階段。除此之外,該應用程式還可以防止某些特定的注入。

雖然研究人員嘗試了新增許多註釋,但稍後還會為程式碼建立一個文件,以便其他人更容易參與進來。現在,讓我們看看如何使用這個程式,它能做什麼。

使用方法

這個應用程式沒有一個普通的視窗模式應用程式它只是選單欄。當我們啟動它時,將看到一個新的選單欄圖示,以一個點的形式顯示出來。

Shield——一個防止在macOS上進行程序注入的應用程式

點選它,彈出一些基本控制元件,如下所示。

Shield——一個防止在macOS上進行程序注入的應用程式

在真正進行實操之前,還需要安裝系統擴充套件。當我們點選相關選單項時,就像安裝新的核心擴充套件一樣,需要在安全性和隱私權方面獲得批准。一旦獲得批准,它將被載入,但是到目前為止,我不會自動啟動ES客戶端,因此預設情況下它將停止。

如果要解除安裝代理,則需要點選相關選單選項。請注意它不會刪除應用程式,只會解除安裝SE。為此,我們需要重新啟動macOS,因為在Catalina中,macOS如果不重新啟動就無法完全刪除SE。

安裝SE後,我們可以通過點選“開始”或開啟首選項並切換“開始/停止”來啟動Endpoint Security客戶端。按鈕的狀態是通過SE重新整理的,不過在實操中很少遇到沒有正確執行的情況,但是重新開啟首選項有助於:) bug #1。

Shield——一個防止在macOS上進行程序注入的應用程式

阻止模式意味著,如果它檢測到下一步配置的注入嘗試,它將對其進行阻止。如果環境變數通常在啟動過程時發生,這意味著作為注入目標的過程無法啟動,將被阻止。如果嘗試進行注入,我們將收到一個通知並將其記錄到/ Library / Application Support / Shield / shield.log。如果我們關閉這個選項,我們仍然會收到警報和日誌。

下一個選項是監控Apple二進位制檔案的能力,目前這是不可更改的,平臺二進位制檔案將被忽略。造成這種情況的主要原因是,它們會執行大量的task_for_pid呼叫,僅處理這些操作而沒有任何操作就會增加20%的CPU使用率。現在,這些程序很早就被刪除了,因此我們不會浪費一點CPU使用率。此時,研究人員採用了一個改進邏輯的任務,這樣系統二進位制檔案也可以被監控。我認為目前這還不是一個大問題,因為如前所述,通常平臺二進位制檔案都能很好地抵禦這些攻擊。

接下來,我們就可以啟用或禁用特定的保護。

撰寫本文時,環境變數注入正在監控以下三個變數中的任何一個是否存在:DYLD_INSERT_LIBRARIES、CFNETWORK_LIBRARY_PATH、RAWCAMERA_BUNDLE_PATH和ELECTRON_RUN_AS_NODE。如果其中任何一個出現,應用程式將不會啟動。我發現這可能會給Firefox帶來某些漏洞。

當一個程序想要獲取另一個任務的埠時,則下一個設定用於task_for_pid呼叫。這將阻止除錯,因為偵錯程式將執行此呼叫。因此,如果你需要除錯可能需要臨時關閉該選項。

最後一個特定於Electron應用程式,通常,可以使用——inspect命令列引數在除錯模式下啟動Electron應用程式,然後向其中注入程式碼。至此我們也只是檢查是否存在此引數,如果是,則將阻止該應用程式。

其實有一個選項可以在啟動時自動啟動Shield主應用程式(選單項),這將安裝和解除安裝一個標準的登入項。

要注意的是,由於研發者開發的這個程式還只是一個測試版的程式,因此,其中沒有實現自動執行Endpoint Security客戶端的功能。即使主應用程式在啟動後啟動,你也需要啟動ES客戶端。一旦獲得足夠的使用者反饋,研發者將新增此選項。

所有配置的首選項都儲存在/Library/Application Support/Shield/com.csaba.fitzl.shield.preferences.plist中。