文档结构  
翻译进度:已翻译     翻译赏金:20 元 (?)    ¥ 我要打赏

安全公司 Lookout Security Intelligence 的研究人员报告,一个名为 lgexin (个信)的广告 SDK 发现内置后门,允许下载和执行任意代码。在 Google 官方应用商店 Google Play,超过 500 款应用使用了恶意版本的个信广告 SDK。目前尚无法确定所有的这些应用都下载有下载恶意木马的能力,但 lgexin 可以在需要的时候引入这个功能。目前受影响的这些应用的下载量已经超过一亿次。

第 1 段(可获 1.03 积分)

恶意软件作者视图通过向可信的应用商店提交无害的应用程序,然后稍后从远程服务器下载恶意代码以逃避检测,这种方式越来越普遍。个信的做法有一些独特的地方在于应用程序开发者本身不制造恶意功能,而且他们也不被操控,同时也没有意识到恶意软件会在随后执行。相反的,入侵活动是通过一个受控的个信服务器开始的。

使用该 SDK 的软件主要包括:

  • 针对青少年的游戏 (下载次数超过 5000 万到 1 亿)
  • 天气 App (下载次数 100 万到 500 万)
  • 互联网广播应用 ( 50 万到 100 万的下载)
  • 图片应用 (100万到500万下载)
  • 教育、健康、健身、旅游、表情以及视频应用等
第 2 段(可获 1.43 积分)

为了让用户免受这一威胁,我们已经通知 Google 关于个信这个问题,随后使用了该 SDK 的应用被 Play Store 应用商店下线,或者被替换成不含此侵入性功能的更新版本。

背景

通常,移动应用会使用广告 SDK 来简化编码工作,并利用广告网络给客户传送广告内容。和很多广告网络类似,个信的广告服务会收集用户数据,并根据用户的兴趣、职业、收入以及所在的位置来推送有针对性的广告内容。

第 3 段(可获 1.05 积分)

Igexin translated ad copy

个信的广告服务网站

作为常规检查的环节,研究人员开始调查可疑流量流向的 IP 地址和服务器。这种流量本身并没什么不寻常的,许多类型的恶意软件生成的流量因为各种各样的原因是合法的。

我们发现在对一个 REST API (http://sdk[.]open[.]phone[.]igexin.com/api.php) 进行数次请求后,应用开始下载一个很大的加密文件,这个加密文件最终被个信的广告 SDK 所用。

第 4 段(可获 1.19 积分)

这样的流量往往就是恶意软件干的,这是一个干净的应用软件在下载并执行远程接口调用后触发的,这样做的目的是逃避检测。加密文件的下载和调用都是在 com.igexin 命名空间中出现,通过 Android 的 dalvik.system.DexClassLoader (通常用来加从一个 jar 或者 apk 文件中加载类) 调用,这样足以确认恶意软件在隐藏其行为,以便进行更深入的代码执行动作。

上图是之前在 Google Play 上一个受影响的应用实例。Lookout 已经证实,这些应用已经不再使用个信的广告 SDK。

第 5 段(可获 1.2 积分)

用户的个人数据收集行为依赖于应用的权限(这些权限都会在 Google Play 中显示),诸如 Lookout Mobile Endpoint Security 这样的移动安全解决方案和隐私政策会评估应用程序在手机个人数据时是否有合理的目的。例如,用户希望一个社交的位置分享 App 可以访问位置和 Wi-Fi 名称,但对一个赌博软件就不需要这样的信息。而大多数用户都有一个期望,那就是尽量少将信息共享给广告商。

第 6 段(可获 1.18 积分)

应用的开发者有义务披露在应用程序中收集个人信息的隐私政策。开发商还需要负责审核和披露所使用的第三方代码对数据的收集以及隐私政策的使用情况。

可是很多的开发者并没有意识到由于使用了个信的广告 SDK ,导致 SDK 可以从他们用户的设备中获取到个人信息。我们的研究人员需要对应用以及广告 SDK 的行为做深入的分析才能有这一发现。这些恶意功能不仅不明显,而且它是可以通过远程服务器进行操控的。

第 7 段(可获 1.4 积分)

SDK 功能

并非所有版本的个信 SDK 都提供这个恶意的功能。这个恶意软件版本实现了一个插件框架,允许客户端从远程的 REST API 中直接加载任意代码,远程的 API 位于 http://sdk[.]open[.]phone[.]igexin[.]com/api.php.

来自这个远程接口的请求和响应都是使用 JSON 数据格式进行编码。下面是一个来自 API 响应的解码数据,直接引导客户端下载并运行两个加密的 JAR 文件:

Code snippet

该响应信息相关的说明如下:

在从服务器上接收到这个类型的响应后,SDK 会解密下载的文件,解密的密钥由 API 调用所提供,并保存在设备中。然后利用 Android 系统的 dalvik.system.DexClassLoader 进行读取并加载 JAR 文件中的类:

第 8 段(可获 1.75 积分)

Code snippet

所有的插件都会包含一个实现了 com.igexin.push.extension.stub.IPushExtension 接口的类,这个接口定义了一个 boolean init(Context) 方法用来对插件进行初始化。

注意,所有的 API 上的流量都是编码过的(但不是加密),发送和接收都是采用纯文本进行。

插件功能

下载的类中包含的功能都可以在运行时被控制,可以由远程决定在任意时间执行,以及基于任何一种条件来启动。用户和应用的开发者无法预知在做完一个远程 API 请求后设备上会执行什么代码。

第 9 段(可获 1.33 积分)

唯一的限制就是 Android 权限系统中可能存在的限制。也就是说,我们所观察到的来自这些插件做出的最危险的动作就是提取拨号记录。

我们也注意到大量下载的插件会通过其 init 方法注册一个 PhoneStateListener ,只要遵循以下条件即可:

  1. 当内部 SQLite 数据库的一个设置启用时
  2. 应用拥有 "android.permission.READ_PHONE_STATE" 权限

这个 PhoneStateListener 将保存:

  • 呼叫时间
  • 呼叫的号码
  • 呼叫的状态(空闲、响铃以及挂断)
第 10 段(可获 1.2 积分)

Code snippet

这个数据会定期通过 HTTP 请求的内容发到 http://sdk[.]open[.]phone[.]igexin[.]com/api.php 节点。经过编码后的消息内容如下所示:

Code snippet

如果我们使用 Base64 对 BIData 数据进行解码,你会发现通过 PhoneStateListener 收集的数据使用竖线进行格式化的记录:

Code snippet

第四个字段是请求的时间,第六个字段是请求的状态。第五个字段包含了 Base64 编码的和 RC4 加密的手机号码。

第二个字段包含了部分密钥内容用于 XOR 加密(另外一部分是在应用中硬编码的)。

通过这个密钥,我们可以将字符串 s6GYbkAUkOQPwK4P 解密为一个有效的手机号码。

第 11 段(可获 1.45 积分)

文章评论

pauli
:bowtie: