Android安全开发之启动私有组件漏洞浅谈

0x00 私有组件浅谈

android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面。很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击。但是开发者不一定所有的安全问题都能考虑全面。

?

对于这样的问题,最方便的修复方式就是在确定不影响业务的情况下,将这个存在问题的组件不对外导出变成私有组件。这样做的确很有效,私有组件也很安全。但是,如果存在某个私有组件能被导出组件启动的话,那么这个私有组件其实就不再是私有了。如果攻击者可以通过控制导出的组件对私有组件进行控制,那么攻击者的攻击面就大大的扩大了。如果不对这种情况进行关注很可能带来一系列安全问题。 

正常情况:

私有组件能被启动情况:

0x01 启动私有组件原理分析

存在一个私有组件A,和一个对外导出组件B。如果B能够根据对外传入的Intent中的内容打开私有组件A,同时启动私有组件A的Intent的内容来自启动导出组件B的Intent的内容,那么攻击者就可以通过对外导出组件B,去控制私有导出组件A。这就可能会造成严重的安全风险。

下面用一个简单例子来说明如果能够启动私有组件,能引起的一些安全问题。

PrivateActivity.class

很明显,PrivateActivity是存在问题的,因为从Intent中直接获取值之后,没有做任何异常处理。如果PrivateActivity是私有的一个Activity,并且开发工程师能保证传入到该Activity的Intent一定有值的话,那么其实是无法造成威胁的。但是如果存在另外一个MainActivity,如下:

那么,攻击者就可以通过着么一条命令去实施攻击:

那么应用就会崩溃。

这里只是一个简单的demo,用来说明存在问题。如果PrivateAcitivty里面存在很重要的逻辑业务处理的话,那么恶意攻击者可以通过控制MainActivity去控制PrivateActivity,进而控制PrivateActivity里面的逻辑走向,极有可能造成严重危害。

除了以上这种情况之外,还有一种情况,就是Intent Scheme URL,如果处理不当的话,也极有可能通过解析Uri的这个导出的组件去攻击启动其他私有组件。本质都是一样的,这里就不讨论这种情况了。

0x03 启动私有组件案例分析

这里以某个app7.5.0版本为例,分析它因为可以启动私有组件导致的严重问题。(目前该app已经没有再使用有问题的组件,有问题的SDK也早已经修复了这个问题)

首先,这个app存在一个私有组件VersionUpdateActivity:

这个私有组件是用来判断是否更新的,如果有,会根据Intent中的url链接去下载相应的更新apk包。

另外,该apk存在另外一个对外导出的组件。

该组件在实现过程中,通过获取到的Intent,经过一系列检查,进入pushClickedResult函数中。

在pushClickedResult函数中,主要做了以下几个操作: 

1、首先获取intent中activity

2、然后将这个值作为将要启动的activity的classname

3、将intent传入将要启动的activity

4、然后启动activity

那么很明显了,攻击者可以通过控制XGPushActivity进而控制这个应用的所有私有activity。

攻击私有组件VersionUpdateActivity的POC如下:

这个命令会打开VersionUpdateActivity,如果存在更新,那么点击更新,下载的将是url对应的内容。

0x04 阿里聚安全对开发者的建议

首先,阿里聚安全已经能够检测到这样的问题了。对于上面案例分析中的app,阿里聚安全扫描器扫描到的结果如下:

对于这样的安全风险,阿里聚安全建议: 

1、对于不必要对外导出的组件,请设置exported=false。

2、如果该组件因为各种原因,需要导出,那么请检查该组件能不能根据该组件的intent去启动其他私有组件。如果能,请根据业务严格控制过滤和校验intent中的内容,同时被启动的私有组件需要做好各种安全防范。

阿里聚安全 | Android安全开发系列文章

Android安全开发之安全使用HTTPS

Android安全开发之通用签名风险

Android安全开发之ZIP文件目录遍历

Android安全开发之Provider组件安全

Android安全开发之浅谈密钥硬编码

Android安全开发之浅谈网页打开APP

Android应用安全开发之浅谈加密算法的坑

-------------------------------------------------------------------

