App安全测试之Android应用安全测试汇总

1、安装包测试

安装包反编译测试

用例风险:源代码未做混淆使攻击者很轻易反编译出源代码导致代码泄漏风险。

执行步骤:使用反编译工具打开应用,如发现代码内未经过混淆,就说明存在应用可进行反编译,记录漏洞,停止测试。

预期结果:安装包中核心模块与敏感数据经过加密或者混淆

整改建议:建议使用Proguard等工具对源码进行进一步混淆,避免造成源码泄漏。

App安全测试之Android应用安全测试规范

安装包签名测试

用例风险: Android签名机制是一种有效的身份标识,为了保证应用不被恶意修改后重新发布,需要检查应用签名是否有保护机制。

执行步骤

1、解压缩安装包.apk文件后,删除META-INF/目录下的xx.RSA和xxx.SF文件

2、使用自己的私钥对删除过后的apk文件进行重新签名,首先生成自己的私钥

`keytool -genkey -v -keystore [keystore路径] -alias [密钥别名] -keyalg RSA -keysize 2048 -validity [有效天数]`

3、然后对apk进行二次签名,签名命令格式如下

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystore名称] [apk文件] [密钥别名] 
  • -sigalg:签名算法名称
  • -digestalg:信息摘要算法
  • -keystore:签名文件

执行签名命令

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore android.keystore kaoyan.apk  android.keystore

4、安装重新签名后的apk文件,查看应用是否具有保护机制阻止程序运行。

预期结果:更换签名后,触发应用防御机制,应用无法启动或提示。

整改建议:内部代码实现apk二次打包鉴别机制,在程序运行时校验apk签名是否由官方私钥签名而来。

应用权限测试

用例风险:应用权限分配不合理,可能导致用户隐私数据泄露。

执行步骤

1、使用反编译工具反编译。

2、打开源码后,检查应用AndoridManifest.xml文件,将应用权限和业务功能需要权限做对比,检查申请应用权限是否大于业务需要权限,有即存在安全隐患。

预期结果:应用申请合理的系统权限。

整改建议:为应用分配合理的系统权限。

AllowBackup开启

用例风险:当allowBackup标志值为true时,即可通过adb backup和adb restore来备份和恢复应用程序数据,导致应用数据泄露。

执行步骤

1、打开AndroidManifest.xml文件;

2、检查应用AndoridManifest.xml文件中的配置是否为:android:allowBackup="true",即为allowBackup开启,记录漏洞,停止测试。

预期结果:AllowBackup关闭。

整改建议:在AndroidManifest.xml文件设置allowBackup属性值为False。

备注:allowBackup属性未配置时默认为true。

debuggable开启

用例风险:当debuggable标志值为true时,即表示是App可调试的,存在安全泄露风险。

执行步骤

1、打开解析的AndroidManifest.xml文件;

2、检查应用AndoridManifest.xml文件中的配置是否为:android: debuggable="true",即为debuggable开启。

预期结果: debuggable关闭。

整改建议:在AndroidManifest.xml文件设置debuggable属性值,其默认值为false。

备注:Debuggable属性未配置时默认为false。

弱加密算法审查

用例风险

使用弱加密算法会大大增加黑客攻击的概率,黑客可能会破解隐私数据、猜解密钥、中间人攻击等,造成隐私信息的泄漏,甚至造成财产损失。容易被破解的加密算法被称为弱加密算法,例如可以使用穷举法在有限的时间内破解DES算法。

执行步骤

1、使用反编译工具进行反编译。

2、打开源码后,查找代码中的敏感数据和敏感函数加密代码,是否使用DES弱加密算法,弱加密代码样例:

SecretKeySpec key = new SecretKeySpec(rawKeyData, "DES"); //指定加密方式
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); //设置加密填充模式
cipher.init(Cipher.DECRYPT_MODE, key);

3、RSA中加密不使用Padding:RSA加密常用的填充模式有三种:

  • RSA_PKCS1_PADDING
  • RSA_PKCS1_OAEP_PADDING
  • RSA_NO_PADDING

使用RSA公钥时通常会绑定一个Padding,原因是为了防止对RSA算法的攻击。风险代码样例如下:

Cipher rsa = null;
try {
  rsa = javax.crypto.Cipher.getInstance("RSA/NONE/NoPadding");
}
catch (java.security.NoSuchAlgorithmException e) {
}
catch (javax.crypto.NoSuchPaddingException e) {
}
SecretKeySpec key = new SecretKeySpec(rawKeyData, "RSA"); 
Cipher cipher = Cipher.getInstance("RSA/NONE/NoPadding"); //选择了NoPadding加密模式
cipher.init(Cipher.DECRYPT_MODE, key);

4、使用了不安全的密钥长度,如下演示代码所示密码长度为512bits(常用的密钥长度有1024bits,2048bits等,使用RSA加密时,建议密钥长度大于1024bit):

public static KeyPair getRSAKey() throws NoSuchAlgorithmException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(512);    //密码长度设置为512bits
        KeyPair key = keyGen.generateKeyPair();
        return key;
      }

5、使用了不安全的加密模式,如下示例代码中AES加密使用了ECB模式:

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key);

ECB模式是最简单的模式,在其中明文和密文是一一对应的,相同的明文会被加密为相同的密文,这样可以通过观察密文得到明文中重复的组合,并以此为线索来破解密码。

预期结果:系统未使用包含风险的加密算法。

整改建议:

  • 使用对称加密算法时避免使用DES算法;
  • 使用RSA算法加密时不使用NoPadding;
  • 在选择加密模式时避免使用ECB模式;
  • 使用RSA加密时,建议密钥长度大于1024bit;

2、数据传输测试

上一页12345下一页


留言