Shield——一個(gè)防止在macOS上進(jìn)行進(jìn)程注入的應(yīng)用程序
最近有開(kāi)發(fā)人員開(kāi)發(fā)了一個(gè)基于Apple的Endpoint Security框架的應(yīng)用程序(該應(yīng)用程序的代碼托管在GitHub上),可以防止macOS上的某些進(jìn)程注入技術(shù)。但由于開(kāi)發(fā)人員至今仍然沒(méi)有獲得生產(chǎn)端點(diǎn)安全性授權(quán),因此無(wú)法發(fā)布已簽名的版本。如果你想使用它,你至少需要獲得開(kāi)發(fā)端點(diǎn)安全授權(quán)。
在過(guò)去的兩年中,研究人員開(kāi)始深入研究macOS安全性問(wèn)題,隨著研究的愈加深入,該研究人員發(fā)現(xiàn)除了內(nèi)存損壞漏洞之外,macOS的首要問(wèn)題是在其他應(yīng)用程序的上下文中運(yùn)行代碼。其原因在于macOS的安全模型(實(shí)際上也包括* OS),每個(gè)應(yīng)用程序都有一個(gè)權(quán)限列表,可授予該應(yīng)用程序各種權(quán)限。如果我們僅使用第三方應(yīng)用程序,則大多數(shù)情況是圍繞沙盒(例如,訪問(wèn)網(wǎng)絡(luò))或在沒(méi)有沙盒的情況下可以做什么,可以訪問(wèn)哪個(gè)隱私(TCC)保護(hù)區(qū)域,例如攝像機(jī),麥克風(fēng),消息等。在TCC的情況下,如果我們不擁有這些權(quán)限,即使我們以root身份運(yùn)行,也無(wú)法訪問(wèn)這些資源或位置。
對(duì)于Apple二進(jìn)制文件,有數(shù)百種不同的Apple私有權(quán)限是第三方應(yīng)用程序無(wú)法擁有的,例如,它們可以控制對(duì)SIP保護(hù)區(qū)域的訪問(wèn)或加載內(nèi)核擴(kuò)展的能力。
要添加到此列表中,XPC跨進(jìn)程通信的基本保護(hù)之一是控制誰(shuí)可以與特定XPC服務(wù)進(jìn)行通信的能力,尤其是在其中一個(gè)進(jìn)程具有特權(quán)的情況下。對(duì)于蘋果公司來(lái)說(shuō),這通常是通過(guò)授權(quán)來(lái)完成的,而對(duì)于第三方而言,這是通過(guò)代碼簽名驗(yàn)證來(lái)完成的。在這兩種情況下,如果我們都可以代表XPC客戶端運(yùn)行代碼,就能夠與特權(quán)XPC服務(wù)進(jìn)行通信。
該列表可以不停地進(jìn)行,鑰匙串有時(shí)還根據(jù)代碼簽名來(lái)控制訪問(wèn)。
這意味著,如果我們可以向應(yīng)用程序中注入代碼,則可以獲得其權(quán)限,這就是為什么過(guò)程注入功能在macOS上受到嚴(yán)格控制的原因。蘋果公司在保護(hù)自己的應(yīng)用程序方面做得很好,盡管有時(shí)他們也會(huì)有疏忽,例如CVE-2019-8805 。
不幸的是,第三方應(yīng)用程序并不是很好。這就導(dǎo)致了大量的XPC漏洞,這些漏洞通常會(huì)允許用戶將其特權(quán)升級(jí)到root。繞過(guò)TCC進(jìn)行攻擊的場(chǎng)景也很常見(jiàn),攻擊者可以在攻擊中訪問(wèn)敏感位置,例如:Microsoft AutoUpdate中的LPE或Zoom程序中的TCC繞過(guò)。
流程注入通??梢詺w結(jié)為以下3種主要情況:
1.通過(guò)環(huán)境變量進(jìn)行dylib注入;
2.dylib劫持或代理;
3.通過(guò)任務(wù)端口注入Shell代碼:如果Electron應(yīng)用程序在macOS上變得非常流行,則可以通過(guò)在調(diào)試模式下運(yùn)行Electron應(yīng)用程序或使用Electron特定的環(huán)境變量來(lái)注入代碼。
巧的是本文的作者也是一位Mac用戶,當(dāng)發(fā)現(xiàn)還有攻擊者能夠執(zhí)行上述操作來(lái)發(fā)起攻擊時(shí),他就決定編寫一個(gè)小型應(yīng)用程序來(lái)防止這些攻擊。
開(kāi)發(fā)過(guò)程
隨著KEXT(kext文件是一個(gè)Mac OS X內(nèi)核擴(kuò)展,常見(jiàn)于Hackintosh。它們通常用于設(shè)備驅(qū)動(dòng)程序,運(yùn)行于系統(tǒng)的核心基底。)的消失,研究人員決定嘗試使用新的Endpoint Security框架。其實(shí)必須首先承認(rèn),本文的作者不認(rèn)為自己是開(kāi)發(fā)人員,而且從未真正從事過(guò)開(kāi)發(fā)工作,因此可能編寫了拙劣的代碼,盡管如此,開(kāi)發(fā)人員還是盡最大努力創(chuàng)建了一個(gè)可靠的應(yīng)用程序,以確??梢詢?yōu)化代碼。
在這種情況下,我非常地依賴于Patrick Wardle開(kāi)發(fā)的代碼,該代碼是他的Objective-See工具的開(kāi)源部分。2018年美國(guó)國(guó)家安全局前雇員、Digita Security首席研究官Patrick Wardle在蘋果最新High Sierra操作系統(tǒng)發(fā)現(xiàn)一個(gè)關(guān)鍵的零日漏洞,允許安裝在目標(biāo)系統(tǒng)中的惡意應(yīng)用程序虛擬“點(diǎn)擊”安全提示,獲得內(nèi)核訪問(wèn)權(quán)限并完全控制電腦。實(shí)際上,經(jīng)過(guò)一些修改,研究人員重用了他的過(guò)程監(jiān)控庫(kù)和來(lái)自LuLu的一些代碼,這對(duì)理解如何創(chuàng)建ES(端點(diǎn)安全)代理以及如何將所有內(nèi)容組合在一起有很大幫助。
另外,研究人員還花了一些時(shí)間研究Stephen Davis的Crescendo代碼庫(kù)。盡管它是用Swift編寫的,而我是用Objective-C編寫的Shield,但它幫助我了解了ES的其他方面,比如與代理通信,以及如何安裝它,如果我們不把它作為守護(hù)進(jìn)程運(yùn)行,而是作為系統(tǒng)擴(kuò)展。
經(jīng)過(guò)多次編碼,研究人員對(duì)編碼結(jié)果已經(jīng)足夠滿意了,且已經(jīng)向公眾發(fā)布了。不過(guò)研究人員并不有多了解了Objective-C、編碼、用Xcode進(jìn)行項(xiàng)目制作、用Xcode構(gòu)建應(yīng)用程序等知識(shí),從研究人員最初將Shield作為ES守護(hù)程序運(yùn)行的最初計(jì)劃,到現(xiàn)在它作為系統(tǒng)擴(kuò)展(SE)運(yùn)行,其中包含主要的應(yīng)用程序邏輯,這也就是進(jìn)行保護(hù)的地方,在菜單欄中有一個(gè)幫助程序可以自動(dòng)運(yùn)行它的輔助工具,進(jìn)而通過(guò)主要應(yīng)用程序來(lái)控制SE。
目前發(fā)布的版本只是測(cè)試版,因?yàn)橹挥醒芯咳藛T對(duì)其進(jìn)行了測(cè)試,盡管過(guò)去3個(gè)月這個(gè)測(cè)試版本并沒(méi)有遇到任何問(wèn)題,但仍然只有普通用戶權(quán)限。不過(guò)經(jīng)過(guò)多次努力后,研究人員已經(jīng)成功地通過(guò)代碼注入技術(shù)實(shí)現(xiàn)了#1和#3,阻止dylib劫持仍然在待開(kāi)發(fā)階段。除此之外,該應(yīng)用程序還可以防止某些特定的注入。
雖然研究人員嘗試了添加許多注釋,但稍后還會(huì)為代碼創(chuàng)建一個(gè)文檔,以便其他人更容易參與進(jìn)來(lái)?,F(xiàn)在,讓我們看看如何使用這個(gè)程序,它能做什么。
使用方法
這個(gè)應(yīng)用程序沒(méi)有一個(gè)普通的窗口模式應(yīng)用程序,它只是菜單欄。當(dāng)我們啟動(dòng)它時(shí),將看到一個(gè)新的菜單欄圖標(biāo),以一個(gè)點(diǎn)的形式顯示出來(lái)。
點(diǎn)擊它,彈出一些基本控件,如下所示。
在真正進(jìn)行實(shí)操之前,還需要安裝系統(tǒng)擴(kuò)展。當(dāng)我們點(diǎn)擊相關(guān)菜單項(xiàng)時(shí),就像安裝新的內(nèi)核擴(kuò)展一樣,需要在安全性和隱私權(quán)方面獲得批準(zhǔn)。一旦獲得批準(zhǔn),它將被加載,但是到目前為止,我不會(huì)自動(dòng)啟動(dòng)ES客戶端,因此默認(rèn)情況下它將停止。
如果要卸載代理,則需要點(diǎn)擊相關(guān)菜單選項(xiàng)。請(qǐng)注意,它不會(huì)刪除應(yīng)用程序,只會(huì)卸載SE。為此,我們需要重新啟動(dòng)macOS,因?yàn)樵贑atalina中,macOS如果不重新啟動(dòng)就無(wú)法完全刪除SE。
安裝SE后,我們可以通過(guò)點(diǎn)擊“開(kāi)始”或打開(kāi)首選項(xiàng)并切換“開(kāi)始/停止”來(lái)啟動(dòng)Endpoint Security客戶端。按鈕的狀態(tài)是通過(guò)SE刷新的,不過(guò)在實(shí)操中很少遇到?jīng)]有正確執(zhí)行的情況,但是重新打開(kāi)首選項(xiàng)有助于 :) bug #1。
阻止模式意味著,如果它檢測(cè)到下一步配置的注入嘗試,它將對(duì)其進(jìn)行阻止。如果環(huán)境變量通常在啟動(dòng)過(guò)程時(shí)發(fā)生,這意味著作為注入目標(biāo)的過(guò)程無(wú)法啟動(dòng),將被阻止。如果嘗試進(jìn)行注入,我們將收到一個(gè)通知,并將其記錄到/ Library / Application Support / Shield / shield.log。如果我們關(guān)閉這個(gè)選項(xiàng),我們?nèi)匀粫?huì)收到警報(bào)和日志。
下一個(gè)選項(xiàng)是監(jiān)控Apple二進(jìn)制文件的能力,目前這是不可更改的,平臺(tái)二進(jìn)制文件將被忽略。造成這種情況的主要原因是,它們會(huì)執(zhí)行大量的task_for_pid調(diào)用,僅處理這些操作而沒(méi)有任何操作就會(huì)增加20%的CPU使用率?,F(xiàn)在,這些進(jìn)程很早就被刪除了,因此我們不會(huì)浪費(fèi)一點(diǎn)CPU使用率。此時(shí),研究人員采用了一個(gè)改進(jìn)邏輯的任務(wù),這樣系統(tǒng)二進(jìn)制文件也可以被監(jiān)控。我認(rèn)為目前這還不是一個(gè)大問(wèn)題,因?yàn)槿缜八觯ǔF脚_(tái)二進(jìn)制文件都能很好地抵御這些攻擊。
接下來(lái),我們就可以啟用或禁用特定的保護(hù)。
撰寫本文時(shí),環(huán)境變量注入正在監(jiān)控以下三個(gè)變量中的任何一個(gè)是否存在:DYLD_INSERT_LIBRARIES、CFNETWORK_LIBRARY_PATH、RAWCAMERA_BUNDLE_PATH和ELECTRON_RUN_AS_NODE。如果其中任何一個(gè)出現(xiàn),應(yīng)用程序?qū)⒉粫?huì)啟動(dòng)。我發(fā)現(xiàn)這可能會(huì)給Firefox帶來(lái)某些漏洞。
當(dāng)一個(gè)進(jìn)程想要獲取另一個(gè)任務(wù)的端口時(shí),則下一個(gè)設(shè)置用于task_for_pid調(diào)用。這將阻止調(diào)試,因?yàn)檎{(diào)試器將執(zhí)行此調(diào)用。因此,如果你需要調(diào)試,可能需要臨時(shí)關(guān)閉該選項(xiàng)。
最后一個(gè)特定于Electron應(yīng)用程序,通常,可以使用——inspect命令行參數(shù)在調(diào)試模式下啟動(dòng)Electron應(yīng)用程序,然后向其中注入代碼。至此我們也只是檢查是否存在此參數(shù),如果是,則將阻止該應(yīng)用程序。
其實(shí)有一個(gè)選項(xiàng)可以在啟動(dòng)時(shí)自動(dòng)啟動(dòng)Shield主應(yīng)用程序(菜單項(xiàng)),這將安裝和卸載一個(gè)標(biāo)準(zhǔn)的登錄項(xiàng)。
要注意的是,由于研發(fā)者開(kāi)發(fā)的這個(gè)程序還只是一個(gè)測(cè)試版的程序,因此,其中沒(méi)有實(shí)現(xiàn)自動(dòng)運(yùn)行Endpoint Security客戶端的功能。即使主應(yīng)用程序在啟動(dòng)后啟動(dòng),你也需要啟動(dòng)ES客戶端。一旦獲得足夠的用戶反饋,研發(fā)者將添加此選項(xiàng)。
所有配置的首選項(xiàng)都保存在/Library/Application Support/Shield/com.csaba.fitzl.shield.preferences.plist中。
本文翻譯自:https://theevilbit.github.io/shield/如若轉(zhuǎn)載,請(qǐng)注明原文地址: