1、测试指标
2、测试环境
SDK: Java JDK ,Android SDK
工具: 7zip dex2jar jd-gui apktool activity 劫持工具
3、安装包签名
在Android中,包名相同的两个APK会被认为是同一个应用,新版本覆盖旧版本的时候签名证书必须一致。如果APK没有使用自己的证书进行签名,将失去对版本管理主动权。
检测: jarsinger.exe -verify APK 文件路径 -verbose -certs
需要注意的是只有使用直接客户端的证书签名的时候,才认为是安全的,Debug 证书、第三方(开发)证书均存在安全风险。
2、反编译保护
测试客户端的安装程序,判断是否能够反编译成代码, JAva代码和SO文件是否存在代码混淆等保护,未做保护的Java 代码,可以分析器运行的逻辑,并对代码中的缺陷对客户端和服务器端进行测试
测试步骤,将APK当成ZIP并解压,得到Classes.dex文件,使用 dex2java.bat 执行 dex2jar.bat classes.dex 文件路径
得到 classes.dex.jar 文件,然后使用 jd-GUI 打开 JAVA文件,可以得到JAVA代码
(注意,直接使用 smali2java打开 apk文件 ,也可以反编译 JAVA代码)
(注意:有时候使用 Apktool 能够解包并查看 Smali,但是dex2jar却不行,如果 dex2jar反编译失败的时候,可以试试能否恢复smali代码)
逆向之后如果源代码没有混淆则表明 不安全的,如果代码经过混淆,或者加壳措施,不能完整恢复代码,则是安全的
安全建议,建议客户端程序可以把关键的代码一JNI方式放在SO 库里,SO库中是经过编译的ARM汇编代码,可以对其进行夹壳保护,防止逆向分析。
3、应用完整性校验
测试客户端程序是否对自身完整性进行完整性校验,
java -jar apktool.jar d -f apk 文件路径 -o 解包目标文件夹
随便找一个解包目录里面的资源文件,修改它,推荐找logo之类的图进行修改。使用APKTool 将解包的目录重新打包成未签名的APK文件。 命令如下 :
java -jar apktool.jar b -f 待打包的文件夹 -O 输出的 apk路径
用SignAPK ,对未前面的APK文件进行签名,命令如下;
java -jar signapk.jar testkey.x509.pem testky.pk8 待签名 apk文件路径 签名 后输出apk 路径
将签名的APK安装 ,运行 ,确认是否存在自校验 需要注意之前安装的APK和修改之后的APK签名不同,就不能直接覆盖安装,二是需要卸载之前安装额APP。若应用完整性校验不适用MANIFEST.MF中的数据,且核心代码通过JNI技术写入 .so库,同时服务端进行相关校验,此时无风险。 若应用完整性与本地进行验证二不存在与其他问题或使用MANIFEST.MF 中的数据作为验证凭据(有新文件时它提示应用完整性验证失败) 此时低风险。 若在本地进行验证的基础上只通过MANIFEST,MF 对客户端原有文件进行校验二忽略性增文件校验,此时中风险,若未进行完整性校验此时高风险。
安全建议客户端每次开机启动时进行客户端自身的应用完整性校验,在验证逻辑中不适用MANIFEST.MF中的数据作为验证凭证,同时血药验证是否不属于客户端版本的新文件添加 ,验证过程服务器端完成。
组件安全:
描述 : 本项主要测试客户端是否包含后天服务,COntent Provider ,第三方调用和广播等组件,Internt权限的设置是否安全,应用不通过组成部分之间的机密数据传递是否安全,检查客户端是否存在组件劫持风险,产看客户端程序具有导出那些应用信息的权限,反编译APK文件之后,检查Android QMainfest文件中是否有多余的android:export 声明, 客户端是否存在导出其他应用信息的权限.
组件 ; 安卓APP 以组件未单位急性权限声明和生命周期管理
组件有什么用: 安卓系统额组件共有四张,主要用途分别是 :
Activity : 呈现可供用户交互的界面,是最常见的组件
Service : 长时间执行后台作业,常见于监控之类应用
Content Provice : 在多个APP之间共享数据,比如通讯录数据
Broadcast Receiver ;注册特定事假 ,并在其发生时激活。
什么是权限声明 : 安卓系统低音了许多权限声明项,分别对应一些操纵系统功能 .
权限声明有什么用 :
因为权限是以组件为单位,A组件调用组件B的的功能类访问操作系统API时,使用组件B的权限声明。 如果B作为导出组件,没有进行严格的访问控制,那么A就可以通过B来访问原本没有声明权限的功能构成本地权限提升。
使用APKtools解包 ,打开解包目录中的Androidmainfest.xml,对其中的声明的各个组件根据下面的规则判断是否可以导出.