我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 嵌套 Intent 隐患及解决方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 嵌套 Intent 隐患及解决方案

前言:

翻译自 Nicole Borrelli 在 Medium 上的 post 《Android Nesting Intents》

大家 App 是否在某些情况下对外提供了一个 Service 来执行启动其他 App 的 Activity 组件的回调。比如说,接收的 Intent 请求会以 extra 参数的形式内嵌着的其他 Intent ,而这个 Intent 参数会被用作 startActivity() 调用。

大家有没有意识到这种做法会让我们的 App 变得脆弱、易攻击?

如下的内容将解释采用这种做法会带来的问题,并提供一个解决方案,来确保你的 App 能以更加安全的方式来实现相同的功能。

带来的问题

我们期望这种类型的交互,会按照示意图的设计来进行:

上述流程图展示了如何将一个用来启动回调 Activity 的 Intent 添加到启动 Service 的 Intent 中,以及该 Service 被用作启动参数提供的 Activity。

Client App 为 ClientCallbackActivity 创建了一个 Intent 实例并将它以 extra 形式添加到了用于其他 Provider App 的 ApiService 的 Intent 属性中。Provider App 处理完该请求后将使用 Client App 提供的 Intent 来启动目标 Activity。

注意:这里需要注意的是 Provider App 调用的 startActivity() 采用的是它自己的 Context,这将带来两个欠佳的后果。

  • 因为 ClientCallbackActivity 将被外部的 Provider App 启动,所以它需要标记为对外可见即 exported,而这将允许 Provider App 以外的任何其他 App 都可以启动它
  • 传递给 ApiService 的嵌套 Intent 可被用来启动 Provider App 的任何 Activity,包括私有的、有潜在敏感信息的、对外不可见的所有 Activity!

为了进一步说明,请思考一下如果调用方 App 提供的内嵌 Intent 并非指向自己的 Activity,相反其指向了 Provider App 内部的私有 Activity,会发生什么?

上述流程图展示了一个精心构造的 Intent 如何被用来启动 Provider App 的 ApiSensitiveActivity,尽管它对外不可见也不应该被其他 App 启动。

因为采用了嵌套 Intent,对于 Provider App 来说很难去防止其他 App 去访问它的私有的、有潜在敏感信息的 Activity 们。而且 Provider App 直接使用了 startActivity() 去处理 Intent,即便ApiSensitiveActivity 未被声明为对外可见仍然可以被启动。

解决方案:PendingIntent

解决方案很简单:Provider App 不要接收 Intent,而是接收 PendingIntent。原因在于 Intent 和 PendingIntent 的区别: PendingIntent 总是使用创建它的 Context 进行 Intent 的处理。

上述流程图展示接收 PendingIntent 的话如何使用 App 创建它的 Context 进行处理,这可以阻止访问 Provider App 中非对外可见的 Activity 们。

因为回调提供的是 PendingIntent 对象,当 Provider App 调用它的 send() 时,startActivity() 请求会被当做 Attacker App 这一方进行处理。而 Attacker App 并不具备调用 Provider App 中 ApiSensitiveActivity 的特权,所以系统将会阻止这个启动请求。

对于 Provider App 来说这必然很有好处,但是我们自己的 Client App 呢?那么,如之前所说我们提供的是 PendingIntent 类型,ClientCallbackActivity 改为私有、非公开的话一样可以启动。也就是说,这种做法增强了双方 App 的安全。

如果你熟悉 Notification、Alarm Manager 等相关的 API,你应该知道它们采用 PendingIntent 来激活某些操作以及向 App 发出 alarm 通知。它始终以创建它的 App 身份进行处理,这也是系统选择 PendingIntent 而非一般 Intent 的原因。

结语

无论是对于 Client App 还是对于 Provider App,采用 Intent 这种机制来实现 Activity 启动回调的做法会导致双方 App 的安全隐患。这源自于 Intent 会在调用它的 App 上下文进行处理。而这个上下文造成了 Provider App 中非公开 Activity 被启动的可能性,同时也迫使 Client App 必须对外公开处理回调的 Activity。

