1. 问题说明

Android 系统提供的一种类加载器 DexClassLoader 可以在运行时动态加载并解释执行包含在 JAR 或 APK 文件内的 DEX 文件。外部动态加载DEX文件的安全风险源于:Anroid4.1 之前的系统版本容许 Android 应用将动态加载的 DEX 文件存储在被其他应用任意读写的目录中(如 sdcard),因此不能够保护应用免遭恶意代码的注入;所加载的 DEX 易被恶意应用所替换或者代码注入,如果没有对外部所加载的 DEX 文件做完整性校验,应用将会被恶意代码注入,从而执行的是恶意代码。

2. 测试步骤

查看 AndroidManifest.xml 包 package 值相对应路径下的文件中是否含有 DexClassLoader() 函数调用。

下图中的代码就是含有 DexClassLoader() 函数调用,这种就会存在风险。

外部动态加载 DEX 安全风险检测 - 图1

3. 修复建议

  1. 将所需要动态加载的 DEX/APK 文件放置在 APK 内部或应用私有目录中。为了所加载的 DEX/APK 不被恶意代码注入,建议将要动态加载的 DEX/APK 放置在 APK 内部;
  2. 使用加密网络协议进行下载加载的 DEX/APK 文件并将其放置在应用私有目录中。建议使用加密网络协议进行下载并将下载的 DEX 或 APK 放置在应用的私有目录;
  3. 对不可信的加载来源进行完整性校验。如果应用必须将所加载的 DEX 或 APK 放置在能被其他应用人意读写的目录中(如 sdcard)或使用没有加密的网络协议进行下载加载源,建议对这些不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入。