ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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)