相较之下,PendingIntent 会在创建它的上下文进行处理。这将允许 Provider App 可以自由使用、不会对外暴露 Activity,同时可以使得 Client App 指定任意 Activity 来处理回调,包括非公开 Activity。

到此这篇关于Android 嵌套 Intent 隐患及解决方案的文章就介绍到这了,更多相关Android 嵌套 Intent 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 嵌套 Intent 隐患及解决方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在android中ScrollView嵌套ScrollView解决方案

大家好,众所周知,android里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的)难道就真的不能嵌套吗?当然可以,只要你再写一个ScrollView,在里面做点脚,
2022-06-06

CMS安全隐患:从漏洞到解决方案

CMS(内容管理系统)作为一种流行的网站管理工具,经常被黑客盯上,成为网络攻击的靶子。本文将详细分析CMS安全隐患,并提供相应的解决方案,以帮助网站管理员保护网站免遭攻击。
CMS安全隐患:从漏洞到解决方案
2024-02-07

Android中fragment嵌套fragment问题解决方法

都说fragment好用,duang~~,又遇到问题了,记录一下,分享给遇到这个问题的同学! 1.fragment嵌套fragment时出现getActivity()为null activity A嵌套fragment B,
2022-06-06

Android中listview嵌套scrollveiw冲突的解决方法

一.使用网上用的动态改变listview高度的方法 该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasu
2022-06-06

Android 中 Fragment 嵌套 Fragment使用存在的bug附完美解决方案

自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是Fragment带来的一些优点,比如说:Fragment可以使你能够将activity分离成多个可重用的组件,每
2022-06-06

Android嵌套线性布局玩法坑解决方法

这篇文章主要为大家介绍了Android嵌套线性布局玩法坑解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Android中ScrollView嵌套GridView显示不全解决方法

Android中ScrollView嵌套GridView显示不全解决方法 由于ScrollView和GridView这两款控件都自带滚动条,一起使用GridView会显示不全 解决方法:自定义gridview感谢阅读,希望能帮助到大家,谢谢
2022-06-06

Android Fragment多层嵌套重影问题的解决方法

1解决bug的思想: //step1:当bug被发现(排除极低偶然性,单次性,开发工具导致) //step2:根据经验判断bug的重现场景,多次测试,直到精准的定位bug //step3:根据重现场景找到对应的代码 //step4:分析区域
2022-06-06

Android之ScrollView嵌套ListView和GridView冲突的解决方法

那么里面的ScrollView高度计算就会出现问题。我们也就无法得到想要的效果。核心解决方案: 重写ListView或者GridView的OnMesure 方法。 代码如下:public class MyListView extends L
2022-06-06

Android 中 GridView嵌套在ScrollView里只有一行的解决方法

在做android项目中遇到一个bug,GridView嵌套在ScrollView里只有一行的问题。下面小编在网上找到了解决方法,具体方法如下所示: 方法一:就是上面说的通过计算出来ListView或者GridView中的子列高度和 进行显
2022-06-06

(一)Android 黑白屏由来以及解决方案

子曰:温故而知新,可以为师矣。 《论语》-- 孔子作为 性能优化 系列章节的第一篇,我们就来说一说 Android 黑白屏 的历史由来以及如何解决。一、APP的三种启动方式 1. 冷启动: 程序从头开始,系统没有为该程序创建进程。一般场景:
2022-06-06

Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法

前言:Fragment也可以使用startActivityForResult方法去打开一个Activity,然后在其onActivityResult方法中处理结果,可是当Fragment嵌套的时候,由于FragmentActivity的BU
2022-06-06

Android中WebView常见问题及解决方案汇总

Android WebView常见问题解决方案汇总:就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了web app与native app之间孰优孰劣的争论. 于是乎,一种混合型的app诞生了,灵活多变的部
2022-06-06

Android笔记整理之常见错误及解决方案汇总

一、No active compatible AVD's or devices found. Relaunch this configuration after connecting a device or starting an AVD.
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录