导语:在本文中,我们分析了在官方Mac App Store上发现的“Calendar 2”。有点出人意料的是,它竟然具备秘密地将你的Mac电脑变成一个加密货币挖矿工的能力。
在本文中,我们分析了在官方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:[email protected]
因为逆转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:[email protected]", "--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", ... )
果然存在挖矿程序:xmr-stak!从其命令行参数中,可以清楚地看到它正在为某一个网站[email protected]挖掘monero(XMR)。对xmr-stak谷歌一下,我们发现了Coinsta.sh,它提供了“将你的备用cpu投放到加密货币挖矿”的服务。
在他们的论坛上发布的一篇文章提供了更多关于他们的“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 <NSMutableURLRequest: 0x1018f04e0> { 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:[email protected]", "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电脑不会感染病毒吗?
当他们告诉我们苹果应用商店的应用程序是“安全的”的时候,或许也用有所保留的态度来看待这个问题是比较明智的!