* 作者:舟海、呆狐@阿里聚安全,更多阿里安全类技术文章,请访问阿里聚安全官方博客

时间: 2025-01-14 04:55:16

Android安全开发之启动私有组件漏洞浅谈的相关文章

【Android应用开发技术:应用组件】Intent基本原理

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 一个App通常都会有好几个Activity.每一个Activity的界面都扮演者用户接口的角色,允许用户执行一些特殊任务,例如查看地图或者是开始拍照等.如何让用户从一个Activity跳到另外一个Activity呢,这便是今天要介绍的Intent. Intent来定义App的

Android实际开发之网络请求组件的封装(OkHttp为核心)

趁周末时间撸了两天代码,将OkHttp网络请求框架进行了一次简单封装,对于实际开发非常有用.. 此次封装主要针对我们经常使用的网络请求的步骤进行封装,在已有框架OkHttp的基础上进行实际开发的封装 发送一个网络请求,有以下三个功能模块: 一:request处理 二:OkHttp核心处理 三:callback处理 我们进行网络请求组件的封装也是根据这三大模块进行封装的,下面规划一下这次封装的一个思维导图: 根据以上思维导图,我们第一步,先进行request的封装: 以下是封装的一个CommonR

【Android应用开发技术:应用组件】Fragment使用方法

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 一 Fragment管理与事务 Activity通过FragmentManager管理Fragment,FragmentManager可以完成以下功能: 调用findFragmentById()或findFragmentByTag()方法来获取指定的Fragment.在XML

【Android应用开发技术:应用组件】Fragment基本原理

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 如果我们的App设计成要支持范围广泛的屏幕尺寸时,在可利用的屏幕空间内,我们可以通过在不同的布局配置中重用你的Fragment来优化我们的用户体验.一个手机设备可能适合一次只有一个Fragment的单面板用户交互.相反,在更大屏幕尺寸的平板电脑上,我们可能更想要两个Fragm

【Android 应用开发】 自定义 View 组件 -- 圆形进度条

转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://download.csdn.net/detail/han1202012/8069497 ; -- GitHub 地址 : https://github.com/han1202012/CircleProcess.git ; -- 工程示例 : 一. 相关知识点解析 1. 自定义 View 组件构造方法 构造方

【Android应用开发技术:应用组件】Intent使用方法

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 一 Intent验证 尽管Android系统会确保每一个确定的intent会被系统内置的app(such as the Phone, Email, or Calendar app)之一接收,但是我们还是应该在触发一个intent之前做验证是否有App接受这个intent的步骤

【Android应用开发技术:应用组件】Android事件处理机制

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 事件处理:不管是桌面应用还是手机应用都需要去响应用户的动作,这种为用户动作提供响应的机制就是事件处理. Android提供了两套事件处理机制,如下所示: 基于监听的事件处理 基于回调的事件处理 一般来说,基于回调的事件处理可用于处理一些通用性的事件,但对于某些特定的事件只能使

android studio 开发中启动android项目报错sdk版本不一致解决方案

安卓项目开发中新建项目后再run'的时候发现报错com.android.support:appcompat-v7依赖报错 查看下build.gredle所配置的参数: 打开项目的build.gradle文件配置如下: //配置参数allprojects { repositories { jcenter() maven { url "https://maven.google.com" } } } Ok,添加完成后此时需要同步下你的项目最后是重启!重新打开项目后发现错误没有项目正常运行!

寒冬之下,移动开发没人要了? 浅谈 iOS 开发者该 何去何从?

前言: 作者 | 梅梅    文章来源 CSDN 对于移动互联网而言,2018 年像是球场上的一声裁判哨.哨声响起,高潮迭起的上半场结束.本该再创辉煌的下半场,还没开赛却被告之:规则改变.场地收缩.教练下课.冷板凳无限加长. 这样前途未卜的下半场,你还敢上吗? 作为队伍「前锋」的移动端程序员,面对这样的挑战,又有哪些不一样的表现和前景?本文将结合招聘数据和候选人采访,展现移动端程序员「冰火两重天」的 2018 年. 2018:移动端上半场宣告结束 纵观近几年的平台数据,虽然移动端市场供需从 20