关于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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories