欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Pwn2Own华为HiApp漏洞原理与利用分析(下)

来源:本站整理 作者:佚名 时间:2018-06-08 TAG: 我要投稿

0×01 前言
Pwn2Own华为HiApp漏洞原理与利用分析(上)
阅读本篇的基础是先理解上篇的攻击构造链路。
0×02 漏洞分析
不知道有没有细心的同学发现我在上篇分析文章中留下的彩蛋。本篇自然是从这个彩蛋切入.
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

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载