安卓Xposed框架安全应用研究

2016-06-16 19:43李伟陈忠红
电脑知识与技术 2016年10期
关键词:应用研究

李伟+陈忠红

摘要:Xposed是安卓系统下的框架服务程序,可通过hook原有函数在不修改系统app的情况下改变系统配置,影响系统运行。基于Xposed框架可以开发许多功能强大的应用模块,在安全方面有非常广阔的前景。介绍了Xposed框架的基本情况和发展趋势;分析了该框架的实现原理及其底层结构;研究了Xposed模块的加载过程。重点对Xposed在未来手机安全方面的应用进行了研究。

关键词:Xposed;框架安全;应用研究

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)10-0049-03

1 概述

Xposed框架是在著名的智能手机开发者论坛XDA上诞生的一款特殊的安卓APP,由开发者rovo98进行开发和升级。Xposed作为安卓系统下的框架服务程序,可以在不修改系统apk的情况下改变系统配置,影响系统运行。其主要功能是建立了一个模块安装平台,在安装Xposed框架之后,使用者可以通过安装Xposed模块应用的方式,实现强大的功能。Xposed框架类似于越狱后的iOS系统Cydia平台,但由于安卓系统的开源性,Xposed框架可以提供更丰富的功能并让用户获得更好的体验。

Xposed框架的原理是通过修改和替换系统文件进而hook整个系统,所以基于Xposed框架开发系统级应用的难度大大降低。目前Xposed框架下的模块多以优化系统运行速度、美化界面和提供便捷操作等功能为主,为数不多的安全类模块均由外国开发者编写,如绿色守护等模块还需要支付费用才可获得全部功能,且安全应用多以软件权限控制为主,并没有充分利用Xposed框架的强大功能,目前越来越多的开发者开始关注Xposed,出现利用Xposed框架编写的密码破解程序和针对安卓漏洞masterkey的Xposed框架检测模块和补丁程序,因此利用Xposed框架进行安全方面应用开发前景非常广阔。

2 Xposed框架分析

2.1 Xposed框架实现原理和结构

Xposed框架的运作原理是劫持了安卓程序进程的启动过程,正常的安卓程序在启动时的过程首先要启用zygote进程,zygote是安卓进程的孵化器,其功能是创建Dalvik 虚拟机实例,并为Dalvik虚拟机加载资源,Dalvik虚拟机启动完成后就实现各子模块的初始化,并且加载了相应的Java核心类库,这样就可执行Java代码进而执行安卓程序[1]。

Xposed框架实现功能是通过修改/system/bin/app_process文件进而hook系统函数,app_process文件是zygote孵化器在创建dalvik虚拟机时调用的文件,其功能是启动安卓系统运行时库并启动虚拟机,修改后的文件可以实现在dalvik虚拟机创建时hook进而获取权限,Xposed实现各种功能的前提是hook系统函数,Xposed框架实现hook的原理是将需要hook的函数替换成Native方法XposedCallHandler,Dalvik虚拟机在解释执行函数时,遇到在执行中被hook的函数,就会直接调用XposedCallHandler,XposedCallHandler再调用 XposedBridge类的handleHookedMethod完成注册的beforeHookedMethod以及 afterHookedMethod 的调用,这两类回调函数之间,会调用原始函数,完成正常的功能。

2.2 Xposed框架结构

Xposed框架基本分为以下四个部分组成:

1)Xposed:Xposed 是用c++编写而成的,其功能是替换系统中的/system/bin/app_process文件,并为XposedBridge 提供JNI(Java本地接口)方法,实现Java和c++之间的通信;

2)XposedBridge:Xposedbridge是Xposed提供的jar文件,在app_process启动时系统会自动加载该文件以达到hook目的,Xposedbridge是其他模块开发的基础;

3)XposedInstaller:Xposed 的安装文件,提供Xposed框架安装功能和模块安装与下载和管理等功能,是Xposed框架的管理软件;

4)XposedMods:XposedMods是基于Xposed框架开发的应用模块实现了强大而丰富的功能。

Xposed c++源码[2]下载地址为http://github.com/rovo89/Xposed。主要包括如下文件:

1)app_main.cpp:app_main.cpp的作用是修改和替换安卓系统框架中的app_main.cpp文件,app_main.cpp文件的内容就是/system/bin/app_process文件的代码,在安卓程序启动过程中,app_process进程会负责Dalvik虚拟机的初始化和启动工作,使安卓系统能够运行Java语言;

2)Xposed.cpp: 给app_main.cpp提供的调用函数,以及 XposedBridge 的 JNI 方法的实现。完成Xposed框架的初始化工作以及类函数的 hook 操作,是Xposed框架的核心;

3)Xposed.h、Xposed_offsets.h: 头文件。

Xposed c++部分具体工作流程如下:

1)安卓系统init进程启动app_main.cpp;

2)调用app_main.cpp中的initTypePointers()函数,对于 SDK大于18的系统版本版本会获取atrace_set_tracing_enabled函数指针,该指针用于Zygote 初始化过程;

3)调用Xposed.cpp中的XposedInfo()函数,该函数的功能是获取系统的一些参数,并打印到Log文件中,如获取SDK版本号,设备生产商,设备型号等;

4)调用Xposed.cpp中的isXposedDisabled()函数,该函数的作用是判断Xposed是否可用,通过读取/data/data/de.robv.android.Xposed.installer/conf/disabled 文件,来判断Xposed框架是否被禁用,如果该文件存在,则表示禁用Xposed;

5)调用Xposed.cpp中的XposedShouldIgnoreCommand()函数,判断启动请求以避免其他权限管理工具滥用Xposed的log文件;

6)调用Xposed.cpp中的addXposedToClasspath()函数,判断是否有新版本的XposedBridge存在,如有新版本则将新版本重命名为XposedBridge.jar并返回false;并将XposedBridge.jar添加到 CLASSPATH 环境变量中,如没有新版本则返回true并启动zyogote;

7)调用AndroidRuntime::start(const char* className, const char* options)函数,AndroidRuntime是安卓框架中的函数,用于完成Dalvik虚拟机的初始化和启动工作以及运行参数className指定的类中的main方法;

8)虚拟机在runtime的引导下启动完成;

9)调用onVmCreated()函数。该函数在AppRuntime类中被覆盖。调 用 Xposed.cpp 中 的XposedOnVmCreated(JNIEnv* env, const char* className)函数。获取 XposeBridge 类并 new一个全局引用;

10)注册JNI函数,Xposed.cpp中定义了供XposedBridge类使用的JNI方法,此处进行注册,这样当XposeBridge中的main函数执行时,就可以调用 Xposed.cpp 中定义的JNI方法;

11)调用XposedBridge类的 main方法,进入XposedBridge[3]。

至此Xposed的c++部分结束,Xposed框架就进入了XposedBridge部分,开始执行Java语言。

3 Xposed框架安全方面应用模块研究

通过对Xposed框架hook的原理和其模块结构的分析可以发现,该框架可以hook几乎整个安卓系统,通过对hook的充分利用,可以实现非常丰富的功能,尤其是在安全方面有非常广阔的前景, Xposed框架可以实现以下安全方面的功能。

1)修补漏洞

2013年出现过一个名为masterkey的著名漏洞,该漏洞可以对 99% 的安卓设备造成影响。这个漏洞自 Android 1.6(Donut)以来就一直存在,恶意软件制作者可以在不破解加密签名的前提下利用它来修改APK的代码,可以绕过安卓应用的签名验证安全机制。这个漏洞理论上会影响android1.6至漏洞提报google时间点2013年2月之间的所有设备。虽然Google官方已经修复了该漏洞,但是由于安卓系统更新的推动力更多的来自于设备生产商,此补丁的推送滞后非常严重。占有大量用户的各种第三方系统对漏洞的更新非常缓慢,但是Xposed模块开发者及时开发了名为Master Key dual fix的模块,可以在不升级系统的情况下修补漏洞,保障用户安全。

2)破解手势解锁

