曹 勇 李军虎 陈晓升
(1.海军工程大学信息安全系 武汉 430033)(2.海军92665部队 慈利 427200)(3.海军91650部队 湛江 524000)
《2015移动应用隐私安全认知调查报告》指出,目前中国手机用户数量超过13.06亿,其中智能手机用户量超过6.8亿[1];随着近年来智能手机用户迅速增加,移动应用程序也得到了迅速普及。但是,智能手机市场的迅速发展也带来了如病毒、木马,披着“正常软件”外衣的恶意软件,源代码开放的Android系统,程序质量参差不齐的免费应用商城等与用户密切相关的安全问题,用户在享受应用软件所带来便利的同时,个人信息面临着各种各样的安全威胁。大量隐私泄露和滥用权限的现象在Android平台广泛存在。
本文针对安卓市场第三方应用存在大量隐私泄露及滥用权限的情况,通过研究面向Android应用程序的代码静态分析工具,充分运用反编译分析技术、XMLParser解析技术、正则表达式关键词匹配技术,检测应用程序是否存在泄露用户隐私和滥用手机权限。同时利用APK文件的反编译、文件解析等方法进行分析识别,提出采取安装应用程序之前展示可能涉及的权限和API的方法,为用户选择提供参考依据,从而解决隐私信息泄露和权限滥用问题。
通过互联网可以获得Android平台各类逆向工具来反编译APK文件,就可以得到文件中包含的各类资源文件、签名文件,以及关键的程序描述文件AndroidManifest.xml。将应用文件和恶意代码文件分别逆向得到各自的smali代码和程序描述文件,在应用的smali代码中加入恶意代码的部分,同时修改程序描述文件中的对应条目就完成了恶意代码的注入[2]。将已注入恶意代码的应用伪装成正常应用,应用安装后,恶意代码通过一定条件触发执行,完成恶意行为。
APK可以指定接口和数据给任何其他APK读取,需要自己实现接口和共享的数据。隐式共享造成的隐私泄露是由AndroidManifest文件中可选属性的滥用引起的[3]。通过共享用户ID,拥有同一个用户ID的多个APK可以配置成运行在同一个进程中。默认可以互相访问任意数据,访问其他APK的数据目录下的数据库和文件。
破解指的是反编译APK文件进行汇编级的代码分析,并修改或插入自己的代码,重新签名打包为APK文件[4],以达到改变程序原有行为的目的。我们要破解一个APK文件,流程包括:反编译、代码分析、重新打包签名。Android程序逆向的一般步骤为
1)用解压缩工具打开apk文档,得到详细文档结构;
2)将classes.dex文件解压出来,然后使用工具反编译成*.jar文件,再进一步反编译出Java文件;
3)利用Google提供的apktool工具得到xml文件;
4)将2)中得到的class文件和3)中得到的xml文件组合成一个Android工程,即可得到完整的APK源码。
静态分析是指在不运行的情况下,采用词法分析、语法分析等各种技术手段对程序文件进行扫描从而生成程序的反汇编代码,然后阅读反汇编代码来掌握程序功能的一种技术。一般有两种方法:一种是阅读反汇编生成的Dalvik字节码,用IDA Pro分析dex文件,或者使用文本编辑器阅读baksmali反编译生成的smali文件;另一种是阅读反汇编生成的java源码,可以使用dex2jar生成jar文件,然后再使用jd-gui阅读jar文件的代码。通过上述两种方法得到反汇编代码后,采用下面的方法定位关键代码。
1)信息反馈法:先运行目标程序,然后根据程序运行时给出的反馈信息作为突破口寻找关键代码;
2)特征函数法:跟信息反馈法类似;
3)顺序查看法:从软件的启动代码开始,逐行向下分析,掌握软件的执行流程;
4)代码注入法:手动修改apk文件的反汇编代码,加入Log输出,配合LogCat查看程序执行到特定点时的状态数据;
5)栈跟踪法:输出运行时的栈跟踪信息,然后查看栈上的函数调用序列来理解方法的执行流程;
6)方法剖析:热点分析和性能优化。
静态分析利用程序的静态语法或结构属性来判定其恶意性,与动态分析相比,静态分析有以下优点[5]:
1)静态分析允许进行全面分析。静态分析不受一个程序的特定执行过程约束,并且适用于程序的所有执行过程;
2)结果在执行过程之前被给出,恶意行为难以伪装;
3)没有运行时负担,能够减少成本并且提高性能。
本文通过Android系统的体系结构,研究An⁃droid系统以及应用程序的不安全因素等。通过研究面向Android应用程序的代码静态分析工具,对这些API调用进行截取,然后根据策略进行判定。研究重要的反编译拘束,对多个反编译技术进行分析对比,提出一种综合静态检测方法。
1)通过反编译工具Dedexer反编译APK文件获得一个可以执行机器操作的DDX文件,然后对该DDX文件进行匹配式查找;
2)通过使用AXMLPrinter.jar工具包反编译An⁃droidManifest.xml文件,得到可读的XML文件,然后运用XML解析技术JDOM解析XML文件[6];
3)对 AndroidManifest.xml文件[7],跟踪<permis⁃sion>和<uses-permission>两个标签,寻找系统权限和自定义权限,并检测具有相同User ID的共享用户ID属性值;
4)对第三方应用市场上的APK进行测试和分析。
系统完整的检测流程如图1所示。
图1 系统检测流程
整个系统组成有五个模块:APK文件识别和解压模块,反编译模块,XML文件分析模块,危险API分析模块,界面操作和检测信息展示模块。系统模块如图2所示。
图2 系统模块图
主要实现功能:
1)反编译功能:将代码文档有dex反编译为可读性较高的ddx文档,将二进制的AndroidManifest.xml文件反编译为可直接读取的字符型文档[8]。
2)权限分析功能:对反编译后的文件进行搜索匹配和分析已得到APK的权限信息和API使用情况。
3)联合分析功能:将正在分析的APK与数据库存储的APK联合分析,检测是否存在通过使用相同的APK的sharedUserId实现数据共享[9]。
4)潜在威胁提醒功能:综合一个APK的所有分析信息,实现对APK潜在威胁的说明。
1)APK文件识别和解压模块[10]
Android应用程序识别和解压模块的结构如图3所示。
图3 Android应用程序识别和解压模块结构图
2)反编译模块
APK文件一般基于Java语言编写,由于Java目标代码——字节码(bytecode)中包含了大部分的源码结构等信息,较容易反编译成Java源码[11],反编译流程如图4所示。
图4 反编译流程图
3)XML文件解析模块
本文采用JDOM对XML文件执行解析[12]。分别对shareuserID和权限进行分析,最终了解该APK调用其它程序组件的情况。详细流程如图5所示。
图5 XML文件解析流程图
4)危险API检测模块[13]
对所有ddx文件进行匹配式查找,就能发现该APK是否使用以及使用了多少有危险的API。详细匹配流程如图6所示。
图6 匹配流程图
根据上述方法进行了系统实现,软件界面外观如图7所示。主要分三部分:单个APK检测、批量检测和帮助说明。检测结果根据内容以树状结构的结点显示,结果显示简洁清晰。
图7 系统运行界面
结合国内安卓第三方应用市场现有的APK,通过使用本系统进行测试验证,验证该方法的有效性。主要测试参数有:
1)APK调用的危险API种类和次数。
2)APK申请使用的系统权限和自定义权限[14]。
3)APK通过shareUserId属性能够间接使用的权限[15]。
在百度Android平台上下载全民斗地主APK,经过上述方法的检测,可以得到该APK的基本信息、权限和API调用信息,如图8所示。
图8 典型APK检测信息
由图8可以得知,该APK在执行基本功能的基础上将会要求网络连接并且会申请用户手机发送信息和拨打电话,系统将其评价为威胁度中(可能会造成额外的费用支出)。通过实际地操作该APK,显示该APK将会使用短信权限和网络权限来补完游戏体验,同时需要用户支付相应的费用,并潜藏着需要申请拨打电话的操作,虽然没有找到恶意盗取用户资金的操作,但并没有在第三方应用市场上发现其存在收费相关的信息介绍,此体验结论与检测结果吻合。
对常用的游戏类和工具类APK进行了测试比较,统计结果如图9和图10所示。
通过检测结果可对比看出,实验成功地从恶意软件中检测出了隐私泄露和滥用权限行为,证明了有效性。同时,统计数据表明本文采用的APK检测方法检测正确率高达95%,只存在少量的漏报和误报。
图9 游戏类APK申请权限数量
图10 功能类APK申请权限数量
针对目前国内安卓智能手机用户对第三方应用市场的巨大依赖性及第三方应用市场的混乱性,本文采用静态分析技术,逆向反编译解析APK文件,检测应用程序是否存在泄露用户隐私和滥用手机权限,详细生成APK中使用的权限和危险API信息,分析APK可能对用户产生的潜在威胁。从而指导用户进行选择性安装,避免了APK安装后恶意行为导致的用户利益损害。随着安卓手机市场应用的进一步扩大,以及用户对安全性能和隐私保护的进一步觉醒,本文提出的方法在手机安全防护和隐私保护中所起的作用将会日益凸显。