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

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

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

0×01 简介
ps:本文从攻击者的角度来分析如何发现Pwn2Own华为手机漏洞,但不代表与漏洞发现者的思路相同,仅供参考。本系列漏洞分析由于涉及大量代码分析,所以拆分为四部分,也比较容易阅读和理解消化。
攻击视频详细可参见Pwn2own Blog
官方公告: http://www.huawei.com/en/psirt/security-advisories/huawei-sa-20171120-01-hwreader-en
漏洞可直接造成任意目录遍历、删除、任意代码执行等高危操作
漏洞版本:
Huawei Read – 8.0.1.303
HiApp – 7.3.0.305
0×01 漏洞分析
第一部分 HiApp白名单绕过
首先找到切入点,即AndroidManifest.xml中,审计发现有一个Activity暴露了出来(默认exported = true),依此作为切入点,进入到com.huawei.appmarket.service.externalapi.view.ThirdApiActivity 中查看源代码进行分析。
activity android:configChanges="orientation|screenSize" android:launchMode="singleTop" android:name="com.huawei.appmarket.service.externalapi.view.ThirdApiActivity" android:theme="@style/loading_activity_style">
intent-filter>
    action android:name="android.intent.action.VIEW" />
    category android:name="android.intent.category.DEFAULT" />
    category android:name="android.intent.category.BROWSABLE" />
    data android:host="details" android:scheme="appmarket" />
    data android:host="search" android:scheme="market" />
    data android:host="a.vmall.com" android:scheme="https" />
    data android:host="com.huawei.appmarket" android:scheme="hiapp" />
intent-filter>
切入ThirdApiActivity.java
protected void onCreate(Bundle arg2) {
    this.setTitle();
    this.protocolPolicy = DefaultProtocolPolicy.getProtocolPolicy();
    this.protocolPolicy.onCreate(this, arg2);  // 初始化了protocolPolicy
    super.onCreate(arg2);
}
public void onCreateContinue() {
    this.action = ExternalActionController.getAction(((CallBack)this));  // 初始化action
    if(this.action == null) {
        this.finish();
    }
    else {
        this.protocolPolicy.check(this, this.action.useCacheProtocol()); //切入关键点
    }
}
接着进入check函数进行查看,可以看到经过函数l.a()检查后,回调onAgree函数
public void check(ThirdApiActivity mThirdApiActivity, boolean flag) {
        if(!l.a()) {
            mThirdApiActivity.onShow();
            l.a(mThirdApiActivity.getActivity(), new ProtocolResultHandler(((IProtocolCheck)mThirdApiActivity)));
        }
        else {
            mThirdApiActivity.onAgree();
        }
}
而后onAgree函数调用了this.action的onAction函数。那么我们的目标就是需要追踪到对应action类的onAction函数再分析其逻辑,方法是先查看上述getAction函数,找出对应action的类。
public static IExternalAction getAction(CallBack callBack) {
        ... //代表省略一些无关代码,简化阅读
        Intent intent = callBack.getIntent();
        ...
        String action = intent.getAction();
        if(TextUtils.isEmpty(((CharSequence)action))) {
            action = "com.huawei.appmarket.ext.public";
        }
        Object clazz = ExternalActionController.ACTIVITY_MAPS.get(action);//关键在这里获取到Action对应的Class,也即由ACTIVITY_MAPS中获取
        ...
        clazz = ((Class)clazz).getConstructor(CallBack.class).newInstance(callBack);
        return clazz;
 }
那么接下来的思路就是获取ACTIVITY_MAPS的内容,首先自然需要找到put值的地方,然后通过寻找引用就能找到赋值的地方。
public static void register(String arg1, Class arg2) {
        ExternalActionController.ACTIVITY_MAPS.put(arg1, arg2);
}
通过查找register函数的引用,即可查找到init函数调用该函数进行注册,具体有两处,如下代码。可以看到,响应android.intent.action.VIEW这个Action的类有两个,分别是ViewAction.class和AppViewAction.class,实际上二者为子父类关系。

[1] [2] [3] [4] [5] [6] [7]  下一页

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