Android本地拒绝服务漏洞

本地拒绝服务漏洞描述

Android系统提供了Activity、Servce、Receiver等组件,不同组件提供Intent机制来协助应用间的交互和通信。当程序在使用intent.getXXXExtra()获取传递数据的时候,没有对异常进行捕获,从而导致攻击者通过Intent发送空数据、异常或者畸形的数据使应用崩溃的目的。

本地拒绝服务详情

空指针异常导致拒绝服务

当获取到test对象的时候,假设test为null,调用equal方法,会抛出NullPointerException异常,导致程序崩溃。

Intent intent = new Intent();
String test = intent.getStringExtra("test");
test.equals("test");

序列化对象解析异常导致拒绝服务

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

比如一段Android代码

Intent i = getIntent();
if (i.getAction().equals("serializable_action"))
{
    i.getSerializableExtra("serializable_key"); //未做异常判断
}

我们人为的传入一个我们自己构造的序列化对象,那么这段代码在getSerializableExtra就会抛出java.lang.NoClassDefFoundError异常,导致程序崩溃。

漏洞修复解决办法

将组件设置为不暴露

这样就算这个组件有问题,攻击者也没有办法从外部启动这个组件,就不会执行到有问题的代码。




捕获异常

建议处理通过Intent.getXXXExtra()获取的数据时进行以下判断,以及用try catch方式进行捕获所有异常,以防止应用出现拒绝服务漏洞: