频道栏目
首页 > 安全 > 系统安全 > 正文

android安全-Broadcast Receiver

2012-02-12 17:22:00           
收藏   我要投稿
一、Broadcast Receiver简介
Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件
broadcast receiver使用时,可以静态注册在AndroidManifest.xml中,也可以在activity初始化函数中动态生成
静态注册:
   //MyBroadcastReceiver继承BroadcastReceiver,重写onReceiver方法
<receiver android:name="com.xiaod.mybroadcast.MyBroadcastReceiver">
<intent-filter>
//使用过滤器,接收指定action广播
<action android:name=""com.xiaod.mybroadcast""></action>
</intent-filter>
</receiver>
动态注册:
    IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.xiaod.mybroadcast"); //为BroadcastReceiver指定action,使之用于接收同action的广播
registerReceiver(BroadcastReceiver,intentFilter);
一般在activity的onStart/onResume中注册,onStop中取消unregisterReceiver
发送广播:
指定广播目标Action:Intent intent = new Intent(actionString);
并且可通过Intent携带消息:intent.putExtra(“msg”, “hi,i send a message”);
发送广播消息:Context.sendBroadcast(intent);
二、实例
两个应用Mybroadcast用于广播接收,MySendBro用于广播发送
MyBroadcast用于广播接收,指定响应action为”com.xiaod.mybroadcast”,处理类com.xiaod.mybroadcast.MyBroadcastReceiver
androidmanifest.xml文件如下:
  <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xiaod.mybroadcast"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="com.xiaod.mybroadcast.MyBroadcastActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.xiaod.mybroadcast.MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.xiaod.mybroadcast"></action>
</intent-filter>
</receiver>
</application>
</manifest>
MyBroadcastReceiver.java
package com.xiaod.mybroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
Toast.makeText(context,
"InentAction is: \n"+action+"\nmsg is:\n"+
intent.getStringExtra("msg")+"\nid is:\n"+
android.os.Process.myPid(), Toast.LENGTH_SHORT).show();
}
}
MySendBro用于广播发送
MySendBroActivity.java如下:
   package com.xiaod.mysendbro;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MySendBroActivity extends Activity {
/** Called when the activity is first created. */
private Button btn;
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.button1);
tv = (TextView)findViewById(R.id.tv);
tv.setText("id is:"+android.os.Process.myPid());
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("com.xiaod.mybroadcast");
intent.putExtra("msg", "Message");
sendBroadcast(intent);
}});
}
}
然后,先启动MyBroadcast,pid为598

\
 
之后启动MySendBro,pid为498,点击button给MyBroadcast发送广播

\
 
Mybroadcast响应并显示了信息

\
 
三、漏洞和修复方式
按照上述应用间广播发送的过程,如果我们分析某应用的代码(apktool反编译),在androidmanifest.xml中或在activity中动态生成,找到该应用使用哪些broadcast receiver,对应哪个action进行处理。通过构造一个恶意的应用,标识此action,给正常应用发送broadcast,那么应用就会处理。如果某些诸如通过internet发送短信的应用,自身注册一个receiver,是否可能通过恶意应用发送钓鱼短信欺骗用户。
修复方式:
在receiver中通过标识android:exported来开启和关闭receiver对外部应用的响应,
如果不允许外部调用,在receiver中指定exported=”false”
   <receiver android:name="com.xiaod.mybroadcast.MyBroadcastReceiver"
android:exported="false">
......
</receiver>
如果必须要外部调用,指定exported=”true”,增加android:permission指定权限,在receiver方的androidmanifest.xml中增加<permission>自定义权限项,并在sendbroadcast方得androidmanifest.xml中增加<uses-permission>匹配此权限
receiver方配置如下:
  <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
......
<permission android:name="com.xiaod.mybroadcast.permission.Receiver" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyBroadcastActivity"
android:label="@string/app_name">
......
</activity>
<receiver android:name="com.xiaod.mybroadcast.MyBroadcastReceiver" android:exported="true"
android:permission="com.xiaod.mybroadcast.permission.Receiver">
<intent-filter>
<action android:name="com.xiaod.mybroadcast.action.Receiver"></action>
</intent-filter>
</receiver>
</application>
</manifest>
sendbroadcast方配置如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
......
<uses-permission android:name="com.xiaod.mybroadcast.permission.Receiver" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MySendBroActivity"
android:label="@string/app_name">
......
</activity>
</application>
</manifest>
四、关于sticky broadcast
sticky broadcast是一种特殊的broadcast,具有以下特点:
1、投递后,不会被系统删除,会持久保留
2、所有receiver都可接收,无法设定独立权限
3、其他应用具有BROADCAST_STICKY权限,即可删除任意sticky broadcast
综合以上特点,我们尽量避免使用sticky broadcast


摘自 http://www.sectop.com/?p=128
 
上一篇:android安全-sql injection
下一篇:五种控制Android应用的权限的方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站