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

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

缺陷编号:wooyun-2015-0111534

漏洞标题:新浪微博android客户端本地提权

相关厂商:新浪

漏洞作者: 小荷才露尖尖角

提交时间:2015-05-01 18:53

修复时间:2015-07-31 08:08

公开时间:2015-07-31 08:08

漏洞类型:权限提升

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-05-01: 细节已通知厂商并且等待厂商处理中
2015-05-02: 厂商已经确认,细节仅向厂商公开
2015-05-05: 细节向第三方安全合作伙伴开放
2015-06-26: 细节向核心白帽子及相关领域专家公开
2015-07-06: 细节向普通白帽子公开
2015-07-16: 细节向实习白帽子公开
2015-07-31: 细节向公众公开

简要描述:

新浪微博某特性导致本地拒绝服务和权限提升

详细说明:

测试版本:新浪微博android客户端v5.2.80
0x01 简介
新浪微博android客户端实现了一个小型的HTTP Server,在手机本地地址的tcp9527端口监听,向该端口发送特定的HTTP请求时可返回部分敏感信息,启动未导出的Activity,造成拒绝服务,甚至允许本地攻击者获得一个GUI shell,以新浪微博客户端的用户权限执行任意命令。
0x02 漏洞分析
在com.sina.weibo.utils.weibohttpd.PushDaemon中可见新浪微博实现了一个小型的HTTP Server,该Server在原生层实现(加载libweibohttp.so),但HTTP请求解析在com.sina.weibo.utils.weibohttpd.a/b/c三个类中处理。
com.sina.weibo.utils.weibohttpd.a:
对HTTP请求的referer进行检查,并拆分字符串。referer不能匹配以下猥琐字符

weisuo.png


com.sina.weibo.utils.weibohttpd.b:
实现login命令查询,当HTTP请求为

http://127.0.0.1:9527/login?callback=xxx


时返回当前登录用户的信息。
com.sina.weibo.utils.weibohttpd.c:
(1)实现query命令查询,当HTTP请求为

http://127.0.0.1:9527/query?appid=packagename


可返回指定packagename的已安装应用信息,当packagename为com.sina.weibo时返回更为详尽的信息。
(2)实现si命令,发送intent。当HTTP请求为

http://127.0.0.1:9527/si?cmp=<pacakgename>_<componentname>&data=<url scheme>&act=<action name>

时,设置指定的intent,并传入startActivity函数。
见如下代码片段

label_13:
if(v3.hasNext()) {
Object v6 = v3.next();
if("act".equals(v6)) {
v4.setAction(v10.b.get(v6));
}
if("cmp".equals(v6)) {
String[] v9 = v10.b.get(v6).split("_");
if(v9 == null) {
goto label_39;
}
if(v9.length != 2) {
goto label_39;
}
v4.setComponent(new ComponentName(v9[0], v9[1]));
}
label_39:
if("data".equals(v6)) {
v4.setData(Uri.parse(v10.b.get(v6)));
}
if(!"callback".equals(v6)) {
goto label_13;
}
Object v1_1 = v10.b.get(v6);
goto label_13;
}
if((TextUtils.isEmpty(v4.getAction())) && v4.getComponent() == null && v4.getData() == null) {
if(TextUtils.isEmpty(((CharSequence)v1))) {
return "{\"result\":-20000}";
}
return this.a(v1, "{\"result\":-20000}");
}
List v0 = this.a.getPackageManager().queryIntentActivities(v4, 0);
if(v0.size() == 0) {
if(TextUtils.isEmpty(((CharSequence)v1))) {
return "{\"result\":-10000}";
}
return this.a(v1, "{\"result\":-10000}");
}
try {
this.a.startActivity(v4);
}
catch(Exception v11) {
}
v5 = v0.size() == 1 ? "{\"result\":200}" : "{\"result\":-40000}";
if(!TextUtils.isEmpty(((CharSequence)v1))) {
v5 = this.a(v1, v5);
}
return v5;


由于这里的intent主要是传入startActiviy,需要用户干预,危害并不大。但当packagename指定为com.sina.weibo自身,componentname指定为com.sina.weibo的activity时,可以启动新浪微博的任意activity,包括受保护的未导出activity,对安全造成影响。

漏洞证明:

1、查询当前登录用户信息

login_info.png


2、查询已安装应用信息(新浪微博)信息

packageinfo.png


3、启动未导出的Activity
(1)本地拒绝服务
大多数未导出activity启动时由于缺少参数,抛出异常,造成本地拒绝服务。

dos.png


(2)打开短信登录activity(5.2.0版本有效,新版本已删除)

smscodelogin.png


点击attack后进入这个页面

sms.png


该页面允许通过手机号和验证码登录。输入一指定用户的手机号,点击获取验证码后,随便输入验证码点击确认,用burp抓包使用intruder bruteforce,可以对6位验证码进行暴力破解尝试。测试中发现可以尝试1200次,然后服务端ban掉,因此有1200/1000000的暴力破解成功概率。
(3)打开工程模式,获取一个GUI Shell
启动com.sina.weibo.exlibs.NewProjectModeActivityPreLoading,可以得到新浪微博的工程模式设置

engmode.png


eng.png


注意图中的Run: api.weibo.cn,点击后可以得到一个GUI Shell,可以新浪微博用户的权限执行任意命令。

id.png


查看app私有目录下的文件

ls.png


可惜新浪微博一般为root权限运行,否则这就是一个好的root提权漏洞。当然不排除一些第三方ROM将新浪微博集成以高权限用户执行,造成更大的危害。

修复方案:

1、对HTTP请求进行检查,防止通过socket接口查询敏感信息和启动未导出的Activity
2、本地应用通信尽量不要采用socket这种方式,以防滥用。

版权声明:转载请注明来源 小荷才露尖尖角@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-05-02 08:07

厂商回复:

感谢关注新浪安全,安全问题修复中。

最新状态:

暂无