你真的了解taskAffinity属性么?

在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

在这里插入图片描述
上面的注释我有以下几点理解:

  1. taskAffinity属性,如果设置在<application>则对所有Activity生效,默认为应用包名;
  2. taskAffinity属性,作用于Activity,针对多任务而言,表示对另外一个任务的亲和度
  3. taskAffinity的值一般用应用包名表示;
  4. 如果手动设置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;

同样,基于注释,我有以下几点理解:

  1. 此属性作用于activity,且基于activity设置的task affinity属性。如果没有设置,则默认为应用包名
  2. 如果allowTaskReparenting为true。且taskAffinity有设值,则表示允许当前activity从“当前包名task"移动至”taskAffinity指定的task"。

三、StandHogg漏洞

此漏洞的原理就是恶意APP利用taskAffinity属性,来实现task任务栈的劫持。
成功劫持的条件如下:

  1. 目标应用<application>中taskAffinity没有手动设置空字符串。
  2. 恶意应用 的钓鱼界面的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
为了深入了解如何在Android Studio中创建并配置新项目,尤其是优化Activity管理器和布局编辑器的配置,需要深入理解Linux内核以及Android应用程序框架层的知识。在创建项目时,首先要选择正确的项目模板,确保项目的根目录结构符合标准的Android应用项目布局。接下来,可以利用Linux内核的多线程特性来优化Activity管理器(Activity Manager)的性能,例如,可以通过线程池来管理Activity的生命周期事件,以减少资源消耗并提升应用响应速度。 参考资源链接:[安卓期末考试复习:题库与系统知识详解](https://wenku.youkuaiyun.com/doc/6ho9saew5e?spm=1055.2569.3001.10343) 在布局编辑器方面,Android Studio提供了可视化的布局工具,允许开发者通过拖拽组件来设计用户界面。要利用Linux内核的特性,可以考虑布局的渲染效率和内存管理。例如,使用ConstraintLayout来简化布局层级,减少渲染时间,同时利用Android的硬件加速特性来提升UI性能。 具体操作上,首先启动Android Studio并选择'File -> New -> New Project'来创建新项目。在创建过程中,确保选择了适合你的应用类型的模板,然后为应用命名并选择项目的保存位置。在配置Activity管理器时,可以在'AndroidManifest.xml'文件中明确每个Activity的属性,如启动模式(launchMode)和任务亲和性(taskAffinity),以及生命周期回调方法的实现。 对于布局编辑器,可以在'activity_main.xml'中使用XML标签定义界面布局。在设计界面时,可以结合Linux内核的内存管理特性,避免创建过多的视图层级,优化图片和资源的使用,确保布局的高效渲染。此外,可以利用Android Studio的Layout Inspector工具进行布局审查,确保布局的正确性和性能。 完成上述步骤后,你应该能够创建一个结构合理,性能优化的新Android项目。如果需要进一步深入学习,建议查阅《安卓期末考试复习:题库与系统知识详解》。该资源不仅包含了大量的知识点,还有实际应用案例分析,能够帮助你巩固和扩展在Android开发过程中的知识和技能。 参考资源链接:[安卓期末考试复习:题库与系统知识详解](https://wenku.youkuaiyun.com/doc/6ho9saew5e?spm=1055.2569.3001.10343)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值