我们发现很多 Mac 用户对自身的安全并不是很重视,针对用户的恶意软件逐渐增多,窃取用户的隐私, 监控用户的日常行为, 恶意推广广告, etc。因此,我们应该提高自身的安全意识, 警钟长鸣。
1前言
小夏是一名普通 Mac 用户,某天,他打算试试思维导图来记录工作学习。
他问同事小芳:“Mac 下有啥好用的思维导图软件?”
小芳:“XMind 呀,很实用的思维导图软件。”
小夏:“那到哪里下载,要钱吗?”
小芳:“哎,你百度 XMind 破解版呀! 不需要花钱的,直接安装!”
小夏:“这么方便!我试试!”
2样本概述
Xmind 是一款实用的思维导图软件,正版官网售价高达99刀, 这个价格当然对普通用户无法承受, 通过搜索,很多站点都提供了破解版下载
对比相同版本号的正版和破解版, hash 如下:
dab95dbad19995aeb88cc5d1bb0a7912 XMind_orig //正版 v3.7.1
我们发现该样本采集了用户的很多隐私信息, 上传到了第三方服务器,采集信息如下图
目的:1、黑产非法售卖用户信息, 泄漏用户隐私
2、广告推广, 获取盈利
3、钓鱼执法, 发送侵权律师函
4、etc
下面我们对该样本详细分析
3基本信息
在 Mac 应用中,OSX 系统下的 Mach-O 是可执行文件格式,程序跑起来解析 Mach-O,然后链接系统的库文件以及第三方动态库。
我们使用 MachOView 进行解析
在可执行文件 Load Commands 字段中记录了程序的加载指令,LC_LOAD_DYLIB 是程序加载的动态库,其中 Name 字段记录了该动态库的路径,通常程序启动会根据该字段加载动态库。这里发现其加载了新增的两个动态库文件 libcJFishPoolHook.dylib、libXMindHook.dylib。除此之外,XMind使用 Java 编写,移植到 Mac 平台,可执行文件也没有什么值得重点分析。
总结一下,主要做了如下事情:
1、程序启动初始化,获取资源文件。
2、加载 .ini 配置文件,得到启动的参数键值对。
3、将参数解析,然后运行加载 Library(Java 打包的动态库).
直接对比正版和破解版的包目录,在包中我们发现了多出来的2个 dylib 文件。
libC.JFishPoolHook.dylib
libXMindHook.dylib
下面对这2个 dylib 进行详细分析。
4dylib分析
对于 Mac/iOS 中使用到的 dylib,可以使用 class-dump 和 hoppper 结合进行反汇编分析。class-dump 又是一款开源解析 MachO 利器,与 MachOView 相似的是,他可按照 MachO 偏移量,找寻符号表( Symbol Table ),从而导出类名和方法名,但是他提供了诸多参数用于导出不同架构的 MachO 链接符号表。使用如下命令导出类名方法名到文件中:
$ class-dump --arch x86_64 libCJFishPoolHook.dylib > header.txt
$ cat header.txt
从导出结果来看,很可疑的是 CJFishPoolHook 类,该类有多达 16 个成员, 写该动态库的程序员非常老实,没有进行任何加密、混淆类名、方法名的操作,因此从字面上也不难猜出其含义为 qq 号、微信号、手机号、邮箱号、操作系统、CPU 类型、内存、MAC 地址、内网 IP、公网 IP、用户名、应用列表、设备 ID,是否上传信息、开启应用和关闭应用的时间。
第二个动态库的类方法较少,很明显能猜出,hook 了程序的函数,修改程序运行逻辑。
主要方法为:
- 1、init 初始化方法
- 2、ExChangeImp,Method Swizzling 动态交换函数指针,用于 hook
- 3、BuyHook
- 4、CheckUpdatesHook
- 5、HelpHook
- 6、TitleHook
- 7、OpenURLHook
- 8、DateMenuItemHook
最后还使用了一个加密方法方法,该方法传入第一个参数(明文),第二个参数 key 用于加密内容。
@interface NSString (AES)
+ (id)AESDecrypt:(id)arg1 password:(id)arg2;
+ (id)AESEncrypt:(id)arg1 password:(id)arg2;
@end
@interface NSString (Number)
- (BOOL)isPureFloat;
- (BOOL)isPureLongLong;
- (BOOL)isPureInt;
@end
5抓包分析
通过上面的简单分析不难猜测, 他把采集的信息发送到服务端了, 通过抓包分析该样本与服务端通信的过程如下:
第一次向服务端发送了 checklocked, 返回值为 0, 说明可以传输设备信息
接下的 data 是用来上传用户信息的。Body 是经过 AES 加密后 base 编码的密文,既然 key 已经有了,可以尝试解开请求密文
通过静态分析我们知道他使用了 AES 加密算法, 而 key 就硬编码在代码中。
结合上述过程,了解到加密算法的第一个参数为 kCCEncrypt,第二个为 kCCAlgorithmAES128,第三个为加密的填充模式 kCCOptionECBMode。 依据此我们写出的 AES 解密方法应该为:
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionECBMode, //ECB Mode keyPtr,kCCKeySizeAES128,iv,[self bytes],dataLength, /* input */buffer,bufferSize, /* output */numBytesEncrypted);
key为:iMdpgSr642Ck:7!@
解开的密文为
下面我们看看该样本是如何获取这些用户隐私的。
6静态分析
用户隐私收集
CJFishPoolHook.dylib 中会获取用户的隐私信息, 其流程如下:
在应用初始化过程中,单例类的 CJFishPoolHook 执行初始化 Init,随后,在 Init 方法中进行初始化成员操作,包含上述的 16 个信息。
在初始化过后,开启捕获用户信息 startCapture。这其中包含获取用户联系方式( getContact ),获取设备信息( getDevice ),判断设备是否需要上传信息( checkLocked ),获取应用 ID( getProduct ),获取设备上的应用列表( getFeature ),获取地理位置( getLocation ),获取启动时间( getHabitStart )。
最后一步,上传所有数据到服务器,并且使用 AES 加密算法加密 httpbody。
恶意收集QQ信息, 电话, 微信号,应用列表
应用从 Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ 目录获取个人 QQ 信息。在该目录下,保存着用户的临时聊天记录,截图等信息。
从/Applications遍历本机安装的应用,形成应用列表。
恶意推广
libCJFishPoolHook.dylib 修改了更新 xmind 的官方网站, 推广其自己的广告站点
进程注入后,使用 Method Swizzling 挂钩 MenuItem、Button 等按钮,使其失效或重定向跳转到其他网站,屏蔽注册、激活检查更新功能。难怪启动应用后发现激活按钮失效,无法进行版本更新,购买激活产品却跳转到另一个网站。
7小结
本次的逆向分析过程清晰,单从网络传输和静态分析上就能了解到该重打包应用运行状态的全部过程。对此公司搜集用户信息的这种行为,不想做过多评价。
主要还是从两个方面进行总结:
对于开发者而言,要了解一些基本的防御手段,注重网络传输安全、存储安全,在开发过程中,尽量不要把 key 明文编码于程序中,哪怕是将二次编码后的 key 放到应用内也好。我们无法得知软件是否会被破解,key 是否会泄露,而一旦暴露出来,则很容易被利用从而解开密文信息。更有甚者,直接使用 base 编码内容、数据位亦或运算编码,这种更容易被分析。同时我们可以混淆加密、反调试等手段增加软件破解的难度。
另一方面,站在用户的角度,下载安装未经验证的软件,是一件很危险的事情,例如著名的 XcodeGhost事件,其实就是开发者安装了非官方验证的开发软件,导致开发的程序带有后门,窃取和上传大量用户信息。
本文所述的只是个人信息安全的一角,但却不能忽视他的存在。就同本文中 libCJFishPoolHook 命名一样,真正的含义是鱼塘,软件使用者是鱼,养在破解者的鱼塘中,等鱼养大了,也该收网了。
过去六年间,Mac 销量越来越高,也意味着苹果用户越来越多。而用户一多,生态圈内的软件产出势必增长, 同时也会出现更多恶意软件浑水摸鱼。
Mac恶意软件发展历史
*本文作者:eleme_sec,转载请注明来自 FreeBuf.COM
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。