Service是android四大组件之一,一个Service是没有界面且能长时间运行于后台的应用组件。其他应用的组件可以启动一个服务运行于后台,即使用户切换到另一个应用也会继续运行。另外,一个组件可以绑定到一个service来进行交互,即使这个交互是进程间通讯也没问题。例如,一个service可能处理网络事物,播放音乐,执行文件I/O,或与一个内容提供者交互,所有这些都在后台进行。Service不是分离开的进程,除非其他特殊情况,他不会运行在自己的进程,而是作为启动运行它的进程的一部分。Service不是线程,这意味着它将在主线程里劳作。
如果一个导出的Service没有做严格的限制,任何应用可以去启动并且绑定到这个Service上,取决于被暴露的功能,这有可能使得一个应用去执行未授权的行为,获取敏感信息或者是污染修改内部应用的状态造成威胁。
当一个service配置了intent-filter默认是被导出的,如果没对调用这个Service进行权限限制或者是没有对调用者的身份进行有效的验证,那么恶意构造的APP都可以对此Service传入恰当的参数进行调用,导致恶意的行为发生比如说调用具有system权限的删除卸载服务删除卸载其他应用。
攻击原理:隐式启动service,当存在同名service,先安装应用的service优先级高。
暴露的Service对外接收Intent,如果构造恶意的消息放到Intent中传输,被调用的Service接收有可能产生安全隐患。
如:指定升级下载的URL地址,可导致任意应用安装!
protected void onHandleIntent(Intent intent){
Intent v0;
String v23;
Serializable pushMsg=intent.getSerializableExtra("PushMsg");
...
AppVersionManager.getInstance(Youku.context).showAPpAgreementDialog();
switch(pushMsg.type){
case 1:{
goto label_53;
}
}
}
label_53:
intent.setFlags(876609536);
intent.setClass(this,UpdateActivity.class);
intent.putExtra("updateurl",pushMsg.updateurl);
intent.putExtra("updateversion",pushMsg.updateversion);
intent.putExtra("updatecontent",pushMsg.updatecontent);
intent.putExtra("updateType",2);
this.startActivity(intent);
return;
Service的拒绝服务主要是来源于Service启动时对接收的Intent等没有做异常情况下的处理,导致的程序崩溃。主要体现的方面如给Service传输未null的intent或者是传输序列化对象导致接收时候的类型转化异常。
修复: 1.改成service exported false 2.删除多余测试代码,验证token