3.11敏感函数调用检测

文章目录
  1. 1. 1 安全相关的函数检测 # 11001
  2. 2. 2 安全相关的类检测 # 11002
  3. 3. 3 运行命令检测 # 11003
  4. 4. 4 Native Library加载检测 # 11004
  5. 5. 5 外部动态加载DEX检测 # 11005
  6. 6. 6 root代码检测 # 11006
  7. 7. 7 获取IMEI 和Device ID敏感信息代码检测 # 11007
  8. 8. 8 获取Android ID敏感信息代码检测 # 11008
  9. 9. 9 发送SMS敏感代码检测 # 11009
  10. 10. 10 文件删除代码检测 # 11010
  11. 11. 11 signature代码检测 # 11011

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代码

1
2
3
Runtime rr = Runtime.getRuntime();

Process p = rr.exec("ls -al");

Dalvik/ART

1
2
3
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代码

1
2
3
4
5
DexClassLoader cl = new DexClassLoader(
optimizedDexOutputPath.getAbsolutePath(), //参数1
Environment.getExternalStorageDirectory().toString(), //参数2
null, //参数3
getClassLoader()); //参数4

Dalvik/ART
1
2
3
4
5
6
7
...

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代码

1
2
Runtime rr = Runtime.getRuntime();
Process p = rr.exec("su");

Dalvik/ART
1
2
3
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代码

1
2
3
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

String DEVICE_ID = tm.getDeviceId();

Dalvik/ART

1
2
3
4
5
6
7
8
9
.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代码

1
2
import android.provider.Settings.Secure;
String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Dalvik/ART
1
2
3
4
5
6
7
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代码

1
2
3
4
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代码
1
2
3
4
5
6
7
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代码

1
2
File file = new File("tmp.doc");
boolean deleted = file.delete();

上述代码反编译后的Dalvik/ART代码为
1
2
3
4
5
6
7
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代码

1
2
3
4
PackageManager pkgManager = context.getPackageManager();
byte[] signature = pkgManager.getPackageInfo(
context.getPackageName(),
PackageManager.GET_SIGNATURES).signatures[0].toByteArray();

上述代码反编译后的Dalvik/ART代码
1
2
3
move-result-object v0

iget-object v2, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;