Activity最小化特权检测安全问题

2020-04-26  本文已影响0人  Man不经心

最近公司的同事甩给我一份爱加密的应用安全监测报告,细看了一下,问题还不少,于是乎,我开始调研一些解决方案,本篇主要介绍四大组件的安全漏洞问题调研。

1. Activity最小化特权检测

1.1 问题描述

Activity的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。Activity组件设置导出权限,则该组件能够被外部的其他组件直接调用,这样就可能导致泄露隐私数据或者应用程序崩溃等风险。Activity被恶意应用调用,可能有以下威胁描述:修改程序的状态或者数据;被调用的Activity可能返回隐私信息给恶意应用,造成数据泄露;可能使应用程序崩溃,造成拒绝服务等漏洞。

抽取AndroidManifest.xml文件,扫描所有的Activity组件。
查看组件的EXPORTED属性,发现存在可以导出的组件。

问题代码

<activity
    android:name=".xxxActivity"
    android:exported="true"
    />

<p style = "color:red">也就是说,这个问题是由于exported属性设置为true导致的</p>

exported属性
总体来说它的主要作用是:是否支持其它应用调用当前组件。
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。

1.2 解决方案

1.3 优化流程

爱加固的报告中指出了多处问题代码,下面逐一排查:

<activity
    android:name=".xxx.SettingActivity"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <data
            android:host="host1"
            android:scheme="scheme1"/>

        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>

    </intent-filter>
</activity>

不妨测试一下这个功能,首先写一个html文件,配置urlscheme代码:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="minimum-scale=1.0, width=device-width, maximum-scale=1.0, user-scalable=no"/>
    <meta charset="utf-8">
    <title>Url Scheme Test</title>
</head>
<body>
<h1>Test</h1>
<a style="color: blue" href="scheme1://host1:8888">打开App设置</a>
</body>
</html>

在手机的浏览器中打开它,点击【打开App设置】

Web H5

浏览器会弹出这样授权框,确定,正常打开了我们App的设置页

App

尝试修改exported=false,再次测试,不弹窗,不打开,显然这与需求相悖,如果业务真实需要网页打开App的某些页面,那么这里是不能优化的.

 <activity
    android:name="com.igexin.sdk.GActivity"
    android:excludeFromRecents="true"
    android:exported="true"
    android:process=":pushservice"
    android:taskAffinity="com.igexin.sdk.PushActivityTask"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

在友盟分享的清单文件中我找到了WbShareTransActivity声明的代码

 <activity
    android:name="com.sina.weibo.sdk.share.WbShareTransActivity"
    android:launchMode="singleTask"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" >
    <intent-filter>
        <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

带着不怕死作死的精神,我尝试将SDK中的清单文件复制出来,在app工程中覆盖他们原来的代码,强行exported = false,看看会发生什么,注意,如果不添加tools:replace="android:exported,编译将无法完成

<activity
    android:name="com.igexin.sdk.GActivity"
    android:excludeFromRecents="true"
    android:exported="false"
    android:process=":pushservice"
    android:taskAffinity="com.igexin.sdk.PushActivityTask"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    tools:replace="android:exported"/>

OK,下面开始测试,如我们所料,端内推送可以正常接收。
端外推送或者厂商推送呢,在应用被杀死的情况下,就不保证能够接收到了,我们来看下关于GActivity的介绍
<p style = "background:#F1F1F1"><strong>com.igexin.sdk.GActivity</strong>
该组件无可视界面,可认为是针对一些后台管理针对启动类型为activity就允许启动而做了个取巧的方式,从而达到可以被其他应用唤醒启动,达到保持<b style= "color:red">正常推送</b>的功能。
该组件主要是维持个推推送服务的后台运行,反正被系统kill.当然主流的手机厂商等后台管理做的好的厂商一般都会识别,即使该组件是activity启动也不允许后台自运行。</p>

可以理解为个推为了保证推送的到达率,允许GActivity通过Service的方式被唤醒,其实这也符合我们对于自己开发应用的期待,更高的推送达到率.
所以这段代码呢,同样我的建议是不要修改不要修改不要修改

不管是GActivity还是WbShareTransActivity,他们被注册在各自的SDK文件中,尽管我们可以暴力地去覆盖它原来的属性,但是最好不要这么做,在不熟悉其内部原理的情况下(很遗憾,GAactivity被混淆了),未知的坑点可能使我们修改付出代价。


2.Service最小化特权检测

共五处:
GetuiPushService:个推推送
OppoPushService:oppo厂商推送
HmsMsgService:华为厂商推送
NotificationService:魅族厂商推送
PushMessageHandler:小米厂商推送

这些Service配置在个推及厂商推送SDK的清单文件下,不要要开发者处理,比如华为厂商推送

<!-- 接⼊入HMSSDK PUSH模块需要注册该service,不不需要开发者处理理 -->
<service
    android:name="com.huawei.hms.support.api.push.service.HmsMsgService"
    android:enabled="true"
    android:exported="true"
    android:process=":pushservice" >
    <intent-filter>
        <action android:name="com.huawei.push.msg.NOTIFY_MSG" />
        <action android:name="com.huawei.push.msg.PASSBY_MSG" />
    </intent-filter>
</service>

3. Broadcast Receiver最小化特权检测

共五处,与Service的五处相对应
PushReceiver:个推推送
HmsPushSubReceiver:华为厂商推送
SystemReceiver:魅族厂商推送
FlymePushReceiver:魅族厂商推送
MiuiPushReceiver:小米厂商推送


4.Content Provider

未发现异常


总结

四大组件特权化问题分别是指四大组件的最小化特权是指组件只能自身调用,其他应用无权访问,即组件不导出。
具体为:

解决思路

具体优化遵循以下原则:

参考资料:
https://www.jianshu.com/p/3792cf8de23f
https://blog.csdn.net/su749520/article/details/89283184
https://blog.csdn.net/u013293125

上一篇 下一篇

猜你喜欢

热点阅读