文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android 嵌套 Intent 隐患及解决方案

2024-04-02 19:55

关注

前言:

翻译自 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,这将带来两个欠佳的后果。

为了进一步说明,请思考一下如果调用方 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