什么是broadcast receivers

Broadcast receivers 是对广播接收和回应的组件。系统会发出许多广播,比如时区的改变、电量过低,图片被选中等。应用也可生成广播,比如通知其他设备一些数据已经下载完成并且可以被使用。

Broadcast receivers 没有用户界面。但是,他可以启动一个界面作为对广播的回应,或者使用NotificationManager提示用户。NotificationManager可以通过多种方式提示用户,比如闪烁背光灯,震动设备,播放提示音等等。手机状态条中会一直存在一个提示图标,用户可以打开它查看提示信息。

安全风险

如果想了解broadcast receivers的安全风险,我们必须了解事件是如何被广播出来的,事件分为两种类型,如下图所示:

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

1. 系统事件

系统事件是由系统发出的,比如“启动完成、收到信息、电量过低”等。比如当应用程序注册了短信接收事件,每收到一次短信就会唤醒broadcast receivers

2. 用户事件

除了系统生成的事件, 用户也可以注册一个自定义的应用程序广播事件接收器。

下面问题来了:

1当我们的应用程序发送一个广播意图,是只有目标程序会收到,还是所有的程序会收到呢?

2 当我们注册了一个接收器,我们是只能从合法的广播来源接收程序还是也可以从恶意的程序那里接收到广播呢?

如果开发人员没有限制谁能广播谁不能广播的话,很明显答案是肯定的。如果接收器接收到了不信任源发来的广播,我们的应用程序会陷入危险。

为了演示这个场景如何被利用,我开发了一个小程序。

请填写表单然后下载程序和源码。(小编贴心的下载了下来,然后传到了网盘里,你就叫我红领巾吧)

http://yunpan.cn/cfAPSi5i4tbgc (提取码:48fb)

准备工作

安装了Android SDK的电脑

两个模拟器

测试程序的功能

下载下来后你需要安装上测试程序,执行下面的命令

adb install <程序名字>.apk

当我们启动应用程序,如下图所示

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

我们需要注册一个特别的手机号,如下图所示。当我们点击了按钮,自定义的广播将被发送,我们将收到短信确认注册成功。

这个程序的任务是发送虚假的广播并确认程序是否收到,如果收到了,将利用这个虚假的广播发送一条短信。

理解此程序的功能

一个叫做“MyBroadCastReceiver “的广播接收器在AndroidManifest.xml 文件中被注册。代码如下:

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

应用程序使用以下代码发送,“input“是你刚才输入的那些字符。

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

下面的代码将把广播来的手机号码通过短信发送给注册的用户。

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

攻击Broadcast Receivers

下面我们尝试发送一些虚假的广播,通过下面的步骤:

使用adb

获得一个设备的adb shell,输入下面的命令

am broadcast -a MyBroadcast -n com.isi.vul_broadcastreceiver/.MyBroadCastReceiver

输入下面的命令上面的命令将发送一个广播,但是他没有包括手机号码。我们可以使用 –es 这个选项传递电话号码

am broadcast -a MyBroadcast -n com.isi.vul_broadcastreceiver/.MyBroadCastReceiver –es number 5556

如下图所示

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

使用一个恶意的app

我们可以写一个恶意的app去发送广播,或者利用存在漏洞的app。最好的利用场景就是恶意的程序不需要发送短信的权限,而是利用存在漏洞的app的权限。

如何加固你的app

1.设置AndroidManifest.xml ,添加下面的属性

安卓-3-Broadcast Receivers攻防-JE2Se ' Blog

2.控制权限来防止类似事件发生

结语

在Android上,broadcast receivers是开发应用程序不可或缺的重要组件,但是当安全控制不恰当时,可能导致严重的后果。所以在安卓测试上,任何一个组件的测试都是必要的,因为小的问题往往带来大的隐患。