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