OS X那些事——惡意軟件是如何啟動(dòng)的?
0x00 背景
前幾日,看了一份報(bào)告,是美國(guó)網(wǎng)絡(luò)安全公司bit9發(fā)布的:《2015: The Most Prolific Year for OS X Malware》
報(bào)告主要的內(nèi)容就是說(shuō)說(shuō)2015年OS X平臺(tái)惡意軟件的情況。bit9的研究團(tuán)隊(duì)進(jìn)行了10周的分析研究,分析了1400個(gè)惡意軟件樣本。給出了下面這張圖,可見(jiàn),2015年惡意軟件樣本數(shù)量是前5年惡意樣本數(shù)量之和的5倍。這估計(jì)要亮瞎蘋(píng)果公司的眼。Mac越來(lái)越火。也越來(lái)越不安全了。

報(bào)告指出的重點(diǎn)有:
現(xiàn)在惡意軟件的啟動(dòng)方式(Persistence Mechanisms)使用傳統(tǒng)Unix技術(shù)的越來(lái)越少,基本沒(méi)有了。大部分惡意軟件使用OS X提供的新的啟動(dòng)機(jī)制了。
感染持續(xù)增長(zhǎng),但是惡意軟件的復(fù)雜度卻不是太高。
主要的啟動(dòng)方式有7種。
由于OS X平臺(tái)上惡意軟件多樣性不如windows平臺(tái),所有相對(duì)的檢測(cè)方法就簡(jiǎn)單一些,因?yàn)樾枰枰獧z查的地方比windows平臺(tái)的要少。
0x01 啟動(dòng)
接下來(lái)就來(lái)談?wù)勥@啟動(dòng)的事,看看是哪7種武器是黑客所喜歡的:

如上7種武器你知道幾種(大神就自動(dòng)飄過(guò))。
Launch daemons/agents
其實(shí)這兩種啟動(dòng)方式可以一起介紹。啟動(dòng)方式基本相同,只是有些區(qū)別而已。
這兩種方式都是蘋(píng)果官方提供的標(biāo)準(zhǔn)啟動(dòng)方式。在官方手冊(cè)里面可以查詢到更詳細(xì)的介紹[link]。daemons和agents都是由launchd進(jìn)程負(fù)責(zé)啟動(dòng)的后臺(tái)作業(yè)。launchd是OS X系統(tǒng)用戶態(tài)的***個(gè)進(jìn)程。對(duì)應(yīng)于其他UN*X系統(tǒng)中的init。負(fù)責(zé)直接或者間接的啟動(dòng)系統(tǒng)中的其他進(jìn)程。

從圖中可以看到daemons和agents都是由launchd進(jìn)程啟動(dòng)的。
daemons:守護(hù)程序,后臺(tái)服務(wù),通常與用戶沒(méi)有交互。由系統(tǒng)自動(dòng)啟動(dòng),不管是否有用戶登錄系統(tǒng)。
agent:代理程序,是一類特殊的守護(hù)程序,只有在用戶登錄的時(shí)候才啟動(dòng)??梢院陀脩粲薪换?,還可以有GUI。
創(chuàng)建一個(gè)daemons或agent是非常簡(jiǎn)單的,就是創(chuàng)建一個(gè)普通的二進(jìn)制可執(zhí)行文件。然后將自己的屬性列表文件(.plist)放置到daemons或agent的配置目錄中:
目錄用途
/System/Library/LaunchDaemons系統(tǒng)本身的守護(hù)程序
/Library/LaunchDaemons第三方程序的守護(hù)程序
/System/Library/LaunchAgents系統(tǒng)本身的代理程序
/Library/LaunchAgents第三方程序的代理程序,這個(gè)目錄通常為空
~/Library/LaunchAgents用戶自有的launch代理程序,是有對(duì)應(yīng)的用戶才會(huì)執(zhí)行
plist文件的結(jié)構(gòu)可以查看手冊(cè)[link],下面給出了一個(gè)啟動(dòng)計(jì)算器的plist文件。擁有鍵值為true的RunAtLoad鍵。

