🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 1 安全相关的函数检测 # 11001 一些存放敏感的安全配置信息的**函数**,一般函数名都可能带有encrypt、decrypt、encod、decod、aes、sha1、sha256、sha512、md5、decode、encode等关键字。 通过encrypt、decrypt、encod、decod、aes、sha1、sha256、sha512、md5、decode、encode等和安全相关的关键字进行匹配查找,然后逐个检测类的安全性。 ## 2 安全相关的类检测 # 11002 一些存放敏感的安全配置信息的**文件**,一般文件都可能带有encrypt、decrypt、encod、decod、aes、sha1、sha256、sha512、md5、decode、encode等关键字。 通过encrypt、decrypt、encod、decod、aes、sha1、sha256、sha512、md5、decode、encode等和安全相关的关键字进行匹配查找,然后逐个检测类的安全性。 ## 3 运行命令检测 # 11003 检测命令执行相关的代码。 问题示例: Java代码 ``` Runtime rr = Runtime.getRuntime(); Process p = rr.exec("ls -al"); ``` Dalvik/ART ``` const-string v2, "ls -al" invoke-virtual {v1, v2}, Ljava/lang/Runtime;->exec(Ljava/lang/String;)Ljava/lang/Process; ``` ## 4 Native Library加载检测 # 11004 检测加载so文件的Native方法。 风险等级:`提示` Java代码 System.loadLibrary("libtest.so"); Dalvik/ART Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V ## 5 外部动态加载DEX检测 # 11005 在Android4.1之前的系统版本,容许Android应用在全局可读写(如SD卡)的位置动态加载DEX文件,因此有文件被替换的风险。 风险等级:`提醒` 问题示例: 需要检测代码中的DexClassLoader和Android版本,只有Android版本 < 4.1才会出现该漏洞。 Java代码 ``` DexClassLoader cl = new DexClassLoader( optimizedDexOutputPath.getAbsolutePath(), //参数1 Environment.getExternalStorageDirectory().toString(), //参数2 null, //参数3 getClassLoader()); //参数4 ``` Dalvik/ART ``` ... Ldalvik/system/DexClassLoader;-><init>(Ljava/lang/String;Ljava/lang/String; Ljava/lang/String;Ljava/lang/ClassLoader;)V ... ``` 建议: * 禁止外部(不安全的源)加载DEX,将所需要动态加载的DEX/APK文件放置到APK内部或应用私有目录中。 * 使用加密网络协议进行下载加载的DEX/APK文件并将其放置到应用私有目录中。 * 对不可信的加载来源进行完整性校验。 ## 6 root代码检测 # 11006 检查app是否有执行检测root环境的代码。 风险等级:`提醒` 问题示例: Java代码 ``` Runtime rr = Runtime.getRuntime(); Process p = rr.exec("su"); ``` Dalvik/ART ``` const-string v2, "su" invoke-virtual {v1, v2}, Ljava/lang/Runtime;->exec(Ljava/lang/String;)Ljava/lang/Process; ``` ## 7 获取IMEI 和Device ID敏感信息代码检测 # 11007 检查app是否有执行获取IMEI和Device ID敏感信息的代码。 风险等级:`提醒` 问题示例: Java代码 ``` TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String DEVICE_ID = tm.getDeviceId(); ``` Dalvik/ART ``` .local v1, "tm":Landroid/telephony/TelephonyManager; invoke-virtual {v1}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String; move-result-object v0 .local v0, "DEVICE_ID":Ljava/lang/String; return-void ``` ## 8 获取Android ID敏感信息代码检测 # 11008 检查app是否有执行获取Android ID敏感信息的代码。 风险等级:`提醒` 问题示例: Java代码 ``` import android.provider.Settings.Secure; String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); ``` Dalvik/ART ``` Lcom/bug/sensitive/func/MainActivity;->getContentResolver()Landroid/content/ContentResolver; move-result-object v0 const-string v1, "android_id" invoke-static {v0, v1}, Landroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String; ``` ## 9 发送SMS敏感代码检测 # 11009 检查app是否有调用发送SMS函数。 风险等级:`提醒` 问题示例: Java代码 ``` SmsManager smsm = SmsManager.getDefault(); smsm.sendTextMessage("123123", null, "hello", null, null); smsm.sendDataMessage("13123", "123", (short) 90, null, null, null); smsm.sendMultimediaMessage(this, null, null, null, null); ``` 上述代码反编译后的Dalvik/ART代码 ``` invoke-static {}, Landroid/telephony/SmsManager;->getDefault()Landroid/telephony/SmsManager; Landroid/telephony/SmsManager;->sendDataMessage(Ljava/lang/String; Ljava/lang/String; S [B Landroid/app/PendingIntent; Landroid/app/PendingIntent;)V Landroid/telephony/SmsManager;->sendMultipartTextMessage(Ljava/lang/String; Ljava/lang/String; Ljava/util/ArrayList; Ljava/util/ArrayList; Ljava/util/ArrayList;)V Landroid/telephony/SmsManager;->sendTextMessage(Ljava/lang/String; Ljava/lang/String; Ljava/lang/String; Landroid/app/PendingIntent; Landroid/app/PendingIntent;)V ``` ## 10 文件删除代码检测 # 11010 检查app是否有调用删除文件的代码。 风险等级:`提醒` 问题示例: Java代码 ``` File file = new File("tmp.doc"); boolean deleted = file.delete(); ``` 上述代码反编译后的Dalvik/ART代码为 ``` new-instance v1, Ljava/io/File; const-string v2, "tmp.doc" invoke-direct {v1, v2}, Ljava/io/File;-><init>(Ljava/lang/String;)V .line 55 .local v1, "file":Ljava/io/File; invoke-virtual {v1}, Ljava/io/File;->delete()Z ``` ## 11 signature代码检测 # 11011 检查app是否有调用获取signature的代码。 风险等级:`提醒` 问题示例: Java代码 ``` PackageManager pkgManager = context.getPackageManager(); byte[] signature = pkgManager.getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0].toByteArray(); ``` 上述代码反编译后的Dalvik/ART代码 ``` move-result-object v0 iget-object v2, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature; ```