[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級別(https://docs.microsoft.com/zh-cn/xamarin/android/app-fundamentals/android-api-levels?tabs=windows)