概述
2019年初,Check Point研究人员发现一起在印度攻击安卓用户的恶意软件活动——Agent Smith,其中使用了Janus漏洞。研究人员对样本进行初步分析发现,恶意软件可以隐藏app图标,并声称是Google相关的更新模块。
进一步分析发现该应用是恶意的,并且与2016年4月发现的CopyCat恶意软件有相似之处。通过技术分析,研究人员发现完整的Agent Smith感染可以分为3个主要阶段:
1. Dropper app引诱受害者安装。初始Dropper使用武器化的Feng Shui Bundle作为加密的assets文件。Dropper变种的功能一般是照相工具、游戏或性相关的app。
2. Dropper自动解密并安装core恶意软件apk,apk之后会进行恶意补丁和app更新。Core恶意软件一般伪装成Google Updater, Google Update for U或“com.google.vending”。core恶意软件的图标也是隐藏的。
3. Core恶意软件会提取设备中安装的app列表。如果找到了列表中的app,就从设备上提取目标app的base apk,用恶意广告模块对该恶意apk进行补丁操作,安装apk并用它作为原始app的更新。
该攻击活动主要攻击的目标为印度。与之前的非Google play为中心的攻击活动不同的是,Agent Smith的受害者不仅仅来源于发展中国家和地区,还包括美国、英国和沙特阿拉伯这样的发达国家。
图: Agent Smith攻击流
技术分析
“Agent Smith”是一个模块化的恶意软件,具体来说包含以下模块:
· Loader
· Core
· Boot
· Patch
· AdSDK
· Updater
感染过程的第一步是dropper。Dropper是重打包的合法应用,其中含有一些额外的代码——loader。
Loader的作用非常简单,就是提取和运行Agent Smith的core模块。Core模块会与C2服务器进行通信,接收要扫描的设备中安全的app列表。如果发现了列表中的应用程序,就使用Janus漏洞来注入boot模块到重打包的应用中。受感染应用下次运行时,boot模块就会运行patch模块,该模块会hook 已知的广告SDK的方法。
图1: ‘Agent Smith模块化结构
Loader模块
Loader模块会提取和运行core模块。Core模块是位于APK文件中的,而且是加密并伪装成JPG文件的,前2个字节是JPG文件的header,而数据的剩余部分是用XOR编码的。
图2: “Agent Smith的 jpg文件结构
提取后,loader模块会通过安卓处理大型DEX文件的合法机制将代码代码加入到应用中。
图3: 加载core 恶意代码到应用中
Core模块提取和加载后,loader就会使用反射技术来初始化和启动core模块。
图4: Loader调用初始化方法
Core模块
传播感染是恶意软件的主要功能,而这些功能主要都是在core模块中实现的:
1. 使用Bundle系列漏洞在没有用户知情同意的情况下安装应用
2. 使用Janus漏洞让攻击者用感染的版本来替换任意应用
Core模块会联系C2服务器,尝试获取要搜索的app列表,如果失败,就使用默认app列表:
· lenovo.anyshare.gps
· mxtech.videoplayer.ad
· jio.jioplay.tv
· jio.media.jiobeats
· jiochat.jiochatapp
· jio.join
· good.gamecollection
· opera.mini.native
· startv.hotstar
· meitu.beautyplusme
· domobile.applock
· touchtype.swiftkey
· flipkart.android
· cn.xender
· eterno
· truecaller
对于列表中的每个应用,core模块都会检查安装应用的匹配版本和MD5哈希值,以及是否在用户空间中运行的应用。如果所有条件都满足,Agent Smith就会感染该应用。
Core模块使用Decompile和Binary两种方法之一来感染应用。
Decompile方法是基于“安卓应用是基于Java语言”这个事实的,也就是说可以重新编译。因此,“Agent Smith”反编译了原始应用和恶意payload并将其融合在一起。
图5: core 模块将恶意payload和原始应用互相融合
在反编译原始app时,Agent Smith就可以修改其中的方法,将其中处理广告的方法替换为自己的代码,主要关注的是与‘AdMob’, ‘Facebook’, ‘MoPub’, ‘Unity Ads’通信的方法。
图6: 目标广告网络
图7: 注入方法
在所有必要的修改后,Agent Smith会便宜应用并构建一个含有原始应用代码和恶意payload的DEX文件。
有些情况下,反编译过程可能会失败,因此Agent Smith会尝试另一种方法来感染原始应用——A binary patch。二进制补丁就是提供Agent Smith的boot模块的一个二进制文件。
Payload准备好之后,Agent Smith就会用它来构建另一个APK文件,并利用Janus漏洞:
图8: 新的受感染的APK文件结构
仅仅注入loader代码还不够。因此,Agent Smith使用模块化方法,原始的loader会从资产中提取所有,使用Janus漏洞只能修改原始应用的代码,而不能修改资源。因此,现在需要做的就是替换DEX文件。
为了解决这个问题,Agent Smith找到了一个新的解决方案。DEX文件的系统加载器会完全忽略data section之后的部分,而patch会写入所有的resource。这一动作修改了原始DEX文件的大小,将恶意resource变成DEX文件的一部分,而签名验证过程却会忽略这一部分。
图9: 恶意软件加载恶意resource到DEX文件
在修改了原始应用后,安卓package管理器会认为这是相同证书签名的应用的更新,事实上,执行的是恶意DEX文件。
“Agent Smith”会需要在用户不知情的情况下安装和更新。为了达到这个目的,Agent Smith使用了一系列的1 day漏洞来使任意应用在系统应用中运行活动。
恶意应用会发送一个请求来选择网络账号,这是只有恶意应用到处的认证服务才可以处理的特殊账号。系统服务AccountManagerService会寻找能够处理该请求的应用。在这一过程中,Agent Smith会导出一个服务,并发送可以调用addAccount方法的认证请求。然后,形成该请求来绕过安全检查。
图10: Agent Smith恶意更新的算法
如果这些都失败了,Agent Smith会使用SHAREit或Xender应用的Man-in-the-Disk漏洞。这是一个非常简单的过程,可以用恶意payload来替换SD卡中的更新文件。
图11: ‘Agent Smith’使用man-in-disk来安装恶意更新
Boot 模块
Boot模块相当于另一个loader模块,但是在受感染的应用中执行的。该模块的目的是提取和执行恶意payload——patch模块。受感染的应用的DEX文件中含有payload。需要做的只是获取DEX文件的原始大小,并读取该offset之后的所有内容。
图12: Boot模块
Patch模块提取后,boot模块就会使用loader模块中描述的方法来执行。Boot模块对受感染的应用的入口点还有占位符(placeholder)类。这就可以让boot模块在受感染的应用启动时来执行payload。
图13: Boot模块中的placeholder类
Patch模块
Agent Smith的目标就是运行原始应用中的恶意payload,在不同的方法上用hook。Agent Smith背后的攻击者并不希望软件进行更新来移除所有更新的代码,所以有了patch模块。patch模块的作用就是禁用受感染应用的自动更新,该模块会移除原始应用update目录中的所有文件。Agent Smith使用的另一个方法是设置update的timeout时间,使原始应用进入无限循环的更新检查中。
图14: 禁用受感染app自动更新功能
图15: 修改更新时间设置
广告展示payload
最终的payload是向受害者展示广告。
在注入的payload中,该模块会实现一个方法callActivityOnCreate。受感染的应用创建活动时,该方法就会被调用,并调用Agent Smith代码中的requestAd。Agent Smith会用SDK中的活动来替换原始应用的活动。
如果代码中没有指定受感染的应用,Agent Smith就会在要加载的活动上展示广告。
图16: 融入广告SDK
图17: 用恶意广告SDK活动替换原始APP中的活动
图18: 恶意软件在任意加载的活动上显示广告
Connecting the Dots
通过对恶意软件样本的分析,研究人员对Agent Smith活动的分析更加深入,下面分析以下对C2服务器的分析调查结果。
研究人员首先分析了最长使用的C2域名“a***d.com”, “a***d.net”, “a***d.org”。在多个子域名中,“ad.a***d.org”和“gd.a***d.org”都解析到相同的IP地址中。
该IP地址的一个逆向DNS历史进入研究人员视野中“ads.i***e.com”。在“Agent Smith”攻击活动的不同阶段,dropper模块和core模块使用不同的“a***d”和“i***e”组合的域名来进行恶意活动。
经过分析,研究人员认为“i***e.com”, “h***g.com”的所有者是就是“Agent Smith”攻击活动背后的黑客。
图19: C2基础设施图谱
感染图谱
“Agent Smith”释放器展示了一种非常贪心的感染技巧。它会感染设备上的在app列表中的每个app而不是一部分app。随着时间的推移,该攻击活动会用最新的恶意patch来不断感染、重复感染相同的设备。总计感染次数超过28亿次,约感染2500万不同的设备,平均每个设备有112次感染。
在初始攻击向量中,Agent Smith滥用了9APPs市场,有超过360个不同的释放器变种。为了利益最大化,变种中还有“MinSDK”或“OTA” SDK来进一步用广告恶意软件家族来感染受害者。9Apps中的释放器只要是游戏,其他种类还设计成人娱乐、媒体播放器、照片工具、系统工具等。
图20: 释放期app类型分布
在大量的变种,下载量前5的释放器下载次数超过780万次。
图21: Top 5 most infectious droppers
“Agent Smith”攻击活动主要工具目标是印度用户,占所有受感染人数的59%。与之前常见的非Google play为中心的恶意软件不同,Agent Smith不仅对发展中国家造成影响,对发达国家也有影响。比如,美国感染量为30.3万,沙特阿拉伯 24.5万,澳大利亚 14.1万,英国13.7万。
图22: 感染全球分布热图
印度安卓用户中,受感染的设备品牌分布如下所示:
图23: 受感染设备的品牌分布
大多数受感染的设备运行的Android 5和6的系统,当仍然有大量更新版本安卓设备被成功感染。AOSP在安卓7中引入APK Signature Scheme V2来修复Janus漏洞。为了阻止Janus滥用,app开发者需要用新方案对app进行签名,这样安卓框架安全机制就可以用增强的特征来进行完整性检查。
图25: 受感染安卓版本分布
为了进一步分析Agent Smith的感染图谱,研究人员对受感染最多的10个国家进行了分析
Agent Smith时间轴
Agent Smith攻击活动的最早迹象可以追溯到2016年1月,研究人员按40个月的周期将攻击活动分为3个阶段:
2016年1月 – 2018年5月:
在这一阶段,黑客尝试将9APPs作为其广告恶意软件的传播通道。在这一阶段,恶意软件样本显示出一些典型广告恶意软件的功能,比如权限获取和弹窗。在这一阶段,恶意软件样本没有感染受害者设备上app的能力。
2018年5月 – 2019年4月:
这是Agent Smith的成熟期。从2018年初到5月,Agent Smith开始实验感染设备中的app,使用的工具为Bundle Feng Shui。经过一些升级,Agent Smith活动到达峰值。其释放器家族完成了与Bundle Feng Shui的融合,C2基础设施也转移到了AWS云。从2018年6月到12月攻击活动呈指数级增长,随后到2019年初期,感染量保持稳定。
2019年4月后:
从2019年初开始,新感染速度明显下降。从4月初开始,黑客开始以leechsdk的名字构建针对Agent Smith攻击活动的更新。
图26: “Agent Smith”攻击活动时间轴
总结
虽然Agent Smith背后的攻击者通过广告来进行获利,但是使用了更加具有危害性的方式。因为可以将图标隐藏在启动器下,并劫持设备上现有的app,因此有无尽的可能性来破坏用户的数字甚至物理安全。今天恶意软件只是展示一些广告,明天可能就会窃取一些隐私信息,比如短信甚至银行凭证。
Agent Smith攻击活动也说明了构建安全的安卓生态只有开发者参与是远远不够的。需要系统开发者、设备制造商、app开发者以及用户共同来维护,并且及时修复、分发、采用和安装安全补丁。