2 月 19 日, IBM XForce 研究者发布了一篇报告 [1] ,是关于 2015 年 12 月份公布出来的恶意软件 GM Bot 的源代码。 GM Bot 是一款很繁杂的安卓恶意软件家族, 2014 年年末出现在俄罗斯的地下犯罪网络中。 IBM 声称,最近发现的好几款安卓恶意软件家族实际上都是 GM Bot 的变异体。其中包括 Bankosy[2], MazarBot[3], 还有最近 FireEye 描述的 SlemBunk 恶意软件。
安全厂商可能对恶意软件的变体有不同的定义。恶意软件变体指的是和原来恶意软件的代码几乎相同或者有一些不同,但是这些从代码是看只有轻微的差别,但实际上差别的非常大。
通过 IBM 的报告,我们比较了 GM Bot 样本和 SlemBunk 。基于这两个恶意软件家族的反汇编,我们认为 GM Bot 和 SlemBunk 有足够的代码相似性,他们很可能有共同的起源。有趣的是,我们的研究表明实际上有一个更早的恶意软件家族,名字叫 SimpleLocker ——这是第一个已知的文件加密的安卓恶意软件 [6] ——这和一些银行木马家族很相似。
我们的分析表明,有四个 GM Bot 样本都共同引用了 SlemBunk 的主要组件。图 1 是我们早期的报告,是 SlemBunk 的主要组件的代码部分,对应的类名如下:
1. 服务 启动器 ( ServiceStarter ): 该服务 是一个接收器, 当 一个应用或者设备启动的时候, 该服务 就会 在 后台 启动 监控 服务 MainService 。
2. 主服务 ( MainService ) : 该 服务 在 后台运行, 可以 监控设备 上 所有 正在运行 的进程。它会 像 正常的app提醒那样通过 覆盖视图 提醒用户 。 同时 , 这个监控服务会和远程主机进行通信,会发送设备的初始数据 、 设备的状态信息 以及应用程序首选项。
3. 信息接收器(Message Receiver) : 是一个安卓的信息接收器,可以 处理 输入的文本信息。 一方面提供 拦截 银行 的身份认证信息 的 功能 ,另一方面 作为 客户端 执行远程主机的 控制 命令 。
4. 请求 管理权限(MyDeviceAdminReceiver ) : 当 app第一次运行的时候,该服务会向系统请求管理员权限,成功后,该app就更难从系统中移除。
5. 自动以 UI 界面 ( Customized UI views ) : 可以 自定义 用户登录 界面,可用于模拟 一个 假的银行 应用程序 登录界面或者社交网络登录界面,用于银行钓鱼或者 盗取社交账号。
图 1 SlemBunk 恶意软件家庭的主要组件
前面 三个 GM Bot 样本和提到 的 SlemBunk 样本具有相同 的包名称。 此外 , GM Bot 的 样本 具有的 这 5 个组件 和图 1 中 的 SlemBunk 样本具有相同的组件名 。
第四个 GM Bot 样本具有不同的初始 包 名 , 但是,在运行起来后 解压 出真正的 payload , 发现,解压后的 payload 其实和 SlemBunk 样本是一样的 ,同样也有一些 改变的地方: MessageReceiver 变成了 buziabuzia , MyDeviceAdminReceiver 变成了 MDRA 。
图 2 GM Bot 和 SlemBunk 之间 的代码结构比较
图 2 展示 了 GM Bot 样本 和 SlemBunk 样本之间 代码结构 的相似性( 其中 SHA256 9425fca578661392f3b12e1f1d83b8307bfb94340ae797c2f121d365852a775e 和 SHA256 e072a7a8d8e5a562342121408493937ecdedf6f357b1687e6da257f40d0c6b27 分别是 GM Bot 和 SlemBunk )。通过 这幅图,我们可以 知道我们 以前 的 文章中 [ 4 ] 讨论到的 5 个 重要组件也同样存在于 GM Bot 样本中。 其他 常见的类包括:
1. Main , 两 中 样本的启动 。
2. MyApplication ,应用程序的类,比任何其他都早启动
3. SDCardServiceStarter , 另一个 接收器,可以监控MainService的状态,并且 如果MainService 死了,可以重启它 。
在 上面提到的所有组件和类当中,最关键的是 MainService 。 A pp 启动的时候 它 通过 Main 类 启动, 并且在 保持 在后台运行并且实时监控正在运行的进程 。 当 检测 到 有 可以攻击的 app 运行的时候( e.g . 一些 银行的移动应用程序) 就会用 模拟的登录界面覆盖 真实 的登录页面,进行钓鱼。为了 保证 MainService 持续运行,恶意软件的作者增加了两个 启动器 ——ServiceStarter 和 SDCardServiceStarter , 用于检测 软件 的运行状态,防止特殊的系统时间发生。 GM Bot 和 SlemBunk 有相同的代码结构。 如 图 3 所示 ,我们可以看到 SDCardServiceStarter 类 的主要代码 ,以及 GM Bot 和 SlemBunk 是 如何通过 同一种 机制运行 MainService 。
图3 GM Bot 和 SlemBot中的SDCardServiceStarter 类 中的 方法
从 上图可以看出, GM Bot 和 SlemBunk 使用 相同的代码 启动 MainService 。注意,当样本检测到系统的本地位置是在 俄罗斯 的时候, 就会 避免使用 MainService 启动。唯一 不同 的是, GM Bot 样本将会对这些类 、 方法和字段进行重命 名 ,例如: 在 GM Bot 中的静态变量 “MainService;->a” 和 SlemBunk 中的 “ MainService;->isRunning” 实际上 具有相同的作用。恶意软件 的 作者这么做就是为了 混肴视听 ,让他的代码更难以理解,但是 这些 无法 从底层 改变代码架构。
图 4 向我们 展示的是 GM Bot 和 SlemBunk 的核心代码类 MainService ,这表明两种恶意软件具有相同的逻辑 结构 。 安卓 中,但一个服务 启动 时, onCreate 方法就会被调用。 两种 样本中的 onCreate 方法 中 ,都是先把一个静态变量设置成 true 。 在 GM Bot 中,静态 参数 命名 为 “a” , 然而在 Slembu 中命名为 “isRunning” 。然后 ,两个都继续移动到 真实 程序的 正常 设置中 。 注意 ,两个 样本有相同的 设置 “AppPrefs” 。两个 样本 最后步骤做 的任务也都是一样的。 特别是 ,为了检测 是否 有可以 攻击 的 app 在运行, 都 调用了一个线程。如果 有 可攻击的 app , 相应 的覆盖视图将会被加载到 这个 app 的顶部。 在 这 两个 线程中唯一的不同 也 仅仅是名字上的不同。 在 GM Bot 中是 “d” 类 ,在 SlemBunk 中是 “MainService$2” , 功能都是用来做凭证钓鱼。
图4 GM Bot 和 SlemBunk 中 的MainService 类
总之 ,我们 通过 分析二进制代码的相似度 的 结果表明 IBM 的 结论 没错, GM Bot 和 SlemBunk 确实 有 相同的起源。
在我们的研究中,我们注意到一个更早的安卓恶意软件名叫 SimpleLocker 也有着和 SlemBunk 和 GM Bot 相似的代码结构。不同的是, SimpleLocker 要求受害者提供赎金。 SimpleLocker 在安卓设备上运行后,先是扫描设备中特定类型的文件,并且加密这些文件,然后向用户索要赎金之后,才给解密。在 SimpleLocker 之前,也有其他形式的勒索软件可以锁定屏幕,然而, SimpleLocker 被认为是第一款文件加密型的安卓勒索软件。
最早对 SimpleLocker 的报告是在 2014 年由 ESET 公布的 [6] 。然而,在 2014 年 5 月份的时候,在我们的恶意软件库里面发现了一个更早的样本 (SHA256 edff7bb1d351eafbe2b4af1242d11faf7262b87dfc619e977d2af482453b16cb) ,这个程序的编译日期是 2014 年 5 月 20 日。我们用相同的方法将这个 SimpleLocker 样本和其中一个 SlemBunk 样本( SHA256 f3341fc8d7248b3d4e58a3ee87e4e675b5f6fc37f28644a2c6ca9c4d11c92b96 )进行对比。
图5就是两种样本的代码结构对比图。注意,SimpleLocker变体也有主要的组件ServiceStarter 和MainService,而这两个组 件在SlemBunk中也用到。然而,SimpleLocker中的主服务目的不是用于监控app的运行和钓鱼银行登录页面。反而,SimpleLocker的主服务是用于扫描设备中的特定文件,扫到了就调用加密算法对文件进行加密,然后索要赎金。SimpleLocker代码中最大的区别如下图红色框标志的部分:AesCrypt和FileEncryptor。其他的类如下描述的:
1. Main ,样本的 启动
2. SDCardServiceStarter , 另一个接受器,可以监控MainService的状态,同时,如果MainService死掉了,还可以重启它
3. Tor and OnionKit ,私人通信的第三方库
4. TorSender, HttpSender and Utils ,支持类提供CnC通信代码并且收集设备信息
图 5 SimpleLocker 和 SlemBunk 样本的代码结构对比
最后,我们来看看另一个在 2014 年 7 月份发现的 SimpleLocker 样本
(SHA256 304efc1f0b5b8c6c711c03a13d5d8b90755cec00cac1218a7a4a22b091ffb30b) ,大约是发现第一个 SimpleLocker 样本后 2 个月。这个新的样本并没有用 Tor 作为私密通信,但是,他和 SlemBunk 样本
(SHA256: f3341fc8d7248b3d4e58a3ee87e4e675b5f6fc37f28644a2c6ca9c4d11c92b96) 由着四个相同的主要组件。图 6 向我们展示了两种样本的代码结构对比。
图 6 SimpleLocker 和 SlemBunk 变体的代码结构对比
正如图 6 所示,新的 SimpleLocker 样本使用了和 SlemBunk 相似的包结构,都是把 HttpSender 和 Utils 封装进“ utils ”包。它也添加了其他两个 SlemBunk 中的主要组件: MessageReceiver 和 MyDeviceAdminReceiver 。总的来说, SimpleLocker 和 SlemBunk 有四个主要的组件相似。
图 7 是之前样本的 MessageReceiver 的主要代码,这表明 SimpleLocker 和 SlemBunk 使用的是基本相同的流程,并且,使用相同的逻辑结构进行 CnC 通信。首先, MessageReceiver 类本身用来处理传入的短信,这将会触发 onReceive 函数。如下图所示,他们的逻辑结构基本上是相似的。他们都是先读取应用程序的 key 值。注意两个软件的 key 值的名字和 preference 的名字是相同的: key 值是“ CHECKING_NUMBER_DONE ”并且 preference 值是 “ AppPrefs ”。
接下来的步骤就是调用 retrieveMessage 方法来检索短信息。在这里,唯一一个不同点是 SimpleLocker 多了一个额外的名叫 processControlCommand 的控制流。
SmsProcessor 类定义了恶意软件提供的 CnC 指令。我们来看下 SmsProcessor 类,我就发现,越来越多的证据指向 SimpleLocker 和 SlemBunk 有共同的起源。首先, SimpleLocker 提供的 CnC 指令实际上是 SimpleLocker 提供的一个子集。在 SimpleLocker 中, CnC 指令包括 “intercept_sms_start”, ”intercept_sms_stop”, ”control_number” 和 “send_sms” ,这些指令在 SlemBunk 样本中也有提供。甚至, SimpleLocker 和 SlemBunk 的 CnC 指令都有一个常见的前缀“ # ”。这也表明两种软件由着相同的起源。
图 7 SimpleLocker 和 SlemBunk 的 MessageReceiver 类
MyDeviceAdminReceiver类的任务是请求所在设备的管理员权限,这可以让恶意软件难以被清除,当然这方面两种软件也是高度的相似。
在这一段中,我们可以看到 SimpleLocker 和 SlemBunk 中 5 个主要组件中有 4 个是一样的,并且提供相同的支持工具。唯一的区别在于他们的勒索方式, SlemBunk 提供了银行认证钓鱼,而 SimpleLocker 是通过加密文件索要赎金。这让我们更加有理由相信这两种恶意软件起源于相同的代码库。
我们的分析证明有还几款安恶意软件都有共同的起源,并且,已知的第一款文件安卓加密勒索软件—— SimpleLocker ——是以一些银行木马程序的代码修改而成。进一步研究就能发现其他相关的恶意软件。
地下网络犯罪中有很多个人开发者已经开始定制化写恶意软件。不管为了特殊目的还是普通的目的写出来的恶意软件,都可以共享一些基础的功能,例如:获取管理员权限,开启和重启服务, CnC 通信。这些可以从 GM Bot 和 SimpleLocker 的对比中看出来。
随着 GM Bot 源代码的泄漏,基于该代码定制的安卓恶意软件家族也必然增加。
*参考来源: fireeye.com ,FB小编老王隔壁的白帽子翻译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)