我可以: 邀请好友来看>>
ZOL星空(中国) > 技术星空(中国) > 安卓“超级拒绝服务漏洞”分析及自动检测工具
帖子很冷清,卤煮很失落!求安慰
返回列表
签到
手机签到经验翻倍!
快来扫一扫!

安卓“超级拒绝服务漏洞”分析及自动检测工具

38浏览 / 0回复

aidedai34

aidedai34

0
精华
1
帖子

等  级:Lv.1
经  验:0
  • Z金豆: 0

    千万礼品等你来兑哦~快点击这里兑换吧~

  • 城  市:
  • 注  册:2014-06-25
  • 登  录:2015-02-07
发表于 2015-01-07 18:35:19
电梯直达 确定
楼主

作者:360捉虫猎手研究员 0xr0ot & Xbalien

 

“超级拒绝服务漏洞”是360安全研究人员近期发现的一个安卓通用型拒绝服务漏洞,恶意攻击者可能利用此漏洞让手机中的任意应用崩溃无法正常工作,几乎影响目前市面上所有的安卓APP应用。对此360捉虫猎手开发了一个自动化的检测工具,以便开发者自查修复。

 

“超级拒绝服务漏洞”检测工具:http://appscan.360.cn/crashcheck/

 

漏洞分析

 

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

 

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

漏洞应用代码片段:


安卓“超级拒绝服务漏洞”分析及自动检测工具

 

 

 

 

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

 

但后来交流中发现,当传入一个自定义的序列化对象SerializablegetParcelable对象时

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

自定义的序列化类很简单:


安卓“超级拒绝服务漏洞”分析及自动检测工具

 

 

 

 

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

 

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

 

测试app代码片段:


安卓“超级拒绝服务漏洞”分析及自动检测工具

 

 

 

接着我们测试了市面上大量主流应用,涵盖BAT等。发现这种方法可以通杀。我们开始觉得这个是android本身的问题,开始翻源代码。


安卓“超级拒绝服务漏洞”分析及自动检测工具

 

 

 

最后当解析到Serializable对象时,由于加载不到类,抛出异常


安卓“超级拒绝服务漏洞”分析及自动检测工具

 

 

 

 

但是回头想想,谷歌肯定不是认为这是android的漏洞,开发者只要加个try catch 捕获异常就可以了。

 

漏洞修复:

不管是get什么extra,只要是getXXXExtra(),加上try catch捕获异常即可。

 

漏洞检测:

为了方便开发者测试,360捉虫猎手发布了一个自动化的超级拒绝服务漏洞检测工具。下载地址:http://appscan.360.cn/crashcheck/

 

开发者可以通过以下方法进行排查:

1.监控java.lang.RuntimeException的错误日志

adb shell下敲入

adb shell logcat | grep java.lang.RuntimeException

使用我们的检测工具测试各个组件,如果发现如下类型的报错日志,即存在超级拒绝服务漏洞

 java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.qihoo.intentfuzztester.extradata.DataSchema)

2. 一段真实存在漏洞的代码片段

虽然getExtras只接受Int类型数据,但putExtra打入一个序列化对象Serializable,程序仍然会崩溃,原因是getInt在底层仍然会对数据进行unparcel()的预处理,具体参考之前的漏洞分析。


安卓“超级拒绝服务漏洞”分析及自动检测工具

 

 

参考:

http://androidxref.com/4.2.2_r1/xref/frameworks/bbse/core/java/android/os/Parcel.java


高级模式
星空(中国)精选大家都在看24小时热帖7天热帖大家都在问最新回答

针对ZOL星空(中国)您有任何使用问题和建议 您可以 联系星空(中国)管理员查看帮助  或  给我提意见

快捷回复 APP下载 返回列表