Swipeback是Xposed框架中的一个实现滑动返回手势控制的模块,由于设计优秀广受好评。但是在2014年初发现了一个安全漏洞,安装了Xposed框架及其SwipeBack模块的设备,可能轻易越过部分手势密码锁直接进入[5]。这个漏洞涉及到支付宝钱包、QQ等安卓应用,在这类应用中常会有用户设置手势密码锁以加强账号的安全性,但在面对Xposed框架及其SwipeBack模块时,这个锁将直接被绕过,本来经过MD5加密验证的手势密码在swipeback面前起不到任何作用。只要在这些应用的手势密码界面上,使用SwipeBack滑动模块就能直接取消手势密码,进入应用程序。虽然能够被Xposed框架及其SwipeBack模块绕过手势密码锁的应用只有一部分,这个漏洞并不是无法堵上的,但也说明了Xposed模块实现各种功能的可能性。

3)程序控制和信息伪造

Xposed的App settings模块可以直接禁用程序的API接口,而不必修改APK文件。XPrivacy模块,可以阻止程序访问隐私信息。XPrivacy还具有伪造信息的功能。可以对手机的序列号,GPS坐标,电话号码,运营商等等信息进行修改,当其他应用试图读取这些信息的时候就返回修改值或随机数。Xposed Appsettings 可以把每个API都列出来并禁用。与Xprivacy 配合,Xposed可以控制近百个项目,可以使应用程序读取预先设置的信息甚至指定应用程序只能看特定信息。

4) 自动安装激活

Xposed模块虽然具有丰富的功能但仍需要安装并激活,Xposed模块开发者MindMac提供了一个可自动安装激活的Xposed恶意插件demo(需Root权限)。实现的在用户未知情况下静默安装Xposed模块并激活的功能。该模块会在后台自行安装Xposed,并勾选自身的模块,之后自动重新启动使模块激活生效。该应用可以作为恶意插件的安装平台。当用户安装的打包有该应用插件的应用后手机就可能在后台运行第三方插件造成安全风险。

5)关机窃听

斯诺登在接受采访时曾指出美国国家安全局(NSA)可以对手机进行窃听,即使是在关机的情况下也不能幸免。在2015年GeekPwn大赛(一个旨在演示智能设备安全漏洞利用、宣传安全意识的会议)上,来自KeenTeam的开发者现场演示了安卓手机在关机状态下被黑客通过听筒进行窃听的全过程,据分析这个看似难以实现的任务可以通过Xposed模块的方式实现,其基本的思路是hook关机按钮,当点击“关机”按钮后弹出的提示框中“确定”按钮。hook住interceptKeyBeforeQueueing函数,播放关机动画,设置屏幕超时等功能。这样就伪造了一个“已关机”的假象,再启动录音或拨打特定电话就可以实现窃听等功能。

4 总结

Xposed在安卓手机安全应用方面拥有独特的优势,具有低廉的开发成本和广阔的发展前景。本文介绍了Xposed框架的基本情况和发展趋势,详细分析了Xposed框架实现原理,分析了该框架的实现原理及其底层结构,研究了Xposed模块的加载过程。重点对Xposed框架在安全方面的广阔的前景进行了研究。

参考文献:

[1] Enck,McDaniel.Understanding Android Security[C]. Security & Privacy,IEEE, 2009: 50-57.

[2] Frank Ableson.Introduction to Android development[Z].

[3] rovo89.Introduction to Xposed[EB/OL]. (2012-03-31).http://forum.xda-developers.com/showthread.php?t=1574401.

[4] rovo89.Xposedsoundcode[EB/OL]. (2013-07-16).https://github.com/rovo89.

[5] XPosedWiki[EB/OL]. (2014-02-29).https://github.com/rovo89/XposedBridge/wiki/_pages.

[6] 王向辉,张国印,沈洁.Android应用程序开发[M].北京:清华大学出版社, 2010: 120-144.

猜你喜欢
应用研究
节奏训练在初中音乐课程教学中的应用研究
AG接入技术在固网NGN的应用研究
空域分类关键技术及应用研究
分层教学,兼顾全体