本文主要是介绍Android静态安全检测 - PendingIntent误用风险,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PendingIntent误用风险 - android.app.PendingIntent
一、API
1. 继承关系
【1】java.lang.Object
【2】android.app.PendingIntent
2. 主要方法
【1】getActivity(Context context, int requestCode, Intent intent, int flags)
【2】getBroadcast(Context context, int requestCode, Intent intent, int flags)
【3】getService(Context context, int requestCode, Intent intent, int flags)
【4】其他方法
https://developer.android.com/reference/android/app/PendingIntent.html
3. PendingIntent介绍
【1】使用方法类的静态方法getActivity,getBroadcast,getService,可以得到一个PendingIntent对象,分别对应着Intent的三个行为,跳转到一个activity组件、打开一个广播组件和打开一个服务组件
【2】参数有4个,比较重要的是第三个和第一个,可以看到,要得到PendingIntent对象,必须传入一个Intent作为参数
【3】PendingIntent是一种特殊的Intent,主要的区别在于Intent的执行是立刻的,而PendingIntent的执行不是立刻的,PendingIntent执行的操作实质上是参数传进来的Intent的操作
【4】使用PendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的
状态栏通知(Notification的发送)
短消息发送(SmsManager)
警报器执行(AlarmManager)
【5】参考链接
http://www.cnblogs.com/wjjair/p/3392031.html
二、触发条件
1. 定位关键API的位置
【1】Landroid/app/PendingIntent;->getActivity(
【2】Landroid/app/PendingIntent;->getBroadcast(
【3】Landroid/app/PendingIntent;->getService(
2. 判断第三参数是否为空Intent
【1】确定寄存器名称 v1
初始化形式 Intent intent = new Intent()
对应到smali语句的特征
invoke-direct {v1}, Landroid/content/Intent;-><init>()V
【2】判断是否设置Action或者ComponentName
Landroid/content/Intent;->setAction(
Landroid/content/Intent;->setClass(
Landroid/content/Intent;->setClassName(
Landroid/content/Intent;->setComponent(
Landroid/content/Intent;->setPackage(
三、漏洞原理
【1】使用PendingIntent的时候,如果使用了一个空Intent,会导致恶意用户劫持修改Intent的内容
【2】更多内容
http://drops.wooyun.org/papers/3912
四、修复建议
【1】禁止使用一个空Intent去构造PendingIntent
【2】构造PendingIntent的Intent一定要设置ComponentName或者action
这篇关于Android静态安全检测 - PendingIntent误用风险的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!