代码动态加载安全检测 - 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),建议对不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