版权声明:研发测试圈原创作品,转载前需联系作者,否则必究。 Android开发过程中的应用和用户数据安全是所有人都在关心的一个热点话题 因为安卓应用(以下简称APP)在面对日益增多的安全威胁时,往往脆弱的像一页白纸。在Coverity发布8.7版本的同时,我也看到移动安全已经成为移动互联网时代非常重要的一个议题。移动安全是什么?如何实施保障?这将需要一系列的文章,也是《深入浅出Android安全》的由来,本文作为楔子,以Intent Spoofing作为起始为大家介绍Android安全: 在针对Android APP的攻击中,Intent Spoofing是一个很少被人认识到却风险巨大的漏洞。就像很多人不知道SQL和JavaScript都可以被注入一样(参考JavaScript的DOM_XSS),Intent Spoofing也鲜为人知。 使用Intent会导致两种著名的(可以说是臭名昭著的)安全漏洞:Intent Interception 和Intent Spoofing. 先说说什么是Intent:Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。Intent是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成Android各个组件之间的通讯。 Intents一般被用来启动APP的核心组件-activitie、service和broadcast。Intent 带来的信息传递是相同App或不同APP之间晚期运行时绑定的工具。 Intent的使用方法: 1. startActivity:启动Activity
2. broadcastIntent:发送Intent到任意BroadcastReceiver组件。
3. startService (Intent)或bindService (Intent,ServiceConnection, int):与backgroundService通信
Intent启动Activity一般有两种方式:Implicit(隐式) intent 和 Explicit(显式) intent 1. Explicit Intent:明确的指定了要启动的Acitivity ,比如以下Java代码,明确指定了要启动B:
2. Implicit Intent:不明确指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。当使用startActivity时,Implicit Intent解析到一个单一的Activity。如果存在多个Activity都有能力在特定的数据上执行给定的动作的话,Android会从这些中选择最好的进行启动 这就是问题之所在。 当一个安卓应用注册以从Android系统中收到Implicit System Intent的时候,它所通过的注册能够允许该应用接受任何ImplicitIntent 这种情况最容易导致的漏洞就是Intent Spoofing。当一个恶意APP不能发送一个Implicit System Intent的时候, 它可以通过Explicit Intent调用目标APP- 由于没有经过保护,受害者APP将不能识别Intent的来源,就会把恶意的Intent当成一个安全的内部组件行为,并提供一个错误或者恶意的行为。 APP通常从相同的应用中接受组件/模块,但是在Intent Spoofing中,如果组件是一个对外接口(exported)的话,那么任何恶意APP都能否发送Intent给该组件。换句话说,恶意APP能够通过发送某些意料之外的Intent到该外部组件来实现一个Intent Spoofing攻击。恶意APP可以伪造一个来自可信发送者Intent给Broadcast Receiver,后者在接受到之后就会认为是安全的。 如果一个Broadcast Receiver盲目相信任何输入的Broadcast Intent,那么它很有可能执行不当的操作,甚至有可能会直接处理broadcast恶意数据。Receivers通常将指令和数据传递给Service和Activity 在这种情况下恶意数据将能够扩散到整个APP内部,严重损害接受者的APP安全性和完整性。 Intent Spoofing的典型攻击:
Intent Spoofing的影响:未验证的恶意行为启动,间接登录,数据泄露如信用卡信息丢失。。。你懂的。 Intent Spoofing的自动检测:Coverity能够检测代码中的IMPLICIT_INTENT和MISSING_PERMISSION_FOR_BROADCAST问题: 1.IMPLICIT_INTENT IMPLICIT_INTENT 针对使用隐式意图启动活动或者启动、绑定或停止服务的代码报告缺陷。如果使用没有特定接收器组件的意图(隐式意图),将允许恶意应用程序注册以接收此意图并查看其中的所有信息。 IMPLICIT_INTENT 缺陷说明了被用于启动活动或者启动、绑定或停止服务的隐式意图。其他事件提供了分析为什么将该意图视为隐式意图的证据:意图被构造为隐式意图的路径,以及意图在不限制应该接收该意图的组件的情况下在程序中的流动方式。 2.MISSING_PERMISSION_FOR_BROADCAST MISSING_PERMISSION_FOR_BROADCAST 可报告有关以下代码的缺陷:在未设置权限的情况下发送广播。在没有获取权限的情况下发送广播会允许恶意应用程序接收该广播。MISSING_PERMISSION_FOR_BROADCAST 还可报告有关以下代码的缺陷:在未设置权限的情况下注册 BroadcastReceiver。在没有获取权限的情况下注册 BroadcastReceiver 会允许恶意应用程序将数据发送给该 BroadcastReceiver。 MISSING_PERMISSION_FOR_BROADCAST 缺陷表明在没有获取权限的情况下发送或接收广播。 Intent Spoofing的修复: 1. 控制通信 安卓平台有两个控制手段来限制对APP组件的通信,包括: a. Permission 为应用程序提供适当的权限,以防止恶意APP与被保护APP的通信。 b. Intent Type 避免Implicit Intent带来的更多潜在安全风险。 2. 输入验证 验证面向APP的任意输入,避免恶意数据和恶意行为。 3. 在Android Manifest文件中配置相关权限 设置文件中的android:exported字段,避免接受恶意Intent。 如果您需要使用Coverity,请联系韩葆:15210834682,[email protected] 关于作者: 韩葆(Bob Han),笔名韩逸松,毕业于北京工业大学计算机学院,曾就职于Sun中国研究院负责Solaris系统测试,后进入软件质量与安全测试领域,深入研究白盒测试、静态分析、网络协议 Fuzzing、渗透测试等技术和自动化工具。经历了研发测试行业和软件安全行业在中国从无到有,从小到大的整个过程。2013 年作为中国区首名工程师加入 Coverity(2014年被Synopsys收购),成功的将静态分析技术引入中国,在 2014 年和 2015 年两次作为中国质量竞争力大会演讲嘉宾介绍代码静态分析与软件安全测试技术。目前担任 Synopsys Software Integrity Group 客户经理,致力于软件团队的研发测试与软件安全平台搭建,改善软件质量,提高软件安全性,曾直接参与并协助BAT、网易、联想、华为等主流软件研发团队设计并部署软件质量与安全保障方案。 本文转载于微信公众号: 研发测试圈(yanfaceshi),更多微信文章请扫描关注公众号: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|