將此.plist文件拷貝到/Library/LaunchAgents目錄(拷貝之后的文件擁有者為root),就可以在重啟后,自動(dòng)啟動(dòng)計(jì)算器。
可以使用
1sudo plutil -lint /path/to/com.test.plist
來(lái)檢測(cè)plist文件格式是否有問(wèn)題。
plist中主要的字段和它的含義:
Label 用來(lái)在launchd中的一個(gè)***標(biāo)識(shí),類似于每一個(gè)程序都有一個(gè)identifies一樣。
UserName 指定運(yùn)行啟動(dòng)項(xiàng)的用戶,只有當(dāng)Launchd 作為 root 用戶運(yùn)行時(shí),此項(xiàng)才適用。
GroupName 指定運(yùn)行啟動(dòng)項(xiàng)的組,只有當(dāng)Launchd 作為 root 用戶運(yùn)行時(shí),此項(xiàng)才適用。
KeepAlive 這個(gè)key值是用來(lái)控制可執(zhí)行文件是持續(xù)運(yùn)行呢,還是滿足具體條件之后再啟動(dòng)。默認(rèn)值為false,也就是說(shuō)滿足具體條件之后才啟動(dòng)。當(dāng)設(shè)置值為ture時(shí),表明無(wú)條件的開(kāi)啟可執(zhí)行文件,并使之保持在整個(gè)系統(tǒng)運(yùn)行周期內(nèi)。
RunAtLoad 標(biāo)識(shí)launchd在加載完該項(xiàng)服務(wù)之后立即啟動(dòng)路徑指定的可執(zhí)行文件。默認(rèn)值為false。
Program 這個(gè)值用來(lái)指定進(jìn)程的可執(zhí)行文件的路徑。
ProgramArguments 如果未指定Program時(shí)就必須指定該項(xiàng),包括可執(zhí)行文件文件和運(yùn)行的參數(shù)。
Cron job
Cron job是一個(gè)隨Unix而來(lái)的啟動(dòng)機(jī)制。在OS X中已經(jīng)不被推薦使用。蘋(píng)果公司推薦使用launchd命令來(lái)完成計(jì)劃任務(wù)。但是OS X仍然支持Cron。那黑客們當(dāng)然不會(huì)嫌棄。
Cron可以用來(lái)在設(shè)定的時(shí)刻執(zhí)行一個(gè)命令或是腳本。如果惡意軟件是python編寫(xiě)的,可以直接運(yùn)行python命令。
Cron服務(wù)使用crontab命令來(lái)控制。在目錄/usr/lib/cron/tabs目錄下會(huì)有對(duì)應(yīng)的用戶名的配置文件。當(dāng)然可以直接通過(guò)命令來(lái)進(jìn)行配置。具體的可以查詢手冊(cè)[link]。
crontab可以直接讀取文件作為輸入來(lái)配置:

如圖 用crontab加載文本persist
保存文本內(nèi)容為:
*****open /Applications/Calculator.app
該配置為每分鐘執(zhí)行open命令打開(kāi)計(jì)算器。

上圖為文件格式,多個(gè)任務(wù)可以分多行給出,可以用#進(jìn)行注釋。
還可以使用@reboot等配置來(lái)設(shè)置開(kāi)機(jī)啟動(dòng)。但是本人在OS X 10.10上測(cè)試開(kāi)機(jī)啟動(dòng)計(jì)算器沒(méi)有成功!用時(shí)間間隔來(lái)啟動(dòng)時(shí)可以的。
可以用crontab參數(shù)
-l 查看當(dāng)前的crontab配置。
-r 移除所有配置
-e 編輯配置
login items
login items是蘋(píng)果公司對(duì)需要開(kāi)機(jī)運(yùn)行的應(yīng)用程序推薦的啟動(dòng)方式。
有兩種使用login item的方式:
使用shard file list。
使用Service Management framework。針對(duì)sandbox性能的程序[link]。
***種方式:
使用***種方式啟動(dòng)的login items在系統(tǒng)偏好設(shè)置->用戶和群組>登錄項(xiàng)里面可以查看并設(shè)置

