合法的移动应用程序通常会嵌入广告SDK或为其他应用程序打广告,毋庸置疑,展示广告或为其他应用程序打广告可为合法的应用程序提供收益。不过,最近我们观察到移动广告社区的一个令人震惊的趋势,Google Play商店中的一些广告软件程序正在滥用第三方Android插件框架DroidPlugin,这是一个实现动态加载的Android插件框架,可以免安装、免修改的运行第三方APK。
DroidPlugin的原理是利用Android一个进程可以运行多个APK的机制,通 过API欺骗让系统以为只有宿主App存在,同时通过预先占坑来创造插件App的运行环境,最后通过动态代理实现函数hook、Binder代理绕过部分系统服务限制,从而实现应用的组件化。
我们已经发现DroidPlugin的滥用已经让合法的移动应用程序成为了一种广告骚扰软件,目前,我们的研究人员已与Google分享了我们的调查结果,并将所有发现的滥用DroidPlugin的应用程序从Google Play商店中删除。
Android插件技术的“好”和“坏”
Android插件技术最初是由第三方引入,旨在为Android添加额外的增强功能。例如,Twitter应用程序可以使用这些增强的功能来让用户同时在一个手机上运行两个Twitter应用程序。另外,插件技术也可以提高热补丁的修复速度,但插件技术提供的增强功能也可以被用于恶意攻击,恶意软件的开发者一直在滥用合法的插件技术来实施端到端攻击,例如绕过设备上的反恶意软件检测,特别是静态检测来实施网络钓鱼攻击。
我们在以前的研究中就曾发现,恶意软件就滥用过最流行的开源插件框架“DroidPlugin”和“VirtualApp”,这两种框架都可以启动任意的Android应用,从理论上讲,它们不会被安装在手机上,从技术上讲,Android插件技术是一个应用级的虚拟化环境。
就在最近,我们发现了Android插件功能为了软件推广的广告模式提供了一种新的方式。支持插件的应用程序可以自动启动不同的应用程序,而无需安装它们。这为广告宣传提供了一种快捷方式,从而让使用插件的应用程序开发商获得巨大收入,因为开发商可以在没有任何用户交互的情况下,推出广告。
这种模式的广告宣传可能会发生安全风险,因为插件框架的安全机制是比较脆弱的,这些插件框架无法在不同的插件实例之间分隔权限和隔离数据。因此,当通过插件框架执行升级后的应用程序时,它具有与主机应用程序(通常是所有Android权限)相同的权限,并且可以访问主机应用程序或其他插件应用程序的数据。这明显与Android应用程序沙盒机制不符,
Android沙盒的本质是为了实现不同应用程序和进程之间的互相隔离,即在默认情况 下,应用程序没有权限访问系统资源或其它应用程序的资源。每个应用程序和系统进程都被分配唯一并且固定的User Id,这个User Id与内核层进程的User Id对应。每个应用程序在各自独立的Dalvik虚拟机中运行,拥有独立的地址空间和资源。运行于Dalvik虚拟机中的 进程必须依托内核层Linux进程而存在,因此Android使用Dalvik虚拟机和Linux的文件访问控制来实现沙盒机制,任何应用程序如果想要访 问系统资源或者其它应用程序的资源必须在自己的manifest文件中进行声明权限或者共享User Id。
例如,在Google Play中,我们观察到32个应用程序使用了DroidPlugin框架,21个应用程序使用了VirtualApp框架,其中大多数是PUP(潜在有害的程序)或广告软件,目前,这些应用程序已从Google Play中删除,详细信息请看下表:
下面,我们将演示两个广告软件家族是如何在应用程序中滥用插件技术的。
样本1:自动式和攻击式的广告宣传
在2016年9月,名为“Clean Doctor”(全名为“com.nianclub.cleandoctor”)的应用程序的开发人员在1.2.0版本中让该应用变得更具攻击性,该广告软件滥用了VirtualApp框架。 下图清楚地显示了Clean Doctor 在Google Play的变异时间表:
Clean Doctor与其他广告软件的对比:
为了宣传新的应用程序,广告软件通常会先下载应用程序,然后经常向用户显示应用程序的安装界面。用户安装该应用后,广告软件的开发者便会收到“促销”新应用的回款。Clean Doctor采取了不同的策略来实现推广新应用的目标。
Clean Doctor会从其C2服务器“familysdk[.]com””中获取任务信息,并从云存储服务中隐藏下载许多升级的应用程序。它不要求用户安装这些下载的应用程序,而是以两种不同的方式启动应用程序。
1.单击快捷方式启动:
Clean Doctor会在每个下载的应用程序的设备主屏幕上创建快捷方式(如下图所示)。当用户点击快捷方式时,它会在Clean Doctor的沙盒中启动相应的应用程序作为插件应用程序。对于大多数Android用户来说,点击快捷方式时,很难注意到这种启动与默认启动模式之间的区别。例如,当用户点击游戏“文明帝国”的快捷方式时,该游戏将会直接显示出来,但游戏实际上是作为插件应用启动的,并且在插件虚拟环境中运行。
2.自动启动:
由于所有插件应用程序都受主机应用程序的完全控制,主机应用程序可以控制每个插件应用程序的运行周期。在收到主机的命令时,Clean Doctor可以自动启动广告应用程序作为插件应用程序。
样本2:多个应用程序的广告宣传
在2017年1月底,我们观察到,Google Play中广告软件应用程序“bloodpressure”(全名为“com.blood.pressure.bost”)也通过滥用Android插件技术来对宣传应用程序。此广告软件会自动启动单独的应用来显示广告,并在单个屏幕中推荐多个应用。
Bloodpressure最开始使用的是2.5版的嵌入式VirtualApp框架,但在2017年2月初已被Google Play删除。在删除时,Bloodpressure的安装次数已经到达为10000到50000次。 Bloodpressure在Google Play中的生命周期如下图所示:
Bloodpressure与其他广告软件的对比:
大多数广告SDK使用网络视图组件来展示横幅广告和全屏广告。使用这些SDK构建的应用程序一次只能显示一个广告。而我们发现的Bloodpressure广告软件却完全不是这样的,它可以在单个屏幕上向用户显示许多应用的广告。为了实现这一点,Bloodpressure将自动启动一个插件应用程序,其中许多广告会一起显示(如下图所示)。这种技术并不像那些在没有用户交互的情况下启动推广的应用程序那样有害,但却允许广告软件的开发者有更多机会来安装升级的应用程序。
Bloodpressure的技术原理分析
Bloodpressure的工作流程如下图所示:
具体步骤如下:
1.从远程服务器获取配置:
一旦主机应用启动,它就会通过URL http[:]//qwe.ortpale[.]com/conf/bloodinfo.txt连接到远程服务器,以获取配置文件。有趣的是,HTTP请求头中的User-Agent属性设置为“Ray-Downer”。
2.解码并保存插件应用程序
主机应用程序包括名为“protect.data”的原始资源。这个资源文件实际上是一个编码的插件APK文件。主机应用程序对此文件进行解码并保存。
3.安装插件应用程序
主机应用程序利用VirtualApp框架在其沙盒中安装插件应用程序。
4.启动插件应用程序
安装插件应用程序成功后,主机应用程序可以通过调用VirutalApp的API启动该插件。一旦插件应用程序启动,就可以开始向用户显示广告了。
总结
Android插件技术可以使广告软件开发者以新的方式进行获利。这种滥用插件技术的行为对广告网络以及Android用户都非常危险。我们希望移动开发社区和安全社区能共同合作,以解决Android插件技术中的安全问题。 Android用户也应该明白,在Android插件环境中操作时,他们的插件应用程序及其设备的隐私都处于危险之中。