在2019年,有安全研究员向Google官方提交了一个利用taskAffinity的漏洞,后面被命名为StandHogg。最近在2020年5月份又公布了StandHogg 2.0漏洞。StandHogg 2.0 隐藏的更深,一般很难发现,甚至都不用设置taskAffinity就可以实现。目前官方已经发布了Android 10.0系统补丁包,有条件的可以对系统进行升级。有兴趣的同学可以看下这篇文章:https://www.xda-developers.com/strandhogg-2-0-android-vulnerability-explained-developer-mitigation/
一、taskAffinity
这个属性在AndroidManifest.xml中进行设置,有2个地方,一个在application标签里面,一个在activity标签里面。当App启动时,对AndroidManifest.xml进行解析后,会放在ApplicationInfo与ActivityInfo类中。对其的定义与描述如下:
$1.1、ApplicationInfo
/**
* Default task affinity of all activities in this application. See
* {@link ActivityInfo#taskAffinity} for more information. This comes
* from the "taskAffinity" attribute.
*/
public String taskAffinity;
$1.2、ActivityInfo
上面的注释我有以下几点理解:
- taskAffinity属性,如果设置在<application>则对所有Activity生效,默认为应用包名;
- taskAffinity属性,作用于Activity,针对多任务而言,表示对另外一个任务的亲和度
- taskAffinity的值一般用应用包名表示;
- 如果手动设置taskAffinity为空,则当前Activity只属于当前task,对其他task无亲和度
二、allowTaskReparenting
官方对此属性的注释如下:
/**
* Bit in {@link #flags} that indicates that the activity can be moved
* between tasks based on its task affinity. Set from the
* {@link android.R.attr#allowTaskReparenting} attribute.
*/
public static final int FLAG_ALLOW_TASK_REPARENTING = 0x0040;
同样,基于注释,我有以下几点理解:
- 此属性作用于activity,且基于activity设置的task affinity属性。如果没有设置,则默认为应用包名
- 如果allowTaskReparenting为true。且taskAffinity有设值,则表示允许当前activity从“当前包名task"移动至”taskAffinity指定的task"。
三、StandHogg漏洞
此漏洞的原理就是恶意APP利用taskAffinity属性,来实现task任务栈的劫持。
成功劫持的条件如下:
- 目标应用<application>中taskAffinity没有手动设置空字符串。
- 恶意应用 的钓鱼界面的taskAffinity 设置为目标应用的包名。且allowTaskReparenting = true或者不设置allowTaskReparenting但在启动钓鱼界面的intent中setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
POC成功后,采用adb shell dumpsys activity查看任务栈信息如下:
第一种情况:设置allowTaskReparenting = true
// 恶意应用设置allowTaskReparenting=true
Display #0 (activities from top to bottom):
Stack #1:
Task id #24
TaskRecord{
2d220957 #24 A=ext.sunny.com.taskaffinitydemo U=0 sz=1}
Intent {
flg=0x10000000 cmp=ext.sunny.com.attackapp/.AttackActivity }
Hist #0: ActivityRecord{
30a4df6d u0 ext.sunny.com.attackapp/.AttackActivity t24}
Intent {
flg=0x10000000 cmp=ext.sunny.com.attackapp/.AttackActivity }
ProcessRecord{
277e412d 4287:ext.sunny.com.attackapp/u0a31}
Task id #23
TaskRecord{
26a0ac44 #23 A=ext.sunny.com.attackapp U=0 sz=1}
Intent {
act=android