3.4Manifest文件检测

文章目录
  1. 1. 1 AndroidManifest文件中PermissionGroup检测 # 04001
  2. 2. 2 AndroidManifest文件中系统权限使用检测 # 04002
  3. 3. 3 AndroidManifest危险ProtectionLevel权限检测 # 04003
  4. 4. 4 AndroidManifest sharedUserId 检测 # 04004
  5. 5. 5 AndroidManifest allowBackup标志检测 # 04005
  6. 6. 6 AndroidManifest文件Debuggable配置检测 # 04006
  7. 7. 7 非必要权限检测 # 04007
  8. 8. 8 app最低版本检测 # 04008

1 AndroidManifest文件中PermissionGroup检测 # 04001

PermissionGroup可以对permission进行一个逻辑上的分组。

首先我们要明晰两个概念,<permission>标签中的android:permissionGroup属性和<permission-group>标签是两个不同的东西。可以不定义相应的<permission-group>标签,但是如果在<permission>标签有permissionGroup属性,那么值应该不为空。如果permissionGroup的属性为空,会导致权限定义无效,且其他app无法使用该权限。

风险等级:提醒

问题示例:

分析AndroidManifest.xml中的<permission>标签中的属性,是否有permissionGroup,并检测其属性的值。若permissionGroup属性为空则将该检测项标注为提醒等级,并将有问题的代码段标注出来。

1
2
3
4
5
6
7
8
9
10
11
<permission-group
android:name="Today-is-sunday"
android:label="Hello-baby"
android:description="HelloWorld"/>

<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:permissionGroup=""
android:protectionLevel="normal" >
</permission>

建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:permissionGroup="LOVE_HAPPY"
android:protectionLevel="normal" >
</permission>

<!--或者去掉permissionGroup属性-->
<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:protectionLevel="normal" >
</permission>

查阅更多:

2 AndroidManifest文件中系统权限使用检测 # 04002

若App如果使用了一些系统限制权限,诸如android.permission.WRITE_SECURE_SETTINGSandroid.permission.INSTALL_PACKAGES,则该应用应该是设备自带的系统或Google自带的APP,并且应该放置在/system/app目录下,否则就是一个恶意APP。

若App使用下述权限,则该app有较高权限,要谨慎使用。

  • android.permission.MOUNT_FORMAT_FILESYSTEMS
  • android.permission.MOUNT_UNMOUNT_FILESYSTEMS
  • android.permission.RESTART_PACKAGES

风险等级:提醒

问题示例:

检测<uses-permission>中是否涉及以下权限的申请,若有其中的任何一个存在,则将该扫描项标注为提醒,并将又问题的代码段标注出来。

1
2
3
4
5
6
<uses-permission android.name="android.permission.WRITE_SECURE_SETTINGS">
<uses-permission android.name="android.permission.INSTALL_PACKAGES">

<uses-permission android.name="android.permission.MOUNT_FORMAT_FILESYSTEMS">
<uses-permission android.name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
<uses-permission android.name="android.permission.RESTART_PACKAGES">

建议:

根据业务需求,如非必要,移除这些高级别权限。

3 AndroidManifest危险ProtectionLevel权限检测 # 04003

由于应用自定义的permission的protectionLevel属性设置不当,会导致组件(如:content provider)数据泄露危险。最好的权限设置应为signaturesignatureOrSystem,进而避免被第三方应用利用。

风险等级:

提醒

问题示例

如果未设置protectionLevel,默认情况下,permission的protectionLevel为normal。若protectionlevel为normaldangerous或者未设置protectionLevel,均认为不安全,均将该扫描项标注为提醒,并标注问题的代码段。

1
2
3
4
5
6
7
<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:permissionGroup="TEST"
android:protectionLevel="normal" >
<!--protectionLevel为dangerous或者未设置protectionLevel均认为不安全-->
</permission>

建议:

1
2
3
4
5
6
7
<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:permissionGroup="TEST"
android:protectionLevel="signature" >
<!--或者将protectionLevel设置为signatureOrSystem-->
</permission>

查阅更多:

4 AndroidManifest sharedUserId 检测 # 04004

