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

報告指出的重點有:
現(xiàn)在惡意軟件的啟動方式(Persistence Mechanisms)使用傳統(tǒng)Unix技術(shù)的越來越少,基本沒有了。大部分惡意軟件使用OS X提供的新的啟動機制了。
感染持續(xù)增長,但是惡意軟件的復雜度卻不是太高。
主要的啟動方式有7種。
由于OS X平臺上惡意軟件多樣性不如windows平臺,所有相對的檢測方法就簡單一些,因為需要需要檢查的地方比windows平臺的要少。
0x01 啟動
接下來就來談談這啟動的事,看看是哪7種武器是黑客所喜歡的:

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

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

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

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

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

在這個界面可以添加,刪除登錄項。
這些登錄項的信息都保存在~/Library/Preferences/com.apple.loginitems.plist配置文件中,每一個啟動項對應一個字典,有Alias,Name等,其中Name是NSString類型,其它是Data類型,進行了base64,所以目前可以刪除。(手工添加有文章說可以,在OS X 10.10.x中筆者暫時沒有找到方法)。
另外就是通過程序來添加:
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的方式來實現(xiàn)自啟動的。
第二種方式:
使用login item的程序如果是用了沙盒技術(shù)就會因為權(quán)限問題無法使用***種方式了。必須使用Service Management Framework。要求有兩個程序:一個主程序一個helper程序。helper程序存放在主程序的Contents/Library/LoginItems目錄下。主程序在運行時調(diào)用SMLoginItemSetEnabled()函數(shù)來設(shè)置helper程序為自啟動程序。具體可以參考[link] [link]。
注意:你的主程序必須在Application的目錄下,開機啟動的設(shè)置才會生效,否則會失敗
StartupItems
這是蘋果公司不推薦的啟動方法。但是在現(xiàn)在版本中還沒有失效。
一個Startup Item是一個特殊的文件。可以在系統(tǒng)boot進程中得到執(zhí)行。
創(chuàng)建過程如下:
1,創(chuàng)建目錄
StartupItems存放在以下兩個路徑下:
/System/Library/StartupItems
/Library/StartupItems(默認情況下是不存在的,需要自己手動創(chuàng)建)
2,生成執(zhí)行程序或腳本
程序或腳本必須和目錄名一樣,可執(zhí)行文件需要獲得root權(quán)限。
一般使用shell script,因為其創(chuàng)建和更新更為簡單。
下圖是一個例子:

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

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

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

讀者可以利用此工具來進行一個快速的檢測。
該工具的作者還開發(fā)了一款啟動項動態(tài)監(jiān)控軟件
https://objective-see.com/products/blockblock.html
可以動態(tài)的攔截啟動項的添加。大家不妨試試。
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的開機啟動配置 http://www.tanhao.me/talk/1287.html/
在SandBox沙盒下實現(xiàn)程序的開機啟動 http://www.tanhao.me/pieces/590.html/
蘋果手冊https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html