关于Android bound Service 攻击和防御

来源:互联网 发布:苹果mac系统安装教程 编辑:程序博客网 时间:2024/06/06 01:20

关于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");    }};@Overrideprotected 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@Overridepublic 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