Introduction(介绍)
Intent scheme URL是一种特殊类型的URL,它使网页能够启动已安装的Android应用程序的活动。一般来说,意图方案URL会带来安全风险,因为它使恶意网页有机会对安装的应用程序进行基于意图的攻击。在本报告中,我们将首先解释什么是意图计划URL,然后介绍三个与意图计划URL有关的安卓浏览器漏洞的例子(包括盗取cookie文件和通用XSS),最后展示这些漏洞的应对措施。
About intent scheme URL(关于intent scheme URL)
意图计划URL的使用例子如下。
1: <script>
2: location.href = "intent:mydata1#Intent;action=myaction1;type=text/plain;end";
3: </script>
如果支持意图方案URL的浏览器加载网页,它们会根据URL生成一个意图对象,然后尝试按意图启动活动。这个浏览器的过程可以分为三个步骤。
Step1.Parsing URL(解析URL)
浏览器的第一个任务是根据意图方案的URL生成意图对象。对于这项任务,浏览器使用了Android框架中的android.content.Intent.parseUri() 。
1: Intent intent = Intent.parseUri(uri);
简而言之,这个方法解析name=value形成的属性,如URL片段中的 "action=..."、"category=... "和 "launchFlags=...",然后生成一个带有这些属性的意图对象。
就上述例子而言,该方法生成的意图对象有 "myaction1 "动作和 "text/plain "类型。
一般来说,带有自定义方案的URL(如blahscheme://host/path)经常被用来从网页上启动一个活动。与自定义方案相比,intent方案有两个优点。其一是intent方案不需要目标应用程序在清单中定义方案,另一个优点是它可以在URL中包含意图的额外内容。下面是一个带有额外内容的意图方案URL的例子。
intent://foobar/#Intent;action=myaction1;type=text/plain;S.xyz=123;end
在这个例子中,要生成的意图对象有一个额外的条目,其名称为 "xyz",值为 "123"。名称部分的第一个字符代表额外值的类型,例如,"S "表示字符串,"i "表示整数。
关于intent scheme URL语法的更多细节,请参见Intent.parseUri()的源代码[1]或Chrome文档[2]。遗憾的是,安卓API文档对这个方法的解释不多,所以意图方案URL不可能在应用开发者和安全研究人员中广为人知。
Step2.Filtering intent(筛选意图)
为了安全起见,大多数浏览器会过滤步骤1中生成的意图对象。该过滤器是对基于意图的攻击的一种保护,该攻击使用源自不可信任的网页的意图方案URL。
每个浏览器都使用自己的过滤器,我们发现其中有几个是不充分的,甚至是不存在的。本文后面将解释这种缺陷的三个例子。
Step3.Launching activity(发起活动)
浏览器的最后一项任务是用步骤2中过滤出的意图来启动活动。浏览器通常使用Context#startActivityIfNeeded()或Context#startActivity()来完成这项任务。
如前所述,大多数主要的浏览器都支持意图方案的URL。
| 浏览器 | 意图方案支持 | 应用包名称 | 版本 |
| ------------------------ | ------------ | ---------------------------- | ------------------- |
| Old Stock Browser | √ | com.android.browser | (for android 4.2.2) |
| Chrome for Android | √ | com.android.chrome | 30.0.1599.92 |
| Opera brower for Android | √ | com.opera.browser | 16.0.1212.64462 |
| Samsung Browser | √ | com.sec.android.app.sbrowser | 1.0(on Galaxy S4) |
| Firefox for Android | - | org.mozilla.firefox | 26.0 |
如上表所示,除Firefox外,其他浏览器都支持意图方案的URL。
Attack scenarios(攻击场景)
有两种利用意图方案URL的攻击场景。
Type1.Attacks against browser apps(针对浏览器应用程序的攻击)
意图方案的URL可以用来攻击浏览器应用程序。重要的是,攻击者的网页不仅可以向公共活动发送意图,还可以向浏览器应用程序的私人(未导出的)活动发送意图。这是可能的,因为意图的发送者只是浏览器应用程序本身。 我们在下一节中介绍了这种类型的几个真实例子。
Type2. Attacks against any installed app(针对任何已安装的应用程序的攻击)
基于意图的漏洞通常只能从已安装的恶意应用程序中利用。 然而,通过利用意图方案URL,驻留在浏览器中的网页可能能够成功地对已安装的应用程序进行基于意图的攻击。我们在东京举行的Mobile Pwn2Own 2013比赛中使用了这一技术,从恶意网页上控制了三星Galaxy S4 [3]。
Vulnerabilities(漏洞)
在我们的研究中,我们发现了三个可通过意图方案URL利用的浏览器漏洞。这些漏洞的原因是在过滤步骤中(在第2节 "步骤2.过滤意图 "中描述)。这些漏洞的概要解释如下。
1.Opera mobile for Android cookie theft(安卓版Opera的cookile被盗)
Opera浏览器的过滤步骤完全没有。因此,Opera中的网页能够通过意图计划的URL启动Opera的任何私人活动。一个攻击代码的例子如下。
1: <script>
2: location.href = "intent:#Intent;S.url=file:///data/data/com.opera.browser/app_opera/cookies;c
omponent=com.opera.browser/com.admarvel.android.ads.AdMarvelActivity;end";
3: </script>
通过使用这段代码,攻击者可以启动 "com.admarvel.android.ads.AdMarvelActivity "活动,这是一个Opera浏览器的私人活动。攻击的URL包含一个字符串 "url=file://data/data/com.opera.browser/app_opera/cookies",这是存储Opera浏览器cookies的文件的位置。
AdMarvelActivity确实支持JavaScript的WebView中加载了URL(指向cookie文件),并将其渲染为HTML。因此,cookie文件中的恶意HTML/JavaScript在cookie文件的上下文中被执行。这意味着,如果攻击者事先用如下所示的代码污染了cookie文件,他就可以窃取cookie文件的全部内容。
1: <script>
2: document.cookie = "x=<script>(javascript code)</scr"+"ipt>; path=/blah; expires=Tue, 01-Jan-20
30 00:00:00 GMT";
3: </script>
我们于2013年11月向IPA(日本信息技术促进机构)报告了这个漏洞,并附上了工作PoC代码。
JPCERT/CC(与IPA合作的日本CSIRT组织)向供应商报告了该问题,供应商的修复方案于2014年1月发布。CVE-2014-0815被分配给这个问题[4]。
2.Chrome for Android UXSS (Universal XSS)(谷歌浏览器通用xss漏洞)
针对Chrome浏览器的攻击就比较复杂了。安卓版Chrome浏览器包含如下的Java代码。
1: Intent intent = Intent.parseUri(uri);
2: intent.addCategory("android.intent.category.BROWSABLE");
3: intent.setComponent(null);
4: context.startActivityIfNeeded(intent, -1);
在第二行中,Chrome将启动的活动限制在具有BROWSABLE类别的活动。
在第三行中,Chrome禁止明确的调用。这些限制是针对基于意图的攻击的措施。
然而,这些措施是不够的,我们可以通过 "selector intent "来绕过这些,这在API文档[5]中有一点解释。 选择器意图是Android API级别15(Android 4.0.3)中引入的一种机制。它是一个额外的意图对象,可以附加到一个主意图对象上。如果主意图有一个选择器意图,Android框架不是通过主意图而是通过其选择器意图来解决意图的目的地。
选择器意图是Android API level 15(Android 4.0.3)中引入的一种机制。它是一个额外的意图对象,可以附加到一个主意图对象上。如果主意图有一个选择器意图,Android框架不是通过主意图而是通过其选择器意图来解决意图的目标。
意图方案URL可以包含选择器意图,如下所示。
intent:#Intent;S.XXX=123;SEL;component=com.android.chrome/.xyz;end
URL的 "SEL "部分是选择器意图的指标。
安卓版Chrome浏览器向com.android.chrome/.xyz组件传递这一意图,即使该组件没有BROWSABLE类别。恶意网页可以利用这一点对Chrome的私人活动进行攻击(包括没有BROWSABLE类别的网页)。
现在的问题是,Chrome浏览器是否有私人(或公共)活动,可以用来进行重大的基于意图的攻击。在我们的研究中,我们发现WebappActivity可以用来进行UXSS(通用XSS)攻击。下面是JavaScript代码中的一个攻击例子。
1: <script>
2: // open target web page (http://victim.example.jp/) in WebAppActivity0
3: 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";
4:
5: // a few seconds later, inject javascript payload into target web page
6: setTimeout(function() {
7: location.href = "intent:#Intent;S.webapp_url=javascript:(malicious javascript code);l.weba
pp_id=1;SEL;component=com.android.chrome/com.google.android.apps.chrome.webapps.WebappActivit
y0;end";
8: }, 2000);
9: </script>
在上述代码中,恶意网页明确地启动了两次 "com.google.android.apps- .chrome.webapps.WebappActivity0"。这个活动是一个私有活动,它没有BROWSABLE类别,但网页可以通过使用带有选择器意图的意图方案URL来启动这个活动。
在我们的PoC中,第一次启动迫使WebappActivity0加载目标网页,第二次启动将恶意的JavaScript代码注入到目标网页中。这意味着攻击者可以将其JavaScript有效载荷注入任意的http/https网页(通用XSS)。
据我们所知,老版本的Chrome for Android(v.30.0.1599.92)容易受到这种UXSS攻击。较新的版本不再容易受到攻击,因为WebappActivity被修改为在一个新创建的标签中打开第二个URL。然而,潜在的风险仍然存在,因为当前版本的Chrome浏览器仍然没有过滤选择器的意图,因此,恶意网页可以启动Android版Chrome浏览器的私人活动。
3.Old stock brower cookie theft
安卓原版浏览器(com.android.browser)也有类似的漏洞。与安卓版Chrome浏览器一样,原版浏览器没有正确过滤选择器的意图,因此攻击者的网页可以启动浏览器的任意活动。 这一缺陷可以被用于像Opera浏览器那样的cookie文件盗窃攻击。但最近型号的安卓设备(>=安卓4.3)可能不会受到影响,因为旧的库存浏览器不再预装在最近的设备上。
Conscious(总结)
在这份报告中,我们解释了使用意图方案URL的攻击机制,以及Android浏览器的三个漏洞。如第4节所示,对意图方案URL的不当处理可能会导致严重的漏洞,如cookie文件被盗和来自远程网页的UXSS。 对这类攻击的措施是更严格地过滤意图对象(由意图方案URL转换而来),如以下Java代码所示。
1: // convert intent scheme URL to intent object
2: Intent intent = Intent.parseUri(uri);
3: // forbid launching activities without BROWSABLE category
4: intent.addCategory("android.intent.category.BROWSABLE");
5: // forbid explicit call
6: intent.setComponent(null);
7: // forbid intent with selector intent
8: intent.setSelector(null);
9: // start the activity by the intent
10: context.startActivityIfNeeded(intent, -1);
最后,我们想谈谈其他浏览器应用中可能存在的风险。如你所知,世界上有许多适用于安卓的浏览器,但我们只调查了第2节中列出的那些浏览器。 本文中没有提到的浏览器可能会受到使用意图计划URL的攻击,因为许多浏览器似乎是基于易受攻击的原版浏览器开发的。
References
[1] https://android.googlesource.com/platform/frameworks/base/+/android-4.3.1_r1/core/java
/android/content/Intent.java
[2] https://developers.google.com/chrome/mobile/docs/intents
[3] http://h30499.www3.hp.com/t5/HP-Security-Research-Blog/Local-Japanese-team-exploit
s-mobile-applications-to-install/ba-p/6267417
[4] http://jvndb.jvn.jp/en/contents/2014/JVNDB-2014-000014.html
[5] http://developer.android.com/reference/android/content/Intent.html#setSelector(android.
content.Intent)