[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;
```