Intent 是 “对某种要执行的操作的抽象描述”,直译过来也可以叫做 “意图”,比如说想要打开摄像机拍照、想要打开浏览器访问网址,想要打开设置界面,……都可以用 Intent 来描述,其作为各个组件之间进行通信的载体显得尤为重要。Intent 的主要形式有两种,分别是显式 Intent 和隐式 Intent;二者的差别主要在于前者显式指定了 Component,后者没有指定 Component,但是会通过足够的信息去帮助系统去理解意图。
本地拒绝服务
案例一(空extras)
在AndroidManifest.xml中查看某广播组件
在代码中静态分析NotificationClickReceiver中action为notification_clicked时,程序并未判断Intent extras内容传入为空的情况,通过向广播组件发送不完整的Intent,应用停止运行造成拒绝服务
adb shell am broadcast -a notification_dismiss
案例二(空action)
在AndroidManifest.xml中查看某activity组件
通过向广播组件发送不完整的Intent,应用停止运行造成拒绝服务
adb shell am start com.xxx.xxxx/com.xxxx.xxxx.NotifyDispatchActivity
其他类型本地拒绝服务
- ClassCastException异常导致的拒绝服务:源于程序没有对getSerializableExtra()等获取到的数据进行类型判断而进行强制类型转换,从而导致类型转换异常而导致应用崩溃
- IndexOutOfBoundsException异常导致的拒绝服务:源于程序没有对getIntegerArrayListExtra()等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃
- ClassNotFoundException异常导致的拒绝服务:源于程序没有无法找到从getSerializableExtra ()获取到的序列化类对象的类定义,因此发生类未定义的异常而导致应用崩溃
- 通用型拒绝服务:由于应用中使用了getSerializableExtra() 的API,应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入序列化数据,导致应用本地拒绝服务
隐式intent导致的账号注销
通过Androidmanifest查看SessionExpiredReceiver的action
通过在代码中查询发现存在一个隐式intent用于注销session
使用一个am命令启动
adb shell am broadcast -a xxx_SESSION_EXPIRED_ACTION -p com.xxxx.xx -ei skip_to_page 1
已登录的程序自动退出登录到首页
service组件暴露导致恶意应用可自动发送动态
先看一下service组件,其中哪些是可以导出的
获取可导出的service组件UploadService,查看androidmanifest中UploadService的配置,包含一个intent
通过搜索发现一个显式intent
主要代码如下
由于组件可以导出,可以主动使用进行消息伪造,hook一下E方法看看传入的数据
编写利用代码
Intent intent = new Intent(); intent.setComponent(new ComponentName("xxxx","com.xxxxxxx.UploadService")); intent.setAction("com.xxxxx.upload.AUDIO"); Bundle bundle = new Bundle(); bundle.putInt("aid", 0); bundle.putString("tags", "heihei"); bundle.putString("phontPath", "/storage/emulated/0/test.jpg"); intent.putExtras(bundle); startService(intent);
生成新的app,点击button执行,可以看到显示发布成功
在app中看到自动发送了一条动态
通过拦截Intent伪造钓鱼页面(网络案例)
使用Google Wallet SDK进行交易,app必须与设备上的Google Play app进行通信,以便Google Play把交易情况反馈给用户同时要求用户进行确认。
然而, IAP SDK使用了隐式意图ACTION=”com.android.vending.billing.MarketBillingService.BIND”,可以被意图过滤器(intent-filter)action android:name=”com.android.vending.billing.MarketBillingService.BIND.”拦截
同时隐式启动service,当存在同名service,先安装应用的service优先级高。因此恶意app就可以使用同样的intent-filter拦截该意图然后启动钓鱼界面,如下图所示:
本地身份认证绕过(网络案例)
某程序加锁解锁是靠广播来控制的,并且这两条广播没做权限限制,任意应用可以发送此广播达到恶意解锁、恶意锁定应用的目的。用adb shell 发送广播,用来解锁
然后使用命令行
adb shell am broadcast -a android.intent.action.PACKAGE_FULLY_REMOVED -d package:com.wumii.android.mimi
就可以成功解锁:
总结
在测试四大组件以及WebView、deeplink等内容的同时也要注意显式隐式inten的利用点,其不仅可以结合四大组件造成诸多问题,也可以结合WebView造成诸如launchAnyWhere的问题。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)