导语:在本文中,我们分析了在官方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)下载。

1.png

最新消息:向苹果公司报告了这一情况之后,该应用程序已经从Mac App Store中删除!

使用macOS的“App Store”,我们可以安装应用程序(注意:其应用程序包命名为CalendarFree.app)。就像在官方Mac App Store中所有的应用一样,其签名是有效的:

2.png

在该应用程序二进制文件上运行的字符串

(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。

3.png

很明显,尽管苹果公司声称要彻底审查提交给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二进制文件:

4.png

回到我们的VM。看起来像是在挖矿:

5.png

我想知道它到底在做什么,幸运的是“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的空闲周期,在后台执行加密货币的挖掘工作:

6.png

作为允许该应用将你的box变成一个加密货币挖矿工的回报,该应用程序正在开放“免费获得所有高级功能”,这是一笔公平交易吗?也许?但是用户显然“不会”对此引发抗议。

7.png

苹果公司对此会持什么态度?我无法想象他们会对这种行为持满意态度——即使是对应用程序内部的文档。我猜测,即使这并不违反他们严格的Mac App Store“服务条款”,他们也很可能会维护受害Mac用户的利益。但是一切都不确定!

总结

在本文中,我们分析了在官方Mac App Store上发现的“Calendar 2”。有点出人意料的是,它竟然具备秘密地将你的Mac电脑变成一个加密货币挖矿工的能力。

还记得苹果公司强烈暗示Mac电脑不会感染病毒吗?

8.png

当他们告诉我们苹果应用商店的应用程序是“安全的”的时候,或许也用有所保留的态度来看待这个问题是比较明智的!

源链接

Hacking more

...