在這個(gè)界面可以添加,刪除登錄項(xiàng)。
這些登錄項(xiàng)的信息都保存在~/Library/Preferences/com.apple.loginitems.plist配置文件中,每一個(gè)啟動(dòng)項(xiàng)對(duì)應(yīng)一個(gè)字典,有Alias,Name等,其中Name是NSString類型,其它是Data類型,進(jìn)行了base64,所以目前可以刪除。(手工添加有文章說(shuō)可以,在OS X 10.10.x中筆者暫時(shí)沒(méi)有找到方法)。
另外就是通過(guò)程序來(lái)添加:
12345LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); //url為app所在的目錄
CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:appPath];
LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemLast, NULL, NULL, url, NULL, NULL);
CFRelease(item);
CFRelease(loginItems);
有的惡意軟件就是利用代碼添加login item的方式來(lái)實(shí)現(xiàn)自啟動(dòng)的。
第二種方式:
使用login item的程序如果是用了沙盒技術(shù)就會(huì)因?yàn)闄?quán)限問(wèn)題無(wú)法使用***種方式了。必須使用Service Management Framework。要求有兩個(gè)程序:一個(gè)主程序一個(gè)helper程序。helper程序存放在主程序的Contents/Library/LoginItems目錄下。主程序在運(yùn)行時(shí)調(diào)用SMLoginItemSetEnabled()函數(shù)來(lái)設(shè)置helper程序?yàn)樽詥?dòng)程序。具體可以參考[link] [link]。
注意:你的主程序必須在Application的目錄下,開(kāi)機(jī)啟動(dòng)的設(shè)置才會(huì)生效,否則會(huì)失敗
StartupItems
這是蘋(píng)果公司不推薦的啟動(dòng)方法。但是在現(xiàn)在版本中還沒(méi)有失效。
一個(gè)Startup Item是一個(gè)特殊的文件??梢栽谙到y(tǒng)boot進(jìn)程中得到執(zhí)行。
創(chuàng)建過(guò)程如下:
1,創(chuàng)建目錄
StartupItems存放在以下兩個(gè)路徑下:
/System/Library/StartupItems
/Library/StartupItems(默認(rèn)情況下是不存在的,需要自己手動(dòng)創(chuàng)建)
2,生成執(zhí)行程序或腳本
程序或腳本必須和目錄名一樣,可執(zhí)行文件需要獲得root權(quán)限。
一般使用shell script,因?yàn)槠鋭?chuàng)建和更新更為簡(jiǎn)單。
下圖是一個(gè)例子:

開(kāi)機(jī)啟動(dòng)后系統(tǒng)會(huì)自動(dòng)向腳本給出start作為參數(shù)。“$1” 表示傳給該腳本的***個(gè)參數(shù)
StartService(), StopService(), RestartService()
當(dāng)可執(zhí)行文件接收到的參數(shù)為start,stop或者restart時(shí),執(zhí)行相對(duì)應(yīng)的函數(shù)。
3,創(chuàng)建StartupParameters.plist
在目錄中創(chuàng)建該文件StartupParameters.plist是一個(gè)屬性列表。

關(guān)于plist中主要的字段
可以參考:

Binary infection
二進(jìn)制感染實(shí)現(xiàn)駐留。
原理和windows系統(tǒng)下的PE文件感染一樣。修改二進(jìn)制文件獲取執(zhí)行權(quán)限執(zhí)行自己的代碼。
因?yàn)镺S X允許未簽名的二進(jìn)制文件運(yùn)行。所以該方法依然有效。且感染的方式多種多樣。其中最簡(jiǎn)單的就是修改入口點(diǎn)了。通過(guò)修改Mach-O文件的Load Commands。添加新的segment來(lái)實(shí)現(xiàn)代碼的注入感染。
0x02 檢測(cè)
針對(duì)啟動(dòng)項(xiàng)的檢測(cè),bit9的報(bào)告針對(duì)企業(yè)和個(gè)人給出了建議。
這里給大家介紹下針對(duì)個(gè)人Mac的檢測(cè)方法。
除了手動(dòng)針對(duì)啟動(dòng)項(xiàng)的位置進(jìn)行檢測(cè)外,你當(dāng)然還可以用用腳本。不過(guò)推薦一個(gè)不錯(cuò)的工具
https://objective-see.com/products/knockknock.html
該工具自動(dòng)掃描9中啟動(dòng)方式。

讀者可以利用此工具來(lái)進(jìn)行一個(gè)快速的檢測(cè)。
該工具的作者還開(kāi)發(fā)了一款啟動(dòng)項(xiàng)動(dòng)態(tài)監(jiān)控軟件
https://objective-see.com/products/blockblock.html
可以動(dòng)態(tài)的攔截啟動(dòng)項(xiàng)的添加。大家不妨試試。
0x03 參考
2015: The Most Prolific Year for OS X Malware
https://www.bit9.com/resources/research-reports/2015-the-most-prolific-year-for-os-x-malware/
VB2014 paper: Methods of malware persistence on Mac OS Xhttps://www.virusbtn.com/virusbulletin/archive/2014/10/vb201410-malware-persistence-MacOSX
Levin, J. Mac OS X and iOS Internals: To the Apple’s Core. Wrox. 2012
Mac OSX的開(kāi)機(jī)啟動(dòng)配置 http://www.tanhao.me/talk/1287.html/
在SandBox沙盒下實(shí)現(xiàn)程序的開(kāi)機(jī)啟動(dòng) http://www.tanhao.me/pieces/590.html/
蘋(píng)果手冊(cè)https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html