代码动态加载安全检测 - DexClassLoader & PathClassLoader 一、API 1. 继承关系 【1】java.lang.Object 【2】java.lang.ClassLoader 【3】dalvik.system.BaseDexClassLoader 【4】dalvik.system.DexClassLoader 【5】dalvik.system.PathClassLoader 2. 主要方法 【1】DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) 对应的参数: 【2】PathClassLoader(String dexPath, ClassLoader parent) 【3】PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) 【4】参考链接 https://developer.android.com/reference/dalvik/system/DexClassLoader.html https://developer.android.com/reference/dalvik/system/PathClassLoader.html 3. 示例 【1】DexClassLoader可以加载apk,jar或dex文件 【2】PathClassLoader只能加载已经安装到Android系统中的apk文件 【3】参考链接 http://blog.csdn.net/quaful/article/details/6096951 二、触发条件 1. 定位DexClassLoader/PathClassLoader初始化方法 【1】对应特征 Ldalvik/system/DexClassLoader->init( Ldalvik/system/PathClassLoader;->init( 2. 动态加载的文件存放在外存 【1】对应特征 /sdcard Landroid/os/Environment;->getExternalStorageDirectory( 三、漏洞原理 【1】使用DexClassLoader或PathClassLoader动态加载dex文件、apk文件、jar文件时,如果这些文件存储在可被其他应用读写的目录中(比如sdcard),同时没有对外部加载的文件进行完整性校验,导致应用可能会被恶意代码注入并执行 【2】更多内容 http://www.droidsec.cn/外部动态加载dex安全风险浅析/ 四、修复建议 【1】将所需要动态加载的文件放置在apk内部,或应用私有目录中 【2】如果应用必须要把所加载的文件放置在可被其他应用读写的目录中(比如sdcard),建议对不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入