Android应用安全之外部动态加载DEX文件风险
1. 外部动态加载DEX文件风险描述
Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件。外部动态加载DEX文件的安全风险源于:Anroid4.1之前的系统版本容许Android应用将动态加载的DEX文件存储在被其他应用任意读写的目录中(如sdcard),因此不能够保护应用免遭恶意代码的注入;所加载的DEX易被恶意应用所替换或者代码注入,如果没有对外部所加载的DEX文件做完整性校验,应用将会被恶意代码注入,从而执行的是恶意代码;
如果应用没有正确的动态加载DEX文件,将会导致攻击者的任意代码被自动执行,进一步实施欺诈、获取账号密码或其他恶意行为等危害,如在乌云漏洞平台上的类似漏洞:QQ游戏Android客户端漏洞导致任意代码执行和密码泄漏[1]。
2. 外部动态加载DEX文件影响范围
Android 系统
3.外部动态加载DEX文件风险详情
1) 风险位置:
public DexClassLoader (String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)[2]
2) 风险触发前提条件:
- 动态加载的DEX文件存储在被其他应用读写的目录中,如sdcard;
- 没有对外部所加载的DEX文件做完整性校验;
3) 风险原理:
动态加载的DEX文件存储在被其他应用任意读写的目录中(如sdcard),如果没有对外部所加载的DEX文件做完整性校验,应用将会被恶意代码注入,从而执行的是恶意代码;
4. 外部动态加载DEX文件风险证明
利用DexClassLoader()运行时加载JAR/DEX文件,该将恶意代码替换掉被加载的DEX文件,或向该被加载的DEX文件注入恶意代码。
被替换的所加载的JAR/DEX class的恶意代码如下:
动态加载JAR/DEX的调用代码:
Android 4.1之前系统版本,结果显示成功动态加载JAR/DEX如下图所示:
Android 4.1之后系统版本,结果抛出异常“Optimized data directory /mnt/sdcard is not owned by the current user. Shared storage cannot protect your application from code injection attacks.”:
由于Android 4.1之后Android版本增加了对JAR/DEX存放目录文件的user_id 和动态加载JAR/DEX的进程的user_id是否一致的判断,如果不一致将抛出异常导致加载失败,如下图所示:
4.1之前版本的Android系统DexFile.java代码片段[3]:
4.1及其之后版本的Android系统DexFile.java代码片段[4]:
5. 外部动态加载DEX文件安全建议
1. 将所需要动态加载的DEX/APK文件放置在APK内部或应用私有目录中[5]
为了所加载的DEX/APK不被恶意代码注入,阿里聚安全建议将要动态加载的DEX/APK放置在APK内部;
2. 使用加密网络协议进行下载加载的DEX/APK文件并将其放置在应用私有目录中[5]
阿里聚安全建议使用加密网络协议进行下载并将下载的DEX或APK放置在应用的私有目录;
3. 对不可信的加载来源进行完整性校验
如果应用必须将所加载的DEX或APK放置在能被其他应用人意读写的目录中(如sdcard)或使用没有加密的网络协议进行下载加载源,阿里聚安全建议对这些不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入。
引用
[1] http://www.wooyun.org/bugs/wooyun-2010-09299
[2] http://developer.android.com/reference/dalvik/system/DexClassLoader.html
[3] https://android.googlesource.com/platform/libcore-snapshot/+/ics-mr1/dalvik/src/main/java/dalvik/system/DexFile.java
[4]https://android.googlesource.com/platform/libcore/+/45e02606b35996f61487f512ee91d0df83e75c9e/dalvik/src/main/java/dalvik/system/DexFile.java
[5] http://developer.android.com/training/articles/security-tips.html#DynamicCode
本文转自:http://www.droidsec.cn/?p=174
Android应用安全之外部动态加载DEX文件风险的更多相关文章
- 携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- [转载] Android动态加载Dex机制解析
本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...
- android加固系列—6.仿爱加密等第三方加固平台之动态加载dex防止apk被反编译
[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5402599.html ] 此方案的目的是隐藏源码防止直接性的反编译查看源码,原理是加密编译好的 ...
- Android 插件技术:动态加载dex技术初探
1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...
- 详谈LABJS按需动态加载js文件
为了提高页面的打开和加载速度,我们经常把JS文件放在页面的尾部,但是有些JS必须放在页面前面,这样就会增加页面的加载时间:于是出现了按需动态加载的概念,这个概念就是当页面需要用到这个JS文件或者CSS ...
- 动态加载js文件是异步的
动态加载js文件是异步的. 今天调试一个错误,一个js方法各种调不到. 原因是因为所调方法的js文件是动态加载进来的. <script type="text/javascript&qu ...
- Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- js动态加载css文件和js文件的方法
今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...
- 两种动态加载JavaScript文件的方法
两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...
随机推荐
- 微信小程序笔记(二)
微信小程序环境搭建与开发工具介绍 2-1 开篇介绍及下载工具 1.开发工具下载地址: http://t.cn/RVKH0HS 2.下载安装对应版本:win32,win64,mac; 2-2 小程序 ...
- 使用 Aircrack-ng 破解 WEP 和 WPA/WPA2 加密的 Wi-Fi 密码。(转)
1.首先请不要使用此方法去搞破坏,去蹭Wi-Fi,因为不装逼地说,我认为技术本身的价值很大,尤其是在学习这个技术的过程中解决遇到的问题,当经过重重困难最后终于成功之后的喜悦又怎么能拿去蹭网呢.我在此过 ...
- hadoop集群全纪录
169namenode 170datanode 171datenode 1:部署JDK 获取jdk安装代码:jdk-7u21-linux-x64.gz tar -zxvf jdk-7u21-linux ...
- TCP : two different sockets sharing a port?
A server socket listens on a single port. All established client connections on that server are asso ...
- cocos2d-x.0创建工程
$ python create-multi-platform-projects.py -p PompaDroid -k cn.philon.pompadroid -l cpp
- 10个有关RESTful API良好设计的最佳实践
Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...
- Android 设置VPN(pptp连接方式)
本教程以小米手机的MIUI系统为例子,教大家如何设置VPN 先找到“设置”,打开设置菜单,如下图: 在设置菜单里面找“其它连接方式” 然后找到“VPN”,点击进入: 进入VPN设置界面后,如果VPN未 ...
- Hadoop - Mac OSX下配置和启动hadoop以及常见错误解决
0. 安装JDK 参考网上教程在OSX下安装jdk 1. 下载及安装hadoop a) 下载地址: http://hadoop.apache.org b) 配置ssh环境 在terminal里面输入: ...
- Android Screen Orientation Change (Screen Rotation) Example
原文见: http://techblogon.com/android-screen-orientation-change-rotation-example/#
- Oracle-ARCGIS-SDE 数据整合遇到的问题
一. 近日在做全文检索,基础采用oracle text,版本是10g,做好管理页面后,有功能是删除索引,就是生成drop index的语句.没有想到这个全文检索的index这么直接弄还不行,经过这样删 ...