- 1. 1 AndroidManifest文件中PermissionGroup检测 # 04001
- 2. 2 AndroidManifest文件中系统权限使用检测 # 04002
- 3. 3 AndroidManifest危险ProtectionLevel权限检测 # 04003
- 4. 4 AndroidManifest sharedUserId 检测 # 04004
- 5. 5 AndroidManifest allowBackup标志检测 # 04005
- 6. 6 AndroidManifest文件Debuggable配置检测 # 04006
- 7. 7 非必要权限检测 # 04007
- 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 | <permission-group |
建议: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>
查阅更多:
- 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>
中是否涉及以下权限的申请,若有其中的任何一个存在,则将该扫描项标注为提醒,并将又问题的代码段标注出来。
1 | <uses-permission android.name="android.permission.WRITE_SECURE_SETTINGS"> |
建议:
根据业务需求,如非必要,移除这些高级别权限。
3 AndroidManifest危险ProtectionLevel权限检测 # 04003
由于应用自定义的permission的protectionLevel属性设置不当,会导致组件(如:content provider)数据泄露危险。最好的权限设置应为signature
或signatureOrSystem
,进而避免被第三方应用利用。
风险等级:
提醒
问题示例
如果未设置protectionLevel,默认情况下,permission的protectionLevel为normal
。若protectionlevel为normal
或dangerous
或者未设置protectionLevel,均认为不安全,均将该扫描项标注为提醒
,并标注问题的代码段。
1 | <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>
查阅更多:
- 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 则是提醒。
1 | <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调试备份允许恶意攻击者复制应用程序数据。
风险等级:低危
问题示例:
1 | <application |
建议:
若无需备份程序的数据,可将allowBackup标志位设为false1
2
3
4<application
android:allowBackup="false">
...
</application>
若要备份程序的数据,可以采用设置自动备份程序的参数android:fullBackupContent=String
,并添加相应的规则进行限制。这个自动备份会将用户保留在设备中的数据自动上传至用户的Google Drive帐户。它是在Android 6.0中引入的,使用的方式如下所示:
1 | <?xml version="1.0" encoding="utf-8"?> |
在此示例代码中,android:fullBackupContent
属性指定了一个 XML 文件。该文件名为mybackupscheme.xml,位于应用开发项目的 res/xml/ 目录中。 此配置文件包括关于要备份哪些文件的规则。 下列示例代码显示了将某一特定文件排除在备份之外的配置文件:
1 | <?xml version="1.0" encoding="utf-8"?> |
此示例仅将一个特定数据库文件排除在备份之外,所有其他文件均予以备份。
查阅更多:
- 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了,这是就会埋下隐患。
1 | <application android:debuggable="true" |
建议:
不设置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 | android { |
下图是不完整的Android版本与API的对应关系,详细的可以查看查阅更多中的资料。
查阅更多: