议题分享:一款潜伏了多年的Mac恶意程序,为何迄今仍“逍遥法外”?

今年的 Black Hat USA 2017 美国黑帽大会,准确地说是从7月22日开始,延续到本周周四结束的。和往常一样,前四天进行的是技术培训,后两天就是众所期待的主要会议分享,还有兵器库、Business Hall 之类的内容了。值得一提的是,因为美国和中国存在时差,身处国内的各位关注 Black Hat USA 2017 的时间应在北京时间本周四和周五。针对这两天的大会内容,FreeBuf 会进行相应的报道。

在此之前,我们照例分享一些预先已知的内容,在 Black Hat 现场的同学可以留意。当地时间周三(7月26日)5:05pm – 5:30pm 之间(地址在 Laggon DEFJKL ),前 NSA 分析师,现在是 Synack 公司首席安全研究员的 Patrick Wardle 将会分享议题 《Offensive Malware Analysis: Dissecting OSX/Fruitfly via A Custom C&C Server (主动恶意程序分析:通过一台 C&C 服务器来解剖 OSX/Fruitfly)》。

这里的 Fruitfly 实际上是 macOS 或者说 OS X 平台的一款恶意程序,所以这个议题是相关恶意程序和逆向工程的技术分享。这款恶意程序已知感染的设备量大约是 400 台,而且所用技术其实并不算高超,理论上也很容易检测到。那么 Fruitfly 有什么特别值得一说的呢?

研究人员注册 C&C 服务器

这个议题的主要方向之一是通过自己注册的 C&C 服务器来对这款恶意程序进行剖析。Fruitfly 并不是很新的一款 Mac 恶意程序,而且其存在时间可能长达 10 年之久,即便到目前为止,从 VirusTotal 服务来看,超过一半的反恶意程序引擎都无法将其新变种检测出来。

早在今年 1 月份的时候,Malwarebytes 曾经撰写过一份有关 Fruitfly 的恶意程序报告。Malwarebytes 的研究人员认为,Fruitfly 存在时间至少有 2 年。这份报告挂出后,苹果对 macOS 进行升级后,系统就能自动检测到这款恶意程序了。不过 Wardle 这次发现的是个变种,系统和很多反病毒产品还不能发现。

前 NSA 分析师,现在是 Synack 公司首席安全研究员的 Patrick Wardle 对该恶意程序进行分析后发现,C&C 通讯的主服务器已经不能访问,但有多个备用域名硬编码到了程序中。而且这些备用的 C&C 服务器域名还没有人注册。所以他就注册了一个。不知是何种原因,攻击者自己并没有注册这些域名。

主服务器下线后,理论上感染了 Fruitfly 的用户就不存在原有的威胁了。不过在 Wardle 注册备用域名后,立刻就有 400 个被感染的 Mac 用户开始连接这台服务器。这样一来 Wardle 就能够看到 Fruitfly 受害者的 IP ,他发现有 90% 的受害者都位于美国。

Fruitfly 的恶意行为包括远程控制摄像头、截屏,进行鼠标、键盘操作,执行 shell 命令、结束进程、获取系统的正常运行时间等。实际上 400 台设备感染只是个最小数字,感染 Fruitfly 的人数可能还有很多。Wardle 自己也并不清楚 Fruitfly 具体是如何感染 Mac 设备的,他推测应该不是通过漏洞,可能是吸引受害人点击恶意链接,或者钓鱼邮件等。

这是个并不高明的恶意程序

Wardle 解释说,现在并不清楚 Fruitfly 变种攻击者背后的意图是什么,因为这款恶意程序无法窃取信用卡数据,也没有感染勒索程序之类可以让攻击变现的方式。而且这款恶意程序以家庭用户为主,所以基本可以排除是国家攻击。

“我不知道是否是某个无聊的人,有什么不正当的目的。如果是某个无聊的年轻人想要进行单纯的监视,这其实也挺伤人的。比如他能打开摄像头…”不过实际上也可能是恶意程序作者抛弃了这款恶意程序。不管怎么说,如果有人像 Wardle 一样去注册了硬编码的域名,那么也可以监控那些已经被感染的人。

从国外媒体现有的报道暂时还不清楚 Fruitfly 的具体运作方式。不过我们去查阅了 Malwarebytes 今年 1 月份发布的文章,发现 Fruitfly 的原版程序的确有些有趣且并不 “sophisticated” 的地方。

Fruitfly 的原始版本在面上就只包含 2 个文件,分别是

~/.client

~/Library/LaunchAgents/com.client.client.plist

其中的 .plist 非常简单,是为了保持 .client 始终运行的。.client 以 perl 脚本的形式存在,它会与 C&C 服务器通讯。脚本中还包含一些通过 shell 命令截屏的代码。有趣的是,其中既用到了 Mac 的 “screencapture” 命令,也用上了 Linux 的“xwd”命令。

另外它也负责获取系统的正常运行时间,也就是所谓的 uptime —— 获取命令也是既有 Mac 版,也有 Linux 版。

另外脚本最后还有个 _DATA_ 部分,里面有个 Mach-O 二进制、Perl 脚本和一个 Java 类。脚本释放写入到 /tmp/ 文件夹并执行。Java 类文件将 apple.awt.UIElement 设为 true,也就是说它不会在 Dock 栏显示。

二进制文件对于截屏和摄像头访问比较情有独钟,不过有意思的是其中用上了一些非常古老的系统调用,比如说:

SGGetChannelDeviceList

SGSetChannelDevice

SGSetChannelDeviceInput

SGInitialize

SGSetDataRef

SGNewChannel

QTNewGWorld

SGSetGWorld

SGSetChannelBounds

SGSetChannelUsage

SGSetDataProc

SGStartRecord

SGGetChannelSampleDescription

这可能是 Malwarebytes 和 Wardle 认为这款恶意程序年代久远的一个原因。这些函数其实的确非常古老,可以追溯到前 OS X 的岁月。其中包含的开源 libjpeg 代码上次更新是在1998年。

编写的代码比较古老,其实不能很明确地表示这款恶意程序早在十多年之前就存在。如 Malwarebytes 所说,这可能表明攻击者对 Mac 了解得不够,或者他一直在用比较老的开发指导文档。也可能是攻击者故意用这种较老的系统调用,避免触发现代各种形式的行为检测。

另外 Wardle 事先透露说,Fruitfly 具备“移动鼠标,点击,并与操作系统 UI 元素进行交互”的能力。这个应该是出自于其中的 Java 类能够获取命令执行各种任务,其中就包括了获取屏幕尺寸、鼠标指针位置、改变鼠标位置、模拟鼠标点击、模拟键击。这些可以提供一些简单的远程控制功能。

Malwarebytes 尝试将原版 Fruitfly 在 Linux 设备上运行,发现除了 Mach-O 二进制部分,一切都运行正常。也就是说,这款恶意程序理应有 Linux 版本。此外,VirusTotal 平台发现,有 Windows 可执行文件与同一个 C&C 服务器通讯,也用 1998 年的 libjpeg 库。这些样本早在 2013 年就提交到了 VirusTotal 。

值得一提的是,上面提到的 .plist 启动代理文件创建时间是 2015 年 1 月。但这个时间其实不一定是真实的文件创建时间;不过恶意程序从 C&C 服务器获取的 macsve 文件有个注释提到,这是为 Yosemite ,也就是 Mac OS X 10.10 编写的——这款系统发布于 2014 年10月,这可能意味着 Fruitfly 至少在 Yosemite 系统出现之前就已经存在了。

过半数反恶意程序系统无法检测出 Fruitfly

其实很难想象这么多年过去了,从 VirusTotal 来看,到截稿前为止,57 款主流反恶意程序产品,也只有 25 款能够将 Fruitfly 变种检测出来。Wardle 还提到,Fruitfly 采用比较简单粗暴的方式来达到存在的持久性,相较其它 Mac 恶意程序应该更容易检测出来。

“它采用比较早期,而且并不复杂的技术维持其持久性,许多 Mac 恶意程序都是这么做的:一个隐藏的文件,加一个启动代理。这令其很容易被抓到,要检测和移除也很容易。”

今年 1 月份发现 Fruitfly 变种的时候,Malwarebytes 表示这款恶意程序主要针对生物医疗研究中心 ,研究人员猜测可能因为其目标非常明确,所以能潜伏这么多年时间,但其实没有明确证据表明它以某个特定组织为目标,而这次的新版目标是不明的。

在明天的 Black Hat USA 2017 大会上,Wardle 还会对 Fruitfly 的研究作更为明确的阐述,在 Black Hat 现场且对恶意程序分析感兴趣的同学不要错过。预计 Wardle会从分析这款恶意程序的 dropper 开始,也就是上面提到的 Perl 脚本,随后还会探讨一些 Debug 技术,并对脚本作完全拆解。当然重点还是要谈构建自己的 C&C 服务器来挟持恶意程序,揭露其完整的能力。

此外 Wardle 还会讨论 macOS 工具实现各种事件的监控,比如“mouse sniffer”可本地观察和解码从恶意程序发往系统控制鼠标的命令。虽然这个议题是围绕 Fruitfly 展开的,不过实际上对于其它恶意程序也具有适用性。