1 简介
1.1 Intent
安卓系统中,Intent是在组件间传递的通信消息,用于执行打开Activity、发送广播、启动服务等动作,而Intent对象内部的字段则规定了Intent发送的目的组件,以及执行动作的具体内容,包括action、category、data、clipdata、package、flag、extra、component和selector。
其中component和selector用于设置Intent的目的组件,规定Intent发送给谁。按照是否设置component和selector,Intent可划分为:
• 显式Intent:具有component或者selector的Intent
• 隐式Intent:仅设置了action的Intent,注册对应action的Intent-filter的组件可以接收到Intent。
另外,还有一种特殊的空Intent new Intent(),既没有设置component,也没有设置action,甚至没有设置任何字段。
1.2 PendingIntent
PendingIntent可以看作Intent的高级版本,实现了一种委托授权发送Intent进行组件间通信的机制。
首先,App可以使用getActivity、getBroadcast、getService等API向Android系统申请一个PendingIntent对象,例如在函数getActivity :
中,intent参数构成了所⽣成PendingIntent对象的base Intent,⽽在此特定的getActivity函数中,该base Intent应该⽤于打开Activity,否则⽆意义。后⾯的flags参数决定了PendingIntent的⾏为,例如FLAG_IMMUTABLE就⽤于规定base Intent不能被改写。
接下来,这个PendingIntent对象可以发送给其他App使用,其他App调用PendingIntent.send时,就能够以PendingIntent源App的身份和权限发送PendingIntent中的base Intent。其他App甚至还可以提供一个新的Intent,对base Intent进行改写。
图:PendingIntent面临的安全风险
因此, App A将PendingIntent交给App B,就意味着将自己的身份与权限连同要做的事情委托给了App B, 这个事情由PendingIntent中的base Intent指定。
如果恶意App有能力获取上述通信过程中的PendingIntent,就可能以源App的身份和权限发送修改后的base Intent,造成非预期的安全后果,这就是PendingIntent面临的安全风险。
2 历史研究
以往的研究涉及的实际漏洞案例不多,一个著名的例子是Android系统AccountMa