簡介
2月19日,IBM XForce研究者發(fā)布了一篇報告[1],是關(guān)于2015年12月份公布出來的惡意軟件GM Bot的源代碼。GM Bot是一款很繁雜的安卓惡意軟件家族,2014年年末出現(xiàn)在俄羅斯的地下犯罪網(wǎng)絡(luò)中。IBM聲稱,最近發(fā)現(xiàn)的好幾款安卓惡意軟件家族實際上都是GM Bot的變異體。其中包括Bankosy[2], MazarBot[3], 還有最近FireEye描述的SlemBunk惡意軟件。
安全廠商可能對惡意軟件的變體有不同的定義。惡意軟件變體指的是和原來惡意軟件的代碼幾乎相同或者有一些不同,但是這些從代碼是看只有輕微的差別,但實際上差別的非常大。
通過IBM的報告,我們比較了GM Bot樣本和SlemBunk。基于這兩個惡意軟件家族的反匯編,我們認為GM Bot和SlemBunk有足夠的代碼相似性,他們很可能有共同的起源。有趣的是,我們的研究表明實際上有一個更早的惡意軟件家族,名字叫SimpleLocker——這是第一個已知的文件加密的安卓惡意軟件[6] ——這和一些銀行木馬家族很相似。
GM Bot 和SlemBunk
我們的分析表明,有四個GM Bot樣本都共同引用了SlemBunk的主要組件。圖1是我們早期的報告,是SlemBunk的主要組件的代碼部分,對應(yīng)的類名如下:
1. 服務(wù)啟動器(ServiceStarter): 該服務(wù)是一個接收器,當一個應(yīng)用或者設(shè)備啟動的時候,該服務(wù)就會在后臺啟動監(jiān)控服務(wù)MainService。
2. 主服務(wù)(MainService): 該服務(wù)在后臺運行,可以監(jiān)控設(shè)備上所有正在運行的進程。它會像正常的app提醒那樣通過覆蓋視圖提醒用戶。同時,這個監(jiān)控服務(wù)會和遠程主機進行通信,會發(fā)送設(shè)備的初始數(shù)據(jù)、設(shè)備的狀態(tài)信息以及應(yīng)用程序首選項。
3. 信息接收器(MessageReceiver): 是一個安卓的信息接收器,可以處理輸入的文本信息。一方面提供攔截銀行的身份認證信息的功能,另一方面作為客戶端執(zhí)行遠程主機的控制命令。
4. 請求管理權(quán)限(MyDeviceAdminReceiver): 當app第一次運行的時候,該服務(wù)會向系統(tǒng)請求管理員權(quán)限,成功后,該app就更難從系統(tǒng)中移除。
5. 自動以UI界面(Customized UI views): 可以自定義用戶登錄界面,可用于模擬一個假的銀行應(yīng)用程序登錄界面或者社交網(wǎng)絡(luò)登錄界面,用于銀行釣魚或者盜取社交賬號。
圖1 SlemBunk惡意軟件家庭的主要組件
前面三個GM Bot樣本和提到的SlemBunk樣本具有相同的包名稱。此外,GM Bot的樣本具有的這5個組件和圖1中的SlemBunk樣本具有相同的組件名。
第四個GM Bot樣本具有不同的初始包名,但是,在運行起來后解壓出真正的payload,發(fā)現(xiàn),解壓后的payload其實和SlemBunk樣本是一樣的,同樣也有一些改變的地方:MessageReceiver變成了buziabuzia,MyDeviceAdminReceiver變成了MDRA。
圖2 GM Bot和SlemBunk之間的代碼結(jié)構(gòu)比較
圖2展示了GM Bot樣本和SlemBunk樣本之間代碼結(jié)構(gòu)的相似性(其中SHA256 9425fca578661392f3b12e1f1d83b8307bfb94340ae797c2f121d365852a775e和SHA256 e072a7a8d8e5a562342121408493937ecdedf6f357b1687e6da257f40d0c6b27分別是GM Bot和SlemBunk)。通過這幅圖,我們可以知道我們以前的文章中[4]討論到的5個重要組件也同樣存在于GM Bot樣本中。其他常見的類包括:
1. Main,兩中樣本的啟動。
2. MyApplication,應(yīng)用程序的類,比任何其他都早啟動
3. SDCardServiceStarter,另一個接收器,可以監(jiān)控MainService的狀態(tài),并且如果MainService死了,可以重啟它。
在上面提到的所有組件和類當中,最關(guān)鍵的是MainService。App啟動的時候它通過Main類啟動,并且在保持在后臺運行并且實時監(jiān)控正在運行的進程。當檢測到有可以攻擊的app運行的時候(e.g. 一些銀行的移動應(yīng)用程序)就會用模擬的登錄界面覆蓋真實的登錄頁面,進行釣魚。為了保證MainService持續(xù)運行,惡意軟件的作者增加了兩個啟動器——ServiceStarter和SDCardServiceStarter,用于檢測軟件的運行狀態(tài),防止特殊的系統(tǒng)時間發(fā)生。GM Bot和SlemBunk有相同的代碼結(jié)構(gòu)。如圖3所示,我們可以看到SDCardServiceStarter類的主要代碼,以及GM Bot和SlemBunk是如何通過同一種機制運行MainService。
圖3 GM Bot和SlemBot中的SDCardServiceStarter類中的方法
從上圖可以看出,GM Bot和SlemBunk使用相同的代碼啟動MainService。注意,當樣本檢測到系統(tǒng)的本地位置是在俄羅斯的時候,就會避免使用MainService啟動。唯一不同的是,GM Bot樣本將會對這些類、方法和字段進行重命名,例如:在GM Bot中的靜態(tài)變量“MainService;->a”和SlemBunk中的“MainService;->isRunning”實際上具有相同的作用。惡意軟件的作者這么做就是為了混肴視聽,讓他的代碼更難以理解,但是這些無法從底層改變代碼架構(gòu)。
圖4向我們展示的是GM Bot和SlemBunk的核心代碼類MainService,這表明兩種惡意軟件具有相同的邏輯結(jié)構(gòu)。安卓中,但一個服務(wù)啟動時,onCreate方法就會被調(diào)用。兩種樣本中的onCreate方法中,都是先把一個靜態(tài)變量設(shè)置成true。在GM Bot中,靜態(tài)參數(shù)命名為“a”,然而在Slembu中命名為“isRunning”。然后,兩個都繼續(xù)移動到真實程序的正常設(shè)置中。注意,兩個樣本有相同的設(shè)置“AppPrefs”。兩個樣本最后步驟做的任務(wù)也都是一樣的。特別是,為了檢測是否有可以攻擊的app在運行,都調(diào)用了一個線程。如果有可攻擊的app,相應(yīng)的覆蓋視圖將會被加載到這個app的頂部。在這兩個線程中唯一的不同也僅僅是名字上的不同。在GM Bot中是“d”類,在SlemBunk中是“MainService$2”,功能都是用來做憑證釣魚。
圖4 GM Bot和SlemBunk中的MainService類
總之,我們通過分析二進制代碼的相似度的結(jié)果表明IBM的結(jié)論沒錯,GM Bot和SlemBunk確實有相同的起源。
SimpleLocker 和 SlemBunk
在我們的研究中,我們注意到一個更早的安卓惡意軟件名叫SimpleLocker也有著和SlemBunk和GM Bot相似的代碼結(jié)構(gòu)。不同的是,SimpleLocker要求受害者提供贖金。SimpleLocker在安卓設(shè)備上運行后,先是掃描設(shè)備中特定類型的文件,并且加密這些文件,然后向用戶索要贖金之后,才給解密。在SimpleLocker之前,也有其他形式的勒索軟件可以鎖定屏幕,然而,SimpleLocker被認為是第一款文件加密型的安卓勒索軟件。
最早對SimpleLocker的報告是在2014年由ESET公布的[6]。然而,在2014年5月份的時候,在我們的惡意軟件庫里面發(fā)現(xiàn)了一個更早的樣本(SHA256 edff7bb1d351eafbe2b4af1242d11faf7262b87dfc619e977d2af482453b16cb),這個程序的編譯日期是2014年5月20日。我們用相同的方法將這個SimpleLocker樣本和其中一個SlemBunk樣本(SHA256 f3341fc8d7248b3d4e58a3ee87e4e675b5f6fc37f28644a2c6ca9c4d11c92b96)進行對比。
圖5就是兩種樣本的代碼結(jié)構(gòu)對比圖。注意,SimpleLocker變體也有主要的組件ServiceStarter 和MainService,而這兩個組件在SlemBunk中也用到。然而,SimpleLocker中的主服務(wù)目的不是用于監(jiān)控app的運行和釣魚銀行登錄頁面。反而,SimpleLocker的主服務(wù)是用于掃描設(shè)備中的特定文件,掃到了就調(diào)用加密算法對文件進行加密,然后索要贖金。SimpleLocker代碼中最大的區(qū)別如下圖紅色框標志的部分:AesCrypt和FileEncryptor。其他的類如下描述的:
1. Main,樣本的啟動
2. SDCardServiceStarter,另一個接受器,可以監(jiān)控MainService的狀態(tài),同時,如果MainService死掉了,還可以重啟它
3. Tor and OnionKit,私人通信的第三方庫
4. TorSender, HttpSender and Utils,支持類提供CnC通信代碼并且收集設(shè)備信息
圖5 SimpleLocker和SlemBunk樣本的代碼結(jié)構(gòu)對比
最后,我們來看看另一個在2014年7月份發(fā)現(xiàn)的SimpleLocker樣本
(SHA256 304efc1f0b5b8c6c711c03a13d5d8b90755cec00cac1218a7a4a22b091ffb30b),大約是發(fā)現(xiàn)第一個SimpleLocker樣本后2個月。這個新的樣本并沒有用Tor作為私密通信,但是,他和SlemBunk樣本
(SHA256: f3341fc8d7248b3d4e58a3ee87e4e675b5f6fc37f28644a2c6ca9c4d11c92b96)由著四個相同的主要組件。圖6向我們展示了兩種樣本的代碼結(jié)構(gòu)對比。
圖6 SimpleLocker和SlemBunk變體的代碼結(jié)構(gòu)對比
正如圖6所示,新的SimpleLocker樣本使用了和SlemBunk相似的包結(jié)構(gòu),都是把HttpSender 和Utils封裝進“utils”包。它也添加了其他兩個SlemBunk中的主要組件: MessageReceiver 和MyDeviceAdminReceiver。總的來說,SimpleLocker和SlemBunk有四個主要的組件相似。
圖7是之前樣本的MessageReceiver的主要代碼,這表明SimpleLocker和SlemBunk使用的是基本相同的流程,并且,使用相同的邏輯結(jié)構(gòu)進行CnC通信。首先,MessageReceiver類本身用來處理傳入的短信,這將會觸發(fā)onReceive函數(shù)。如下圖所示,他們的邏輯結(jié)構(gòu)基本上是相似的。他們都是先讀取應(yīng)用程序的key值。注意兩個軟件的key值的名字和preference的名字是相同的:key值是“CHECKING_NUMBER_DONE”并且preference值是 “AppPrefs”。
接下來的步驟就是調(diào)用retrieveMessage 方法來檢索短信息。在這里,唯一一個不同點是SimpleLocker多了一個額外的名叫processControlCommand的控制流。
SmsProcessor類定義了惡意軟件提供的CnC指令。我們來看下SmsProcessor類,我就發(fā)現(xiàn),越來越多的證據(jù)指向SimpleLocker和SlemBunk有共同的起源。首先,SimpleLocker提供的CnC指令實際上是SimpleLocker提供的一個子集。在SimpleLocker中,CnC指令包括“intercept_sms_start”, ”intercept_sms_stop”, ”control_number” 和“send_sms”,這些指令在SlemBunk樣本中也有提供。甚至,SimpleLocker和SlemBunk的CnC指令都有一個常見的前綴“#”。這也表明兩種軟件由著相同的起源。
圖7 SimpleLocker和SlemBunk的MessageReceiver 類
MyDeviceAdminReceiver類的任務(wù)是請求所在設(shè)備的管理員權(quán)限,這可以讓惡意軟件難以被清除,當然這方面兩種軟件也是高度的相似。
在這一段中,我們可以看到SimpleLocker和SlemBunk中5個主要組件中有4個是一樣的,并且提供相同的支持工具。唯一的區(qū)別在于他們的勒索方式,SlemBunk提供了銀行認證釣魚,而SimpleLocker是通過加密文件索要贖金。這讓我們更加有理由相信這兩種惡意軟件起源于相同的代碼庫。
結(jié)論
我們的分析證明有還幾款安惡意軟件都有共同的起源,并且,已知的第一款文件安卓加密勒索軟件——SimpleLocker——是以一些銀行木馬程序的代碼修改而成。進一步研究就能發(fā)現(xiàn)其他相關(guān)的惡意軟件。
地下網(wǎng)絡(luò)犯罪中有很多個人開發(fā)者已經(jīng)開始定制化寫惡意軟件。不管為了特殊目的還是普通的目的寫出來的惡意軟件,都可以共享一些基礎(chǔ)的功能,例如:獲取管理員權(quán)限,開啟和重啟服務(wù),CnC通信。這些可以從GM Bot和SimpleLocker的對比中看出來。
隨著GM Bot源代碼的泄漏,基于該代碼定制的安卓惡意軟件家族也必然增加。