[TOC]
## 1 AndroidManifest文件中PermissionGroup检测 # 04001
PermissionGroup可以对permission进行一个逻辑上的分组。
首先我们要明晰两个概念,`<permission>`标签中的`android:permissionGroup`属性和`<permission-group>`标签是两个不同的东西。可以不定义相应的`<permission-group>`标签,但是如果在`<permission>`标签有permissionGroup属性,那么值应该不为空。如果permissionGroup的属性为空,会导致权限定义无效,且其他app无法使用该权限。
风险等级:`提醒`
问题示例:
分析AndroidManifest.xml中的`<permission>`标签中的属性,是否有permissionGroup,并检测其属性的值。若permissionGroup属性为空则将该检测项标注为`提醒`等级,并将有问题的代码段标注出来。
```
<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>
```
建议:
```
<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>
```
查阅更多:
* https://developer.android.google.cn/guide/topics/manifest/permission-group-element
* http://blog.csdn.net/feng88724/article/details/6409313
* http://blog.csdn.net/reboot123/article/details/14451123
* http://www.blackmoonit.com/2012/07/android-custom-permissions/
## 2 AndroidManifest文件中系统权限使用检测 # 04002
若App如果使用了一些系统限制权限,诸如`android.permission.WRITE_SECURE_SETTINGS`和`android.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>`中是否涉及以下权限的申请,若有其中的**任何一个存在**,则将该扫描项标注为提醒,并将又问题的代码段标注出来。
```
<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)数据泄露危险。最好的权限设置应为`signature`或`signatureOrSystem`,进而避免被第三方应用利用。
风险等级:
`提醒`
问题示例
如果未设置protectionLevel,默认情况下,permission的protectionLevel为`normal`。若protectionlevel为`normal`或`dangerous`或者未设置protectionLevel,均认为不安全,均将该扫描项标注为`提醒`,并标注问题的代码段。
```
<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:permissionGroup="TEST"
android:protectionLevel="normal" >
<!--protectionLevel为dangerous或者未设置protectionLevel均认为不安全-->
</permission>
```
建议:
```
<permission
android:name="TEST_GO"
android:label="@string/app_name"
android:permissionGroup="TEST"
android:protectionLevel="signature" >
<!--或者将protectionLevel设置为signatureOrSystem-->
</permission>
```
查阅更多:
* http://www.wooyun.org/bugs/wooyun-2010-039697
* http://drops.wooyun.org/mobile/16382
* https://security.tecent.com/index.php/blog/msg/6
## 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 则是提醒。
```
<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`。
查阅更多:
* http://www.cnblogs.com/wotakuc/archive/2013/03/27/2984423.html
* http://www.saurik.com/id/17
* https://books.google.com.hk/books?id=UgVhBgAAQBAJ&pg=PA230&lpg=PA230&dq=android.uid.system+master+key&source=bl&ots=SWA4ugfgI1&sig=Nx6X1ORGXHWnntVrlNP15R32wSw&hl=zh-CN&sa=X&ved=0ahUKEwinrqDvwanNAhVCUZQKHbXZDRgQ6AEIMzAD#v=onepage&q=android.uid.system%20master%20key&f=false
## 5 AndroidManifest allowBackup标志检测 # 04005
当API Level>= 8时(其实小于8的API版本现在已经灭绝了),allowBackup这个标志被设置成true或**不设置该标志位**时,应用程序数据可以备份和恢复,adb调试备份允许恶意攻击者复制应用程序数据。
风险等级:`低危`
问题示例:
```
<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/logo"
android:label="@string/app_name" >
...
</application>
```
建议:
若无需备份程序的数据,可将allowBackup标志位设为false
```
<application
android:allowBackup="false">
...
</application>
```
若要备份程序的数据,可以采用设置自动备份程序的参数`android:fullBackupContent=String`,并添加相应的规则进行限制。这个自动备份会将用户保留在设备中的数据自动上传至用户的Google Drive帐户。它是在Android 6.0中引入的,使用的方式如下所示:
```
<?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/ 目录中。 此配置文件包括关于要备份哪些文件的规则。 下列示例代码显示了将某一特定文件排除在备份之外的配置文件:
```
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="database" path="device_info.db"/>
</full-backup-content>
```
此示例仅将一个特定数据库文件排除在备份之外,所有其他文件均予以备份。
查阅更多:
* https://blog.csdn.net/self_study/article/details/54020909
* https://blog.csdn.net/smzhangyang/article/details/47301053
* https://blog.csdn.net/maoxian007/article/details/79878924
## 6 AndroidManifest文件Debuggable配置检测 # 04006
在AndroidManifest.xml中定义Debuggable项,如果该项被打开,app存在被恶意程序调试的风险,可能导致泄露敏感信息等问题。
风险等级:`高危`
问题示例:
`android:debuggable`这个标识用来表明该应用是否可以被调试,默认值为 false。但是我们在开发应用的测试版本是时候常常需要进行调试,所以会将debuggable设置为true,但是在发布的时候忘记设置成false了,这是就会埋下隐患。
```
<application android:debuggable="true"
</application>
```
建议:
不设置debuggable选项,或者将其设置成false,推荐使用后面一种。
```
<application android:debuggable="false"
</application>
```
查阅更多:
* https://developer.android.google.cn/guide/topics/manifest/application-element#debug
## 7 非必要权限检测 # 04007
检测一些在**生产环境**中不必要使用的权限.
* `android.permission.ACCESS_MOCK_LOCATION`该权限是使在模拟器中使用,用于获取模拟定位信息,安装在用户手机中的应用不应该申请该权限。
风险等级:`提醒`
问题示例:
```
<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版本上。
```
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的对应关系](http://wiki-1252789527.picsh.myqcloud.com/scan_model/Android%E7%89%88%E6%9C%AC%E5%8F%B7%E4%B8%8EAPI.png)
查阅更多:
* Android API级别(https://docs.microsoft.com/zh-cn/xamarin/android/app-fundamentals/android-api-levels?tabs=windows)