Android App通用型拒绝服务漏洞介绍

Android 本地拒绝服务漏洞

  • 漏洞类型:本地拒绝服务
  • 威胁等级:中
  • 影响版本:Android系统所有版本

漏洞描述

Android系统提供了ActivityServiceBroadcast Receiver等组件,并提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android系统则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用[1]。Android应用本地拒绝服务漏洞源于程序没有对Intent.getXXXExtra()获取的异常或者畸形数据处理时没有进行异常捕获,从而导致攻击者可通过向受害者应用发送此类空数据、异常或者畸形数据来达到使该应用崩溃的目的,简单的说就是攻击者通过intent发送空数据、异常或畸形数据给受害者应用,导致其崩溃。

近期,两位0xr0otXbalien安全研究人员发现了一处通用的本地拒绝服务漏洞。该通用型本地拒绝服务可以造成大面积的app拒绝服务。通用型本地拒绝服务漏洞,主要源于攻击者向Intent中传入其自定义的序列化类对象,当调用组件收到此Extra序列化类对象时,无法找到此序列化类对象的类定义,因此发生类未定义的异常而导致应用崩溃。本地拒绝服务漏洞不仅可以导致安全防护等应用的防护功能被绕过或失效(如杀毒应用、安全卫士、防盗锁屏等),而且也可被竞争方应用利用来攻击,使得自己的应用崩溃,造成不同程度的经济利益损失。

测试方法

1.通用型拒绝服务漏洞

漏洞代码样例:

测试代码:使用了getXXXExtra 形式的函数获取extra数据,如果该类不存在则会抛出异常。

2.空Action异常

漏洞代码样例:

测试代码:使用了getAction获取action名称,使用上述代码形式,getAction的返回值进行判断。

或者使用adb shell am命令:

3.类型强转异常

漏洞代码样例:

获取Intent的数据时,直接进行强制类型转换。

测试代码:

4.数组越界异常

漏洞代码样例:

枚举getIntArrayExtra返回的数据时,没有判断数组的边界,按照理想的数组大小进行了遍历。

测试代码:

Intent localIntent = new Intent(); 
localIntent.setComponent(new ComponentName(packageName, className)); 
ArrayList<Integer> array = new ArrayList<Integer>(); array.add(1); 
localIntent.putIntegerArrayListExtra(key, array); 
startActivity(localIntent);

5.访问不存在组件异常

漏洞代码样例: 
Intent notExist = new Intent(); 
notExist.setComponent(new ComponentName("wechat", "share")); 
startActivity(notExist);

调用了第三方不存在的组件,没有做异常处理。

测试代码:

Intent localIntent = new Intent(); 
localIntent.setComponent(new ComponentName(packageName, className)); 
startActivity(localIntent);

或者

adb shell am start -n packageName/componentName 

解决方案

1.在使用Intent获取Extra数据时增加try catch异常处理,防止抛出异常引发崩溃。

建议使用basecore提供的 com.qiyi.baselib.utils.app.IntentUtils 封装的工具方法。

修复示例:

try{
    String value = intent.getStringExtra("key");
}catch(Exception e){
    // Exception handle
}

2.在使用getAction时对返回值进行null检查后再使用

3.在使用Intent获取ArrayList类的的数据时,检查长度后再做操作

4.在做强制类型转换时,加上try catch,防止有异常数据,导致强制转换抛出异常

修复示例:

5.在调用自身的Activity时要确认已经在Androidmanifest.xml中声明,在调用其他APPactivity时要做冗错处理

6.不必要的导出的组件设置为不导出,防止引起拒绝服务。在AndroidMenifest.xml文件中,将相应组件android:exported属性显示设置为false

漏洞检测工具

使用360的超级漏洞拒绝服务漏洞apk进行检测,下载地址:http://appscan.360.cn/tool/

操作步骤如截图所示:(点击放大后看清晰图片)

打开app--->点击所有应用—>找到爱奇艺app,并点击—>新页面中会出现所有导出的activity、receiver和service,选择不同的类型每条单独进行自测;

弹出爱奇艺已停止运行提示,则说明存在该漏洞。

   

 参考链接:

1、Android APP通用型拒绝服务漏洞分析报告 - 360 核心安全技术博客

2、http://wolfeye.baidu.com/blog/local-dos/

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/121653657