马绍菊 万 良 杨 婷 马林进
(贵州大学计算机科学与技术学院 贵州 贵阳 550025)
一种基于FlowDroid的Android隐私保护方法
马绍菊 万 良*杨 婷 马林进
(贵州大学计算机科学与技术学院 贵州 贵阳 550025)
随着移动设备市场的扩大,Android智能系统占据了手机市场的很大份额,手机设备是承载用户隐私数据较多的移动设备。由于Android系统的开源特性,其存在很多安全隐患。提出一种基于FlowDroid的Android增强型隐私保护方法。对Android应用进行静态污点分析,判断其是否存在隐私泄露,并基于FlowDroid静态污点分析工具实现与验证。通过验证表明提出的方法是有效的。
静态污点 隐私泄露 程序间控制流图 Android操作系统
Android隐私保护方法主要包括两类:静态检测和动态检测[1]。静态检测方法是指在不需要运行应用的情况下,对apk文件进行分析的一种方法。动态检测方法是指在程序运行过程中,通过提取应用的行为或动态检测应用的操作,分析出应用的恶意行为。Android隐私保护研究方面,Lu等提出了CHEX[2],主要用于Android应用的漏洞劫持和静态分析,静态分析中,CHEX只能最多考虑单个对象敏感,存在一定的局限性。Yang等提出了LeakMiner[3]静态分析方法,该方法对上下文不敏感,检测的精确性不高。Gibler等提出的AndroidLeaks[4]方案对于字段和对象都不敏感,大大降低了检测的精确性。Reina等提出的CopperDroid[5]动态检测方法在Android底层Linux操作系统的基础上重建Android应用组件的行为,从而找出恶意的活动。该方法需要在应用运行时进行检测,占用系统资源高,降低应用运行效率。
随着Android手机用户的不断增长,用户隐私泄露问题也开始泛滥。Android手机作为移动设备的一种势头,对其隐私保护的研究具有重要意义。本文提出一种增强型静态污点分析方法DFlowDroid,在FlowDroid工具的基础上进行一定的改进,提高了静态污点分析的准确性,具有实际意义。
1.1 Android基础
Android[6]应用使用Java语言编写,同时也支持本地语言C。
Android应用程序被打包成一个apk文件,apk本身就是一个压缩文件,可以将其直接解压,解压后一般包括六个部分。每部分的含义如表1所示。
表1 apk文件结构
Android[6]应用开发中通常涉及四个组件:活动(Activity)、服务(Service)、广播接收者(BroadCastReceiver)、内容提供者(ContentProvider)。这四个组件互相独立,但可以相互调用,实现特定的功能。Android应用开发中,页面跳转及数据传递使用Intent意图来实现。意图是Android数据流分析的一个重要部分。
1.2 Soot框架
Soot[7]是McGill大学的Sable研究小组所研发的一种Java优化框架,现在被世界各地的研究人员用来对Java工程和Android应用进行分析。为了达到分析的目的,Soot提供了四种不同抽象层次的中间表示。这些中间表示在代码分析过程中有着各自的用途。同时,Soot为中间表示定义了五种数据结构,分别是Scene、SootClass、SootMethod、SootField和Body。这些数据结构使用面向对象技术来实现,作为一个通用类,需要时很容易被使用。
Soot[7]可以处理格式有Java字节码和源码、Android字节码、jimple中间表示、Jasmin。处理后输出格式可以为Java字节码、Android字节码、jimple中间表示和Jasmin。Soot可以从任何输入格式到任何输出格式,比如可以从Android字节码到Java源码,Java源码到Jimple中间输出。Soot提供了多种类型的分析,主要包括:生成调用结构图、指向分析、内部数据流分析、与FlowDroid结合的静态污点分析等。Soot的工作原理是:将程序转换为任意一种中间表示,对这些中间表示进行分析,可以对代码进行优化、添加标签等操作。
Jimple[7]是Soot中最重要的一种中间表示,很多分析都是在Jimple级别上实现的。它是一种类型化的、3-地址、基于语句的中间表示。在JDK1.4及更高版本中,Jimple可以直接由Java源码生成,JDK1.5及更高版本中,Jimple可以直接由Java字节码或Java类生成。在Java字节码到Jimple的转换过程中,为了简化栈地址、子程序操作及移除Java规范jsr指令,Jimple引入局部变量。同时,Jimple会移除冗余的代码,如没有使用的变量和未使用的内存分配。该转换过程中最重要的一步是线性化操作,保证所有的语句只涉及到最多三个变量或常量,也就是所谓的3-地址,这使得分析过程中更加简便和高效,例如:
Jimple表示中只需要处理15种语句,而在Java字节码中需要处理200多种指令,因此,Jimple大大简化了Java字节码。可以对Jimple进行优化,优化后将其重新转换为Java字节码,这样可以减小系统的开销,使得代码运行更有效率。
Soot[7]框架为Android静态分析提供了重要的预备知识,FlowDroid继承了Soot框架,特别是Soot中的三地址中间表示Jimple和精确的数据流调用分析框架Spark[8]。Dexpler插件允许FlowDroid将Android的Dalvik字节码转换为Jimple[9]。
1.3 FlowDroid框架
FlowDroid[10]对Android应用的分析中,其输入为Android应用包apk文件,输出为程序的数据流和流路径。
Android应用程序不像Java应用那样,有入口Main函数。Android应用包含了许多入口节点,它的方法隐含的被Android框架调用。Android操作系统对应用中每一个组件定义了完整的生命周期,这些组件主要包括Activity、Service、BroadCastReceiver和ContentProvider,所有的这些组件都需要在应用配置文件AndroidManifest.xml中进行配置。因此,当构建一个调用图时,apk分析不能简单地从检测预定义的main方法开始,但Android应用中每个组件都有函数来反映此组件的生命周期,因此,FlowDroid构建一个通用的dummyMainMethod()方法来模拟生命周期[10]。
FlowDroid[10]是Android静态污点分析工具,其检测效率高,检测流程如图1所示。首先,FlowDroid以apk文件作为输入,将其反编译之后,分别分析AndroidManifest.xml文件、classes.dex文件和layout中的布局文件。通过这些文件的解析来获得应用对应的source、sink以及入口节点,得到生命周期及回调函数列表。接着,FlowDroid通过生命周期及回调函数列表来产生dummyMainMethod()函数,FlowDroid中的Dexpler插件将apk中的.dex文件转为soot框架的Jimple中间表示,被用来产生调用图CG(Call Graph)和程序间控制流图ICFG(Inter-procedural Control-Flow Graph)[9]。在代码检测开始时,静态分析方法将通过遍历ICFG来追踪污点,FlowDroid使用Heros[11]框架来实现IFDS中的污点追踪算法,生成数据流和流路径[6]。
图1 FlowDroid分析流程
Flowdroid基于IFDS[11]框架实现了一套Android静态污点分析原型,它对Android框架和应用特性做了大量的建模工作。FlowDroid准确性高,但是比较臃肿,在资源和时间效率上存在一些问题。同时,由于apk的一些正常应用需求,该方法存在一定的误报率。
2.1 方法分析
本文提出的方法是DFlowDroid,该方法方法借助FlowDroid中的Dexpler插件,将Android应用的源码转换为Soot框架的jimple中间表示,由jimple中间表示来产生程序间控制流图。借助Soot框架,DFlowDroid方法在FlowDroid的基础上,增加了一定的判定条件,降低了误报率。
为了更清楚地说明分析方法,这里先定义一些符号变量。
Source:apk应用中的source集合,即污染源集合。该集合来源于Android系统中某些涉及敏感信息的接口。
Sink:apk应用中的Sink集合,即污点接收端的集合。该集合表示的是Android系统中所有可能导致用户隐私泄露的接口。
Source[i]:Source集合中的某个元素。
Sink[j]:Sink集合中的某个元素。
NextNode:程序间控制流图中的节点。程序间控制流图,即ICFG,是由Soot中间表示Jimple而产生的一种基于语句的程序间调用流图。
T[Source[i]→Sink[j]]:apk中Source到Sink的污染路径。
T[SafeSource[k]→SafeSink[p],Info]:给定的source到sink的安全路径集合。
Info表示Source[K]→Sink[p]传输路径中携带的一些辅助数据信息,可以为字符串类型,且Info∈Info[i]。
Info[i]:白名单数据的集合,即如果安全路径中携带的辅助数据信息Info属于该集合,则表明该路径不是隐私泄露路径。
Source和Sink来源于Android系统源码提供的接口方法,这些Source和Sink点在处理的时候存放在同一个文件中,通过特殊符号来标记。由于涉及到的Source和Sink很多,这里列举部分来说明问题。Source使用“_SOURCE_”来标记。
1)
//获取用户所在位置纬度信息
2) getLongitude()> -> _SOURCE_ //获取用户所 //在位置经度信息 3) //获取用户设备ID 4) //获取Intent中携带的数据 5) //读取用户短信 上述表示中,冒号前面的部分表示该方法所在的类,冒号以后的部分表示该source方法及其返回类型。所有的source都涉及到获取数据的过程。source一般包含get、write、obtain等获取数据的关键字。 Sink使用“_SINK_”来标记: 1) //将数据存入Bundle中 2) //添加Intent携带的数据 3) //发送广播 4) // 添加SharedPreferences数据 5) //发送短信 同样,整条数据反应出该Sink所在的类、方法、方法参数及其返回值。Sink中的方法都涉及到写或发送数据的过程。一般包含put、read、send等关键字。 检测过程中,判断待检测的apk应用中涉及到隐私数据的接口是否属于Source集合,如果属于,则追踪。在数据传输过程中,检测该数据的流向是否涉及到Sink集合中的方法,如果有,则表示可能存在隐私泄露。同时,获取该数据的附加信息,判断其是否属于白名单,如果属于,则表示应用是正常的,否则表示该应用存在泄露用户隐私的行为。 根据给定符号定义,检测方法可以形式化的描述为: T(Source[i]→Sink[j])=∪ 对于以上等式,分析如下: T(Source[i]→NextNode),NextNode∈Sink表示在经过ICFG进行分析的过程中,以每一个apk中的Source源作为起点,根据ICFG找到下一个节点,判断该节点是否属于apk中的Sink集合中的元素。如果属于,则表示该Source和Sink之间存在污染路径,将其保存到对应集合中。 表示在分析过程中,某些特定Source到Sink的路径是安全的路径,这些路径用于正常的功能。例如,某导航应用,为了达到导航的目的,需要获取用户的精确位置,然后发送到给定服务器,服务器再制定出最佳路线发送给用户,而Info就表示接收端的附加信息。该过程存在隐私窃取,但并不存在隐私泄露。分析过程中将该类安全路径保存到集合T[SafeSource[k]→SafeSink[p]]中,通过判断传输过程中的特定数据Info,来决定是否将其从路径集合中去除。如果检测结果路径属于该集合的元素,并且Info满足白名单集合,则将其从污染路径T[Source[i]→Sink[j]]中去除。 T(Source[i]→Sink[j]),otherwise表示其他情况。 通过以上分析可以看出,某些恶意应用的行为与正常应用行为存在相似性,甚至相同。为了找出这些隐藏的恶意应用,在静态污点分析过程中,加入部分关键判定信息,可以提高检测的准确性。 2.2 实验结果分析 Fowdroid提供了一个Android测试集DroidBench[12],1.0版本中包含了39个不同的Android应用。所有的这些应用单独包含某个需要检测的模块,如别名、生命周期、数组等,而对于某些原本就不存在隐私泄露的应用,Flowdroid很可能出现误报。因此,在测试集中,我们添加两个不存在隐私泄露的Android应用作为检测对象,这些应用描述如表2所示。 表2 Droidbench添加的apk 通过对Droidbench中41个apk做静态分析,这些apk总体情如表3所示。 表3 检测对象情况 FlowDroid与DFlowDroid实验结果对比如表4所示。 表4 实验结果对比 实验结果可以看到,DFlowDroid对某些特定的应用具有识别作用,它能够根据所给安全路径中携带的安全数据进行判断,从而降低误报数,提高检测的准确性。 本文基于FlowDroid完成了Android恶意应用静态检测增强型方法DFlowDroid。该方案通过对FlowDroid进行改进,在一定程度上提高了准确率,但还是存在一定的局限性。首先,FlowDroid本身的冗余、效率问题没有得到更完美的解决。其次,DFlowDroid在检测过程中,需要从多方面收集安全路径集合中携带的安全数据信息,这需要对大量数据进行分析挖掘。而本文通过两个简单的apk作为实验对象进行检测,存在局限性。 Android手机日益普遍,很多手机厂商对Android原生系统进行修改后应用于自己的手机品牌,这就带来了各种各样的问题。因此,对于手机隐私泄露的研究具有实际意义。在后续研究中,将在该工具的基础上不断完善,争取达到在提高效率的同时,能够结合动态检测相关技术,实现一个高效率、高准确性的Android恶意应用检测工具。 [1] 张玉清, 王凯, 杨欢,等. Android安全综述[J]. 计算机研究与发展, 2014, 51(7):1385-1396. [2] Lu L, Li Z, Wu Z, et al. CHEX:statically vetting Android apps for component hijacking vulnerabilities[C]// ACM Conference on Computer and Communications Security. ACM, 2012:229-240. [3] Yang Z, Yang M. LeakMiner: Detect Information Leakage on Android with Static Taint Analysis[C]// Software Engineering. IEEE, 2012:101-104. [4] Gibler C, Crussell J, Erickson J, et al. AndroidLeaks: automatically detecting potential privacy leaks in android applications on a large scale[C]// International Conference on Trust and Trustworthy Computing. Springer-Verlag, 2012: 291-307. [5] Reina A, Fattori A, Cavallaro L. A system call-centric analysis and stimulation technique to automatically reconstruct android malware behaviors[C]// EUROSEC, Prague, Czech Republic,2013: 5-11. [6] Reps T, Horwitz S, Sagiv M. Precise interprocedural dataflow analysis via graph reachability[J]. Lecture Notes in Computer Science, 1995, 167(96):49-61. [7] Einarsson A, Nielsen J D. A survivor’s guide to Java program analysis with soot[D]. BRICS, Department of Computer Science, University of Aarhus, Denmark, 2008: 16-63. [8] Lhoták O, Hendren L J. Scaling Java Points-to Analysis Using SPARK[C]// Compiler Construction, International Conference, Cc 2003, Held As. DBLP, 2003:153-169. [9] Bartel A, Klein J, Traon Y L, et al. Dexpler: converting Android Dalvik bytecode to Jimple for static analysis with Soot[C]// ACM Sigplan International Workshop on State of the Art in Java Program Analysis. ACM, 2013:27-38. [10] Arzt S, Rasthofer S, Fritz C, et al. Flowdroid: Precise context, flow, field, object-sensitive and lifecycle-aware taint analysis for android apps[J]. ACM SIGPLAN Notices, 2014, 49(6): 259-269. [11] Bodden E. Inter-procedural data-flow analysis with IFDS/IDE and Soot[C]// ACM Sigplan International Workshop on the State of the Art in Java Program Analysis. ACM, 2012:3-8. [12] Fritz C.Secure Software Engineering/DroidBench[EB/OL].https://github.com/secure-software-engineering/DroidBench/. AN ANDROID PRIVACY PROTECTION METHOD BASED ON FLOWDROID Ma Shaoju Wan liang*Yang Ting Ma Linjin (CollegeofComputerScienceandTechnology,GuizhouUniversity,Guiyang550025,Guizhou,China) With the expansion of the mobile device market, Android operating system occupies a large share of the mobile phone market. Mobile phone equipment is carrying more user privacy data. As the open source features of Android system, there are many security risks. In this paper, we propose an Android-enhanced privacy protection method based on FlowDroid, static taint analysis method of Android applications, and whether there is privacy leak, and based on FlowDroid static stain analysis tool to achieve and verify. Verification shows that the proposed method is valid. Static taint Privacy leak ICFG (Inter-procedural Control-Flow Graph) Android operating system 2016-09-02。马绍菊,硕士生,主研领域:信息安全,Android隐私保护。万良,教授。杨婷,硕士生。马林进,硕士生。 TP309 A 10.3969/j.issn.1000-386x.2017.05.0553 结 语