StrandHogg漏洞修复: taskAffinity学习

StrandHogg漏洞修复: taskAffinity学习

前言

最近手头的APP报了个高危漏洞——StrandHogg,花了点时间处理了下,踩了些坑,这里记录下,并再学习下taskAffinity这个属性。

问题

StrandHogg 漏洞是一个 Android 任务栈劫持漏洞,在2019年披露,影响范围包括android10以下。该漏洞可以让恶意应用注入一个activity到他设定好的应用的顶层。

大致就是利用相同的taskAffinity属性,攻击应用的activity可以放在目标应用的stack中,从而伪装获得权限、数据、信息等。

知识储备

看到activity的stack我们就需要用到taskAffinity这个属性及四种启动模式了,这里只谈taskAffinity,顺便聊一下allowTaskReparenting。

taskAffinity,可以翻译为任务相关性。这个参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名,当 Activity 设置了 taskAffinity 属性,那么这个 Activity 在被创建时就会运行在和 taskAffinity 名字相同的任务栈中,如果没有,则新建 taskAffinity 指定的任务栈,并将 Activity 放入该栈中。另外,taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义(不生效)。

allowTaskReparenting,翻译过来的意思是允许重新找父母(允许迁移任务栈),该属性用于配置是否允许该activity更换从属的task。
如果一个Activity设置了这个属性,其他应用启动这个activity的时候分两种情况处理:

  • 这个activity对应的进程已经启动了:则这个activity直接附属到自己所对应的进程的应用栈上
  • 这个activity对应的进程没有启动:则这个activity先直接附属到启动它的应用的应用栈上,当activity对应的进程启动后,则会主动迁移到activity对应的进程。
官方解释:

当下一次将启动 Activity 的任务转至前台时,Activity 是否能从该任务转移至与其有相似性的任务 -“true”表示可以转移,“false”表示仍须留在启动它的任务处。

有趣说法:

你捡到一条狗,在家里喂养几天觉得不错,当自己家的了;但是突然有一天他的主人找上门来了,小狗还是乖乖和主人走了。这条狗就是带有allowTaskReparenting属性的activity。

解决办法

一般扫描的第三方报告会让我们设置manifest里面application标签的taskAffinity为空字符串,其他activity不设置改属性,但是这里就出问题了。

问题

直接这样设置,如果app里面有singleTask的activity,启动时就会在任务卡片上显示多个“应用”,这个是肯定不能接收的。

修改方案

其实报告提供的方法也没错,但是要多做点修改。

  1. 按照报告做,把manifest里面application标签的taskAffinity为空字符串,其他activity不设置,最好通过用Android Studio的analyze apk查看apk的AndroidManifest。如果需要也可以加上allowTaskReparenting属性。

  2. 设置启动activity的launchMode为singleTask,其他activity全部设置为非singleTask/singleInstance。

  3. 通过analyze apk查看apk的AndroidManifest,检查里面第三方库的activity涉不涉及singleTask/singleInstance,有的话,在AndroidManifest中覆写它们(可能要用到tools:replace=“android:launchMode”)。

  4. 对需要使用singleTask/singleInstance的地方通过带FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP flags的intent跳转。

结语

这里做的还是比较糙,如果第三方库里面非得用singleTask/singleInstance那就不好办了。可能还会有其他问题,我这暂时没遇到,有问题可评论区讨论。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值