freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

安卓Intent漏洞实战案例
2023-04-14 18:12:39
所属地 广东省

Intent 是 “对某种要执行的操作的抽象描述”,直译过来也可以叫做 “意图”,比如说想要打开摄像机拍照、想要打开浏览器访问网址,想要打开设置界面,……都可以用 Intent 来描述,其作为各个组件之间进行通信的载体显得尤为重要。Intent 的主要形式有两种,分别是显式 Intent 和隐式 Intent;二者的差别主要在于前者显式指定了 Component,后者没有指定 Component,但是会通过足够的信息去帮助系统去理解意图。

本地拒绝服务

案例一(空extras)

在AndroidManifest.xml中查看某广播组件

1681465397_643920356421b8547c80c.png!small?1681465398340

在代码中静态分析NotificationClickReceiver中action为notification_clicked时,程序并未判断Intent extras内容传入为空的情况,通过向广播组件发送不完整的Intent,应用停止运行造成拒绝服务

adb shell am broadcast -a notification_dismiss

1681465415_64392047712934c9d5f1b.png!small?1681465416290

案例二(空action)

在AndroidManifest.xml中查看某activity组件

1681465443_643920637ee2e211dff36.png!small?1681465444027

通过向广播组件发送不完整的Intent,应用停止运行造成拒绝服务

adb shell am start com.xxx.xxxx/com.xxxx.xxxx.NotifyDispatchActivity

1681465459_64392073884ebd556f983.png!small?1681465459949

其他类型本地拒绝服务

  1. ClassCastException异常导致的拒绝服务:源于程序没有对getSerializableExtra()等获取到的数据进行类型判断而进行强制类型转换,从而导致类型转换异常而导致应用崩溃
  2. IndexOutOfBoundsException异常导致的拒绝服务:源于程序没有对getIntegerArrayListExtra()等获取到的数据数组元素大小的判断,从而导致数组访问越界而导致应用崩溃
  3. ClassNotFoundException异常导致的拒绝服务:源于程序没有无法找到从getSerializableExtra ()获取到的序列化类对象的类定义,因此发生类未定义的异常而导致应用崩溃
  4. 通用型拒绝服务:由于应用中使用了getSerializableExtra() 的API,应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入序列化数据,导致应用本地拒绝服务

隐式intent导致的账号注销

通过Androidmanifest查看SessionExpiredReceiver的action

1681465550_643920ce3275f22a40163.png!small?1681465550745

通过在代码中查询发现存在一个隐式intent用于注销session

1681465600_6439210034af4e008bd33.png!small?1681465600885

使用一个am命令启动

adb shell am broadcast -a xxx_SESSION_EXPIRED_ACTION -p com.xxxx.xx -ei skip_to_page 1

已登录的程序自动退出登录到首页

1681465628_6439211c4a02ac6460958.png!small?1681465629187

service组件暴露导致恶意应用可自动发送动态

先看一下service组件,其中哪些是可以导出的

1681465708_6439216c8e04c03ecd149.png!small?1681465709354

获取可导出的service组件UploadService,查看androidmanifest中UploadService的配置,包含一个intent

1681465811_643921d3c7e1d84d68808.png!small?1681465812938

通过搜索发现一个显式intent

1681465890_643922227aa75f41db0a4.png!small?1681465891437

主要代码如下

1681465931_6439224be79909a2758f3.png!small?1681465933420

由于组件可以导出,可以主动使用进行消息伪造,hook一下E方法看看传入的数据

1681466127_6439230fc2a8936129800.png!small?1681466128698

编写利用代码

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执行,可以看到显示发布成功

1681466255_6439238f9cc2c59ace06d.png!small?1681466256024

在app中看到自动发送了一条动态

1681466276_643923a4d360a12961d43.png!small?1681466277420

通过拦截Intent伪造钓鱼页面(网络案例)

使用Google Wallet SDK进行交易,app必须与设备上的Google Play app进行通信,以便Google Play把交易情况反馈给用户同时要求用户进行确认。

1681466337_643923e18c9a35003372a.png!small?1681466338233

然而, 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拦截该意图然后启动钓鱼界面,如下图所示:

1681466350_643923ee4545c6736f67d.png!small?1681466351210

本地身份认证绕过(网络案例)

某程序加锁解锁是靠广播来控制的,并且这两条广播没做权限限制,任意应用可以发送此广播达到恶意解锁、恶意锁定应用的目的。用adb shell 发送广播,用来解锁

1681466366_643923fe1e3e323d774e8.png!small?1681466367028

然后使用命令行

adb shell am broadcast -a android.intent.action.PACKAGE_FULLY_REMOVED -d package:com.wumii.android.mimi

就可以成功解锁:

1681466383_6439240f3e089fbf9b454.png!small?1681466385252

总结

在测试四大组件以及WebView、deeplink等内容的同时也要注意显式隐式inten的利用点,其不仅可以结合四大组件造成诸多问题,也可以结合WebView造成诸如launchAnyWhere的问题。

# 网络安全 # 系统安全
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录