通过sharedUserId,可以让拥有同一个User Id的多个apk运行在同一个进程中,互相访问任意资源。将sharedUserId设置为android.uid.system,可以把app放到系统进程中,app将获得极大的权限。如果app同时有master key漏洞,容易导致被root。

风险等级:

如果sharedUserId设置为android.uid.system且app有master key漏洞,则是高危漏洞;若没有master key漏洞,则是提醒

问题示例:

先检测app/build.gradle中的minSdkVersion,若 <= 19,则说明其运行的系统可能存在mster key漏洞(Android系统 <= 4.4,即API Level <= 19存在master key漏洞)。此时若sharedUserId设置为android.uid.system,则标注为高危漏洞;若minSdkVersion >19 则是提醒。

1
2
3
4
5
6
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.coolweather.android"
android:sharedUserId="android.uid.system">
...
</manifest>

建议:

采用API等级高于19的系统。若非特殊的需求,一般不会将sharedUserId设置为android.uid.system

查阅更多:

5 AndroidManifest allowBackup标志检测 # 04005

当API Level>= 8时(其实小于8的API版本现在已经灭绝了),allowBackup这个标志被设置成true或不设置该标志位时,应用程序数据可以备份和恢复,adb调试备份允许恶意攻击者复制应用程序数据。

风险等级:低危

问题示例:

1
2
3
4
5
6
7
8
<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/logo"
android:label="@string/app_name" >
...
</application>

建议:

若无需备份程序的数据,可将allowBackup标志位设为false

1
2
3
4
<application
android:allowBackup="false">
...
</application>

若要备份程序的数据,可以采用设置自动备份程序的参数android:fullBackupContent=String,并添加相应的规则进行限制。这个自动备份会将用户保留在设备中的数据自动上传至用户的Google Drive帐户。它是在Android 6.0中引入的,使用的方式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.my.appexample">

...

<app ...
android:fullBackupContent="@xml/mybackupscheme">
</app>
...
</manifest>

在此示例代码中,android:fullBackupContent属性指定了一个 XML 文件。该文件名为mybackupscheme.xml,位于应用开发项目的 res/xml/ 目录中。 此配置文件包括关于要备份哪些文件的规则。 下列示例代码显示了将某一特定文件排除在备份之外的配置文件:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="database" path="device_info.db"/>
</full-backup-content>

此示例仅将一个特定数据库文件排除在备份之外,所有其他文件均予以备份。

查阅更多:

6 AndroidManifest文件Debuggable配置检测 # 04006

在AndroidManifest.xml中定义Debuggable项,如果该项被打开,app存在被恶意程序调试的风险,可能导致泄露敏感信息等问题。

风险等级:高危

问题示例:

android:debuggable这个标识用来表明该应用是否可以被调试,默认值为 false。但是我们在开发应用的测试版本是时候常常需要进行调试,所以会将debuggable设置为true,但是在发布的时候忘记设置成false了,这是就会埋下隐患。

1
2
<application android:debuggable="true"
</application>

建议:

不设置debuggable选项,或者将其设置成false,推荐使用后面一种。

1
2
<application android:debuggable="false"
</application>

查阅更多:

7 非必要权限检测 # 04007

检测一些在生产环境中不必要使用的权限.

  • android.permission.ACCESS_MOCK_LOCATION该权限是使在模拟器中使用,用于获取模拟定位信息,安装在用户手机中的应用不应该申请该权限。

风险等级:提醒

问题示例:

1
<uses-permssion android.name="android.permission.ACCESS_MOCK_LOCATION">

建议:

移除android.permission.ACCESS_MOCK_LOCATION权限

8 app最低版本检测 # 04008

罗列出跟最低版本相关的漏洞和bug,提醒开发者注意自己应用支持的最低版本的系统可能存在的问题。

风险等级:提醒

问题示例:

检测app/build.gradle中的minSdkVersion确定APP所支持的最低版本的系统API,对应到相应的Android版本上。

1
2
3
4
5
6
7
8
9
10
11
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"

defaultConfig {
applicationId "com.coolweather.android"
minSdkVersion 15
targetSdkVersion 28
versionCode 2
versionName "1.1"
}

下图是不完整的Android版本与API的对应关系,详细的可以查看查阅更多中的资料。

Android版本与API的对应关系

查阅更多: