这里主要涉及到了Activity、Content Provider、Service、Broadcast Receiver等。这些如果在Androidmanifest.xml配置不当,会被其他应用调用,引起风险。 android应用内部的 Activity、 Service、 Broadcast Receiver等,他们通过Intent通信,组件间需要通信就需要在Androidmanifest.xml文件中暴露组件,前面提到的风险就有可能是不恰当的组件暴露引起的。

一、Intent基础知识

Intent启动不同组件的方法如下:

组件名称

方法名称

Activity

startActivity()

startActivityForResult()

Service

startService()

bindService()

Broadcasts

sendBroadcast()

sendOrderedBroadcast()

sendStickyBroadcast()

Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者;


另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收


者是谁,有利于降低发送者和接收者之间的耦合。


显示调用例子:


[java] view plain copy print ?
  1. Intentintent=newIntent();
  2. intent.setClassName("com.samples.intent.simple",
  3. "com.samples.intent.simple.TestActivity");
  4. startActivity(intent);
  5. Intentintent=newIntent(A.activity,B.class);
  6. startActivity(intent);



隐式调用例子


[java] view plain copy print ?
  1. Intentintent=newIntent(Intent.ACTION_DIAL);
  2. startActivity(intent);
  3. Intentintent=newIntent("com.test.broadcast");
  4. intent.putString("PASSWORD","123456");
  5. sendBroadcast(intent);
  6. Intentintent=newIntent("com.test.service");
  7. intent.putString("USERNAME","test");
  8. startService(intent);


显示调用和隐式调用都能过在不同应用间传递数据。


二、可能产生的风险:

1、恶意调用


2、恶意接受数据


3、仿冒应用,例如(恶意钓鱼,启动登录界面)


4、恶意发送广播、启动应用服务。


5、调用组件,接受组件返回的数据


6、拦截有序广播


上面也是想到了一部分,应用中应该会有更多的例子。


三、怎样避归风险:

1、最小化组件暴露

不参与跨应用调用的组件添加android:exported="false"属性,这个属性说明它是私有的,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。

[html] view plain copy print ?
  1. <activity
  2. android:name=".LoginActivity"
  3. android:label="@string/app_name"
  4. android:screenOrientation="portrait"
  5. android:exported="false">



2、设置组件访问权限


参与跨应用调用的组件或者公开的广播、服务设置权限。设置权限如下:


(1)组件添加android:permission属性。


[html] view plain copy print ?
  1. <activityandroid:name=".Another"android:label="@string/app_name"
  2. android:permission="com.test.custempermission">
  3. </activity>


(2)声明< permission>属性

[html] view plain copy print ?
  1. <permissionandroid:description="test"
  2. android:label="test"
  3. android:name="com.test.custempermission"
  4. android:protectionLevel="normal">
  5. </permission>

protectionLevel有四种级别normal、dangerous、signature、signatureOrSystem。signature、signatureOrSystem时,只有相同签名时才能调用。


(3)调用组件者声明<uses-permission>


[html] view plain copy print ?
  1. <uses-permissionandroid:name="com.test.custempermission"/>



3、暴露组件的代码检查


Android 提供各种 API 来在运行时检查、执行、授予和撤销权限。这些 API


android.content.Context类的一部分,这个类提供有关应用程序环境的全局信息。

[html] view plain copy print ?
  1. if(context.checkCallingOrSelfPermission("com.test.custempermission")
  2. !=PackageManager.PERMISSION_GRANTED){
  3. //TheApplicationrequirespermissiontoaccessthe
  4. //Internet");
  5. }else{
  6. //OKtoaccesstheInternet
  7. }




参考:android安全-intent

Android 安全架构及权限控制机制剖析

http://www.ibm.com/developerworks/cn/opensource/os-cn-android-sec/

更多相关文章

  1. 浅析Android录屏 MediaRecorder
  2. 关于Android(安卓)6.0上应用的动态权限授权解决方案!
  3. Intent和Intent Filter的区别
  4. 构建自定义组件
  5. Android基础之Intent和Intent Filter
  6. Android(安卓)USB Host与HID设备通信
  7. Android(安卓)有些机型不带tcpdump的解决办法
  8. android 通过adb命令控制wifi开关
  9. android系统属性读写操作SystemProperties

随机推荐

  1. Android安全机制(2) Android Permission权
  2. 11、ffmpeg学习笔记—ffmpeg源码编译-And
  3. PullToRefreshListView addHeadView的正
  4. javaAndroid实现刚刚发表几天前的日期工
  5. Android SDK可以与JDK 1.7兼容吗?
  6. android开发中调用系统中分享功能的方法
  7. 我怎样才能获得移动方向
  8. Android核心分析 之十-------Android GWE
  9. 在string.xml中调用变量[重复]
  10. Android listview+SwipeRefreshLayout 下