前言
此文档旨在大家提供Android平台APP安全风险与漏洞相关的一般性Checklist,保障安全评估测试的基础质量与效率。
配置安全
发布状态检查
该类漏洞的审查场景:发布的代码未启用代码混淆、未关闭调试模式、未关闭不必要的日志输出、或者含有内网IP地址等信息 |
漏洞类型说明:
发布状态检查:如果APP未启用代码混淆或者其他抵抗分析的机制,或者在AndroidManifest.xml中定义了android:debuggable为true,或者没有限制日志输出的级别可能导致攻击者更容易地分析APP的运行机制,更方便地发现其中潜在的安全漏洞,以及信息泄露的风险。如果APP发布时未移除代码中保存的公司内部IP地址或域名信息,也将导致公司内网信息泄露。
审核点及方法:综合分析判断APP是否在发布前进行了充分的检查。
黑盒方法:利用dex2jar等工具对apk文件进行逆向,观察代码是否被混淆。分析AndroidManifest.xml文件,检查android:debuggable是否设置为true(缺省为false),通过logcat观察日志输出,在源码与xml文件中查找是否泄露公司敏感信息。
权限申请
该类漏洞的审查场景:APP权限申请 |
漏洞类型说明:
关于权限申请问题,其实不能算作是漏洞,而是一个安全设计原则,即权限分配最小化原则,APP申请权限应当遵循最小化原则,禁止申请不必要的冗余权限。
自定义权限
该类漏洞的审查场景:APP自定义权限 |
漏洞类型说明:
根据官方建议[1],尽量避免自定义权限。如果必须自定义权限,建议保护级别设定为"Signature"。原因是保护级别为"Dangerous"的权限,其他APP可能也会申请该权限,而这些特定权限的说明可能会让用户困惑,而用户感到困惑时,通常忽视权限申请直接批准。
审核点及方法:检查AndroidManifest.xml文件中是否通过permission定义了权限,检查这些权限的protectionLevel是否为signature,若否,那么这些权限很可能被第三方申请。可进一步考察这些权限用于保护的功能,评估权限被第三方APP获取后可能造成的危害。
签名有效性校验
该类漏洞的审查场景:对APK文件进行反编译之后重新打包签名安装 |
漏洞类型说明:
签名有效性校验:如果APP在实现逻辑中缺乏对签名文件合法性的校验,黑客可以对APK文件反编译(可利用apktool工具d选项),并按照自己的意图对APK代码进行篡改,然后将篡改后的文件重新编译打包(可利用apktool工具的b选项),最后使用自定义的签名文件对打包APK文件签名(可利用keytool,jarsigner,zipalign工具)。这样,黑客可以向APP中植入恶意代码,并将重新编译打包的APK文件分发出去。
审核点及方法:判断APP的实现逻辑中是否对签名文件的合法性进行校验。
黑盒方法:将原始APK反编译,篡改其中的代码,重新编译打包APK,并用自定义生成的签名文件对其签名,安装APK,验证其是否能正常运行,若APP能正常运行,说明其实现中缺乏对签名有效的校验。
数据安全
存储安全
该类漏洞的审查场景:APP数据本地存储方式 |
漏洞类型说明:
数据存储安全:分析APP本地数据存储的安全,主要从三个方面考虑:① 高度敏感数据禁止存储在客户端(比如用户密码);② 敏感数据必须设置为私有访问权限(禁止使用Context.MODE_WORLD_READABLE、Context.MODE_WORLD_WRITEABLE模式创建私有文件);③ 禁止向外部存储设备(SD卡)写入敏感信息,对来自外部存储设备的数据,处理前必须校验数据的完整性、合法性。
- 场景:/data/data/<package_name>目录
审核点及方法:/data/data/<package_name>是Android系统分配给APP的默认私有存储目录,典型结构如下:
/data/data/<package_name>目录中的文件只属于对应的APP,只允许所属APP访问该目录的文件,如果开发者将文件的访问模式设置为Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,将导致文件全局可读/写,造成文件可被任意APP访问。如下:
可以看到loginshare.json的访问权限是第三方可读的,这样系统中已安装的任意APP都可以访问到loginshare.json中的内容,导致敏感信息泄露。
黑盒方法:通过adb shell连接Android模拟器或者测试机(要求拥具备root访问权限),进入对应的/data/data/<package_name>目录,查看各个文件的访问权限和存储内容,确保两个方面:1. 无论文件权限如何设置,文件都不能存储高敏感信息,比如密码;2. 所有文件的权限都应当设置为禁止第三方APP读/写。