新闻摘要
Lookout安全团队近日发现了个信的广告软件开发工具包(SDK),可以通过下载恶意插件,借助其他合法app对用户实施监控。 目前Google Play上有500多种app使用了个信广告SDK。虽然目前还不敢确认这500多种app都受到了感染,但有一点可以确认,只要个信愿意,随时就可以把它们变为监控软件,目前受影响的app下载量已超过1亿。
监控行为分析
目前许多新出现的恶意软件开发者都会选择通过向官方应用商店提交无害的app来尝试逃避检测,等成功上传之后,然后通过远程服务器下载恶意代码。
不过通过Lookout安全团队地分析,个信广告SDK的开发人员本身并没有进行创建恶意功能的意图,也没有预料到目前会发生恶意有效载荷的执行。目前可以确定,这个恶意有效载荷执行功能来自于由个信控制的服务器。
受影响的app:
针对青少年的游戏app(下载量为5000万至1亿次)
天气app(下载量为100万至500万次)
互联网广播(下载量为50万至100万次)
照片编辑器(下载量为100万至500万次)
除此之外,还有教育,健康和健身,旅游,表情符号,家庭摄像机app等都受到了影响。
目前,Lookout用户已经对此威胁进行了预防,并向Google通报了该威胁。目前, Google以将这些app从商店中删除或将其进行了更新。
恶意执行过程还原
通常,移动app都会使用广告SDK,以便app开发人员轻松利用广告网络宣传自己产品。像许多广告网络一样,个信的广告服务服务非常具有针对性,但要做到这一点,就要收集用户的兴趣,职业,收入和位置数据。
至于Lookout研究人员为什么会发现其中的问题,这还要从他们日常进行的可疑流量调查说起,作为与以前提供恶意软件的某些IP和服务器通信的app的常规审查的一部分。个信SDK本身的流量并未出现异常,因为许多恶意软件由于各种原因会生成合法服务的流量。
在http://sdk[.]open[.]phone[.]igexin.com/api.php(它是一个使用的端点)对REST API进行一系列初始请求后,研究人员观察到一个app下载了大量的加密文件。
这种流量通常是恶意软件在安装最初的合法app后下载并执行代码的结果,目的就是为了避免被检测到。加密的文件下载和com.igexin namespace中的调用会存储到Android的dalvik.system.DexClassLoader(用于从.jar或.apk文件加载类),这就保证了恶意软件的隐藏是多么深入,只有通过有效载荷才能发现隐藏的痕迹。
以前在Google Play上受感染的应用示例,目前已无法使用。
收集个人数据用户依赖于app的权限;移动安全解决方案和隐私政策,安全公司会这些条件来评估app收集的个人数据是否合理。例如,社交app的位置分享肯定是合法的,但如果在其它不需要使用位置信息的应用中使用位置消息,就要进行商榷了。
应用开发者最终负责在应用隐私政策中披露应用收集的所有个人信息。开发人员还负责审查嵌入式第三方代码,并披露隐私政策中所有嵌入式第三方代码的数据收集功能。
但许多app开发人员不知道嵌入个信的广告SDK可能会从客户的设备中泄露个人信息。而发现这一漏洞,就需要对app和广告SDK进行深入分析。否则,该功能不仅难以被发现,而且随时可从远程服务器中被更改。。
SDK功能
其实,并非所有版本的个信广告SDK都提供恶意功能。恶意版本要实现一个插件框架,就必须允许客户端加载任意代码,如针对托管在http://sdk[.]open[.]phone[.]igexin.com/api.php上的REST API端点发送请求得到的响应。
对这个端点的请求和响应都是编码的JSON数据,以下是该API的解码响应,会指示客户端在两个加密的JAR文件中下载并运行代码:
这些响应消息中的相关字段是:
在从服务器接收到响应后,SDK将使用API调用提供的**对文件进行解密,并将其保存在设备上。然后它利用Android的dalvik.system.DexClassLoader和映像来从JAR文件加载指定的类:
所有的插件都包含实现com.igexin.push.extension.stub.IPushExtension界面的一个类,该界面定义了一个boolean init(Context)方法,而该方法则被调用来初始化插件。
要注意的是,所有API流量都被编码(未加密),并以纯文本形式发送和接收。
插件功能下载的类中包含的功能在运行时完全处于远程服务器控制之下,并且可以根据攻击需要随时进行功能更新。远程API请求发出后,用户和app开发人员就无法控制在设备上执行的操作了。
Android权限系统会对运行的内容进行限制,也就是说,研究人员从这些插件中观察到的最严重的行为是通过通信记录得到。
研究人员发现,如满足以下2个条件,则所下载的大量插件都会通过init方法注册一个PhoneStateListener:
1.存储在内部SQLite数据库中的设置将被启用;
2.该app具有“android.permission.READ_PHONE_STATE”权限。
满足以上条件,PhoneStateListener将保存:
1.通话时间
2.电话号码
3.呼叫状态(空闲、响铃、占线)
该数据定期被发送到HTTP请求体中的http://sdk[.]open[.]phone[.]igexin[.]com/api.php端点,消息在解码时将采用以下格式:
如果以Base64解码BIData,就能看到通过PhoneStateListener收集到的数据格式是管道分隔记录:
字段四是呼叫的时间,字段六是呼叫状态,第五个字段包含Base64编码和RC4加密的电话号码。第二个字段包含用于XOR加密的一部分**(另一部分在app中是硬编码的)。
使用该**,研究人员可以将s6GYbkAUkOQPwK4P字符串解密为实际的电话号码。