Joker(又名Bread)恶意软件在几个月时间里,就感染了数百万设备,而且需要手动干预删除,才能最终实现设备对恶意软件的全部清除。
早在7月份的时候,谷歌安全研究人员就发现被Joker感染的问题。据调查,这款恶意软件,早在3月份就开始活跃,截止目前,已经成功感染了将近数百万台的设备。通过分析,Joker是个技术简单却很难防御的恶意软件,所以导致了众多设备的感染,其实Joker早在三年前就首次被发现。
详细分析
研究人员最近在Google Play的样本中检测到了一个恶意软件Joker的新版本,此更新版本利用Github页面和存储库来逃避检测。
自2017年被发现以来,该Joker恶意软件一直困扰着移动用户。2020年1月,Google从PlayStore中删除了1700个受感染的应用程序,在过去的三年中该恶意软件的技术也在不断迭代中。最近,9月,安全公司Zscaler发现了17个样本,这些样本已上传到Google PlayStore。 Joker就是这一系列恶意活动的幕后策划者,从对不知情的用户签名到高级服务,再从窃取短信到手机通讯录,几乎所有的恶意活动Joker都有涉及。
该恶意软件已成为众所周知的持久威胁,因为开发者不断进行一些小的更改以寻求Google防御方面的漏洞。他们之前尝试过的技术包括加密以隐藏字符串不被分析引擎发现,除此之外,开发者还经常对版本进行更新,即上传一个干净版本的应用程序,然后通过更新添加恶意代码。研究人员最近在Google Play的样本中检测到一个新的Joker恶意软件版本,该版本利用Github页面和存储库来逃避检测。安全研究员Tatyana Shishkova还发现并分析了该样本。
研究人员分析过的应用承诺了高清和4K质量的壁纸,并被下载了1000多次。在被举报为恶意软件后,谷歌已将其从PlayStore中删除奇热。
推送Joker恶意软件的墙纸应用程序,目前链接到该应用程序的URL已经失效
有效载荷分析
这个新样本与以前的版本之间最明显的区别是使用Github和Github页面存储其恶意有效载荷。这种技术在任何早期的Joker恶意软件样本中都没有出现过,幸运的是,与该恶意软件连接的Github页面和存储库都已被删除。
以下是它的新存储策略和其他近期技术发展的细节:
1.它将恶意代码注入到新位置,而不是应用程序类或启动程序活动。
2.在最初的版本中,Joker通常使用注入的代码下载其有效载荷。不过此版本首先从远程服务器获得一个json配置字符串,然后解密字段以获得下一阶段命令和控制服务器(C&C)以及下一个有效载荷的入口点函数。
不同的Joker样本中的配置文件不同,研究人员研究的样本有以下json格式的加密字段。
3. 该恶意软件使用Github页面来促进恶意活动,同时避免URL检测。用于获取配置字符串的C&C是hxxps://surasuke7.github.io/retrofit/static/vega-schema.json。Github用户使用名为surasuke7的名称,并将配置隐藏在库更新中,路径是static / vega-schema.json。
4.Github也用于装载有效载荷,第一个有效载荷C&C是hxxps://cdn.jsdelivr.net/gh/surasuke7/vega@gh-pages/releases/v1.5.4/ppk-62.zip(与以前的版本不同,有效载荷着陆页面不是阿里云或亚马逊)。为了给URL提供更多的上下文:jsdelivr是一个帮助加速访问GitHub的快速内容传递网络(CDN),并且URL有一个特定的格式(hxxps://cdn.jsdelivr.net/gh/user/repo@version/file)。
C&C URL显示有效载荷位于surasuke7用户的Vega存储库中,位于gh-pages分支中,文件路径为 releases/v1.5.4/ssp-62.raw。 git提交历史表明,该攻击流已在10月初被使用过了。
5.最新的有效载荷的行为类似于之前的样本,第一个有效载荷将在下载下一个有效载荷之前检查SIM ISO代码。
攻击过程
一旦第二个有效载荷被加载到内存中,感染过程将以静默方式运行,而活动设备上没有任何明显的行为。以下是对过程的描述和说明:
1.恶意有效载荷将调用loadNewJob函数以从C&C获得新的攻击任务,而C&C将决定有效载荷的攻击行为,下图显示了Joker使用共享首选项文件中的deviceID来记录设备是否已被感染。
a. register
此函数用于将受害者的设备注册到C&C服务器,服务器将向该设备发送第一个独步任务。
b. getJob
恶意有效载荷使用此函数来请求新任务。
它们中的任何一个都将根据其Job类返回一个Job对象。json结构应该如下:
最后,它运行该作业并向主处理程序发送一条消息以启动另一个恶意模块,该模块将劫持WebView。
2. Joker通过调用setWebViewClient来设置一个定制的webViewClient对象来劫持WebView。
如上图所示,它主要覆盖onPageFinished,shouldInterceptRequest和ShouldOverrideUrlLoading。
拦截可以通过两种方式完成:中继和黑客攻击。他们每个人都会根据C&C响应(分别对应于relays数组和thks数组)检查URL是否可以中继或入侵。
恶意软件使用以下函数来完成对受害者的攻击:
a. loadUrl
如果一个URL即将加载到WebView中,并且check_hack响应为True,则恶意软件将向私有处理程序发送一条消息。此消息将调用requestPage函数,此函数主要尝试为用户订阅未添加的高级服务。
b. intercept
如上所述,该恶意软件试图通过中继和黑客拦截请求。
中继
这将检查最终的URL是否可以中继,如果可以,该恶意软件将运行中继函数,以将用户重定向到C&C指定的另一个URL。
黑客
这将替换响应正文中的某些项,如果URL无法中继,则在拦截结束时,它将尝试使用以下步骤来攻击URL:
首先,请求必须为GET,并且当前网址应在C&C的thks数组响应中找到;
然后,它执行请求并获得原始响应;
最后,它调用distortContent函数来攻击URL;
c. onPageFinished
这个函数将尝试运行C&C发送的JS代码
3.该恶意软件还试图向受害用户添加订阅付费服务。
加载URL时,恶意软件会检查SIM运营商是否为AIS(泰国的移动运营商)以及URL是否为hxxp://ss1.mobilelife.co.th/wis/wap。如果两个参数都满足,那么它将以静默方式向受感染的用户订阅付费服务。
具体步骤如下:
a.向操作员请求确认码;
b.阅读通知或短信中的确认码;
C.用确认码向操作员发送确认请求;
它在用户不知情的情况下执行所描述的所有步骤
4.该恶意软件可以运行JS代码。
与它覆盖shouldInterceptRequest函数的方式类似,如果一个页面已经完成加载,它也将覆盖onPageFinished以触发JS代码。
它从C&C响应中获取一个Action对象,并检查这些操作是否可以在当前页面上运行。获取Action对象后,它将向主处理程序发送一条消息,该主处理程序随后将运行JS代码。
以下是runJs函数:
这将调用EvaluationJavascript来运行JS代码。
由于它使用JavascriptInterface实现JS桥,因此可以运行JS代码,这些命令是通过C&C发送的。一些可能的命令如下:
1.addComment:向当前网页添加评论;
2. finish:完成网页;
3.sleep:使线程休眠特定的时间:
4.getPin:从通知中读取PIN码;
5. get:发送GET请求;
6. submitForm:通过post请求向C&C提交表单数据;
7.callPhone:当前不受支持;
8.sendSms:发送短信;
9. post:发送一个post请求;
通过进一步的调查,研究人员发现了另外两个与surasuke7.github.io相关的样本,但是它们都不在Google Play上。
乍一看,由于Joker恶意软件样本包含在可正常运行的应用程序中,因此用户可能不会意识到有任何不妥。该应用程序承诺提供墙纸并将其重新打包到应用程序中,这是研究人员之前从Joker恶意软件中已经看到的,如果应用程序没有获取短信的权限,它就需要获得一定的运行权限。它需要android.permission.BIND_NOTIFICATION_LISTENER_SERVICE才能从通知中窃取密码,并从android.permission.READ_PHONE_STATE来获取SIM卡的移动国家/地区代码。
众所周知,Joker仅在带有SIM卡的设备上运行并且仅适用于特定的SIM国家代码。目前发现的这个特定样本似乎仅针对泰国的移动运营商用户。
该样本包含Joker恶意软件的其他长期运行的元素:它使用JS代码运行C&C命令,并且在用户不知情的情况下向用户订阅WAP服务。但这也表明,自2017年以来,Joker仍在不断发展和迭代中。在这种变化中,攻击者似乎正在寻找一种新的有效方法来隐藏恶意软件的有效载荷。 由于Github是一个已知的公共存储库,攻击者可能认为使用它会帮助他们绕过安全检测。另一个值得注意的变化是,恶意软件现在在C&C服务器上隐藏了所有有价值的线索,例如欺诈URL。
IoC