这一章我们来学习“Intent Scheme URLs攻击风险”,网上的文章关于这个风险的介绍可谓是千篇一律,翻阅下来之后发现内容大致相同,单看这些文章的介绍仍然让人感觉到云里雾里,故此篇文章中会讲清楚这风险的产生和应对方法。
一、漏洞原理
利用intent scheme URLs(意图协议URL),可以通过web页面发送intent来启动App应用。攻击者可构造特殊格式的URL直接向系统发送意图,启动App应用的Activity组件或者发送异常数据,导致应用的敏感信息泄露或者应用崩溃。 上述的漏洞描述中可知,通过web页面发送intent来启动App应用 这个操作没有经过过滤和校验 那么就会存在风险。我们来拆解一下上述的文字。 (1)web页面: 一般指的是被检测的APP,也就是说被检测APP有浏览器功能,并支持Intent Scheme协议,相当于被检测APP是一个桥梁 。当然若是APP使用了Intent.parseUri方法,并且uri来自于外部输入的话,就算没有浏览器功能,也可能产生此漏洞 (2)启动App应用: 一般启动的是任意APP的暴露的Activity组件
综上可知:Intent Scheme URLs攻击风险,一般会和其它漏洞进行综合利用,比如:Intent Scheme URLs攻击 + Activity组件暴露 = 可产生拒绝服务漏洞(APP崩溃)、WebView相关漏洞(加载恶意页面、远程代码执行等)、APP静默下载安装等。若被检测APP存在intent scheme URLs漏洞,这就会导致手机设备内的任意APP若存在可关联的漏洞,那么就可以通过Intent Scheme URLs漏洞进行恶意攻击
二、前置知识
通过漏洞原理可以了解到漏洞产生的原因,那么现在来了解一下和这个漏洞相关的一些知识 (1)Intent Scheme协议: 通过浏览器(WebView)加载URI的形式使用Intent协议跳转到指定的app页面。一般使用Intent.parseUri(String uri,int flags)方法,来构造Intent。第二个参数的值的会影响Scheme协议的构造方式,大致如下: a. Intent.URI_INTENT_SCHEME: 经常使用,URI形式类似:scheme://host:port/path b. Intent.URI_ANDROID_APP_SCHEME: URI形式类似:android-app://{package_id}[/{scheme}[/{host}[/{path}]]][#Intent;{...}] c. Intent.URI_ALLOW_UNSAFE: 一般不使用,不太安全
(2)android.intent.category.BROWSABLE: android.intent.category.BROWSABL 的意思就是允许浏览器在特定条件下可以打开APP的Activity,例如:
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="test"
android:host="aaa.com"
android:path="/from"
android:port="8088"/>
</intent-filter>
</activity>
通过 Intent.parseUri("test://aaa.com:8088/from?type=abcd",Intent.URI_INTENT_SCHEME) ,构造Intent即可启动MainActivity
三、检测手段
step1: 扫描全局代码,是否存在使用Intent.parseUri step2: 若URI来源于外部的输入,并使用了Intent.parseUri 方法,那么获取的Intent必须严格过滤,判断Itent是否至少包含addCategory(“android.intent.category.BROWSABLE”),setComponent(null),setSelector(null) 3个策略。若URI在代码内硬编码,则针对此URI进行漏洞测试。 step3: 汇总结果
四、修复方法
1、如果使用了Intent.parseUri 方法,那么必须对获取的intent进行严格过滤,intent至少包含addCategory(“android.intent.category.BROWSABLE”),setComponent(null),setSelector(null) 3个策略 2、对于外部来源的intent要进行严格过滤,也可设立白名单。
|