OWASP 类别: MASVS-PLATFORM:平台交互
概览
一个 PendingIntent
是系统维护的令牌引用。应用 A 可以将 PendingIntent 传递给应用 B,以便应用 B 代表应用 A 执行预定义操作,无论应用 A 是否仍然存活。
风险:可变 Pending Intent
PendingIntent 可以是可变的,这意味着应用 B 可以按照 fillIn()
文档中描述的逻辑来更新指定操作的内部 Intent。换句话说,恶意应用可以修改 PendingIntent 中未填充的字段,从而访问受漏洞影响应用中原本不可导出的组件。
影响
此漏洞的影响因应用目标不可导出功能的具体实现而异。
缓解措施
一般
确保设置了 action、component 和 package,以避免最严重的漏洞
Kotlin
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
Java
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
FLAG_IMMUTABLE 标志
如果您的应用以 Android 6(API 级别 23)或更高版本为目标平台,请指定可变性。例如,您可以使用 FLAG_IMMUTABLE
来防止恶意应用填充未填充的字段。
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
在 Android 11(API 级别 30)及更高版本上,您必须指定哪些字段可变,这可以缓解此类意外漏洞。
资源
风险:重放 Pending Intent
除非设置了 FLAG_ONE_SHOT 标志,否则 PendingIntent 可以被重放。务必使用 FLAG_ONE_SHOT 来避免重放攻击(执行不应重复的操作)。
影响
此漏洞的影响因 Intent 接收端的具体实现而异。恶意应用若利用未设置 FLAG_ONE_SHOT 标志创建的 PendingIntent,则可以捕获并重用该 Intent 来重复执行只能执行一次的操作。
缓解措施
不打算多次触发的 Pending Intent 应使用 FLAG_ONE_SHOT 标志来避免重放攻击。
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
资源
资源
推荐内容
- 注意:禁用 JavaScript 时会显示链接文本
- Intent 重定向