基于TaintDroid的动态污点检测技术分析*
2016-07-01王建伟金伟信吴作顺
王建伟,金伟信,吴作顺
(1.中国人民解放军理工大学 通信工程学院,江苏 南京 210007;2.中国电子设备系统工程研究所,北京 100141)
基于TaintDroid的动态污点检测技术分析*
王建伟1,金伟信2,吴作顺2
(1.中国人民解放军理工大学 通信工程学院,江苏 南京 210007;2.中国电子设备系统工程研究所,北京 100141)
摘要:随着android智能手机的普及,用户隐私泄露成为智能终端上最严重的安全问题之一。TaintDroid首次在android平台上实现了动态污点追踪,是当前解决Android平台隐私泄露问题的研究的热点。在综述TaintDroid及其基本架构的基础上,深入分析了TaintDroid污点标记的添加、存储、传播和提取等关键技术,并通过Android实际应用对TaintDroid如何检测隐私泄露进行了验证。最后给出了TaintDroid存在的不足和需要的改进之处,为今后的进一步研究指出了方向。
关键词:Android;TaintDroid;隐私泄露;动态污点检测
0引言
Android系统凭借其开源、易用等特点占有中国智能手机市场的绝大多数份额。Android手机中存储着大量的用户隐私信息,一旦这些信息泄露,将可能给用户带来严重经济、精神损失[1]。因此Android手机隐私泄露是一个必须关注的问题。针对这个问题,2010年Enck等人[2]在Android2.1系统上实现了动态污点跟踪系统TaintDroid,而后一系列基于TaintDroid的系统和隐私检测工具被提出。本文对TaintDroid的设计框架和实现原理进行了分析,研究了其核心关键技术,并最终给出了TaintDroid存在的不足之处。
1TaintDroid概述
Taintdroid不是一个安装在android系统上的一个应用,它其实是一个自定义的Android ROM,是通过将android的框架层代码改写实现的。因此每一个版本的TaintDroid都与Android一个特定的版本相对应。到目前为止TaintDroid分别在Android2.1、Android2.3、Android4.1和Android4.3版本上进行了移植。我们可以下载android源码,用相应TaintTroid源码来替换android源代码中的部分代码并编译,将其刷入设备(TaintDroid的官方网站上建议的设备为Galaxy Nexus,Nexus 4,Nexus 7 (2012),or a Nexus 10)或者模拟器,然后运行其自带的应用TaintDroid Notify在后台监控我们安装的应用程序是否存在隐私泄露行为。一旦应用程序泄露了用户的隐私,TaintDroid会以通知的形式来告知用户。
TaintDroid的思想就是将所有隐私数据变成污染源,在程序运行的过程中如果对污染源进行截取、拼装、加密、传递等操作,那么新生成的数据也会被污染[3]。如果有被污染的数据被泄露出去,那么就发生了隐私泄露。TaintDroid首先修改产生隐私数据的API[4](涉及摄像头、麦克风、短信、通话记录等)添加污点标记;然后在Davlvik虚拟机实现细粒度指令级的污点跟踪,在文件和IPC(inter-process communication)消息级别实现粗粒度的污点跟踪;最后在网络出口检测污点标记。图1详细描述了TaintDroid的整体设计框架[5]。
图1 TaintDroid整体框架
(1)手机内部的敏感信息,如地理位置、通讯录等隐私信息,在有足够多内容的受信任应用程序中被视为污点。
(2)污点接口调用本地方法的Dalvik虚拟机解释器的接口,同时将标记的污点存储在虚拟的污染地图的指定位置。
(3)在Dalvik虚拟机中,当受信任的应用程序使用了受污染的信息,受感染标签将随着数据流传播。多个虚拟机解释器会同时传播受感染的标签。
(4)当受信任的应用程序在进程间通信中使用了受污染的信息,修改后的Binder库确保数据包里有污点的标签,反映合并感染标记包含的所有数据。
(5)这个数据包是通过内核并被远程不受信任的应用程序接收。值得注意的一点是,解释代码是唯一不可信的。
(6)修改后的Binder库从数据包里检索出污点标签并将其分配给所有读取的值。
(7)同样地,不受信任的应用程序需要时,污点标签也在远端的Dalvik虚拟机中传播。
(8)不受信任的应用程序调用被指定为污点标签片,例如网络发送、通讯录、通话记录等。
(9)该库检索污点标签中可疑的数据,并报告这些可疑事件。
2TaintDroid的关键技术
2.1污点标记的添加技术
隐私数据的类型包括基本的数据类型int、double、char等,扩展数据类型包括数组、字符串等。如我们的sim卡标识可能使用的就是基本类型int,而短信息就可能是扩展类型字符串。
在TaintDroid的源代码taint.java中提供了以下函数对隐私数据的类型进行污点标记。
addTaintInt(int val,int tag);
addTaintFloat(floatval,int tag);
……
Taintdroid通过修改该API内部实现来添加污点标记,如果隐私数据一旦被读取,则通过以上方法将污点标记到相应的数据上。例如,如果我们想获得用户的位置信息,就可以通过调用getLastKnownLocation()方法[6],得到一个如下的Location对象这个对象中包含了经度、纬度、海拔等一系列的位置信息。修改getLastKnownLocation()方法,在其内部调用addTaintFloat()方法,为经纬度信息添加污点标记。
下面我们以整型为例,介绍TaintDroid如何为隐私数据添加污点。addTaintInt是一个本地方法,我们在vm/native/ dalvik_system_taint.c文件中找到了具体的实现。
首先,如图2所示传入参数arg0与arg1,分别代表该整数和欲添加的污点,然后建立返回污点指针,接着获取该数据本身自带的污点(程序在初始化整数时会为其分配初始污点标记0),最后更新该污点,整个操作过程也可以理解为实现了污点的传播。
图2 污点标记添加
2.2污点标记的存储技术
Dalvik层有五种类型的变量要求存储:局部方法变量,方法的参数,类的静态变量,类实例的字段和数组。在Android里面的所有引用都是32 bit的,TaintDroid通过修改Dalvik 虚拟机为每个引用分配64 bit空间,程序自身使用32 bit,而TaintDroid使用剩下的32 bit。因此采用bitmap的方式可以标注32中不同类型的隐私。目前TaintDroid只定义了以下17种标记,如表1所示。
表1 污点标记定义
这种方式带来的副作用不言而喻,它会导致程序引用的内存增加一倍,而优点是可精确定位到每个被污染的对象。
局部变量:方法内部使用的临时变量称作局部变量,局部变量通过dalvik虚拟机的寄存器来存储[7](Dalvik虚拟机和jvm虚拟机的一个主要区别是,前者是基于寄存器的而后者是基于栈的)。寄存器是包含基本数据类型和对象引用类型。寄存器通常是32 bit的,对于64为的的数据类型(如long和double),dalvik虚拟机通过分配两个相邻的寄存器来存储,并且通过二进制的指令来决定使用一个或者两个寄存器。Dalvik虚拟机通过栈来管理寄存器。当应用程序调用一个方法的时候,Dalvik产生一个新的栈帧为所有的寄存器分配存储空间。在执行过程中寄存器通过通过寄存器相对栈顶指针的偏移索引来应用该寄存器。例如我们通过fp[0]来引用寄存器v0,通过fp[1]来引用寄存器v1。方法调用结束后帧栈弹出变量。
Taintdroid为每个入栈的寄存器变量分配64 bit的空间,其中32 bit用来存储寄存器变量,剩余的32 bit用于存储污点标签。寄存器变量和污点标签交叉存储,修改后的栈通过fp[2*i]来引用寄存器vi,通过fp[2*i+1]来引用污点标记。注意Dalvik存储一个64 bit的变量是通过两个相邻的32位内部寄存器完成的。修改后的栈格式如图3所示。
图3 修改后的栈格式
方法的参数:Dalvik虚拟机通过寄存器为方法传递参数。本地方法和解释层方法对参数的处理方式是不同的,在方法调用之前指定的参数寄存器被压入堆栈,如果目标方法是解释层的方法,那么新的变量存放在调用栈的栈顶。如果是本地方法必须传递一个指向字节数组的栈顶指针,从中解析出一个32 bit和64 bit的变量来作为方法签名[8]。
这种不同影响了污点的存储,对于解释层方法,我们仍然可以像本地变量一样污点和变量之间交叉存储。对于系统native层污点的存储无法像在解释层一样通过修改虚拟机栈的分配来实现(可以通过修改kernel来实现,但影响面太大),TaintDroid利用增加调用参数的方式来存放污染标记。如图,有一个调用的参数有两个:arg0和arg1,TaintDroid再多加3个参数,第3个参数是输出参数,调用完成后return值的标记就放在这里,第4和第5个参数是输入参数分别是arg0和arg1的污染标记。通过这种方式,在做完一次Native调用后就可以得到return值的污染标记。
类字段:类的静态字段存储一个变量并且被所有的实例共享而实例字段对于不同的实例有不同的值。因此静态字段污点的存储比较简单直接按照数据结构交叉存储数据和污点就可以。实例字段相对复杂,需要存储一个相对于对象实例的偏移。
数组:为了最小化内存的开销,TaintDroid为每个数组只存储一个污点标签。字符串对象采用这种方式不是很合理,因为字符串中所有的字符将会有相同的污点标记,这也可能导致假阳性污染传播。
2.3污点标记的传播技术
如图4所示,TaintDroid是一个多粒度Android的污点跟踪方法,首先TaintDroid利用VM解释器对不可信的应用程序代码进行变量级的跟踪。TaintDroid只跟踪数据不跟踪代码,并且利用VM解释器的上下文提供的多种语义来避免在X86指令集中发生的污点爆炸问题[9,10]。其次TaintDroid在应用程序之间使用信息级别的跟踪,对于进程间通信使用信息污点标记来代替数据污点标记可以最小化系统开销来扩大分析的宽度。再次,当应用程序执行本地方法的时候,采用方法级别的跟踪,各种污点标记被作为返回值返回。最后采用文件级别的跟踪来保证污点标签的持久性。
图4 多粒度追踪架构
2.3.1解释代码污点传播
Dalvilk虚拟机运行唯一的dex机器语言[7]。TaintDroid通过分析dex语义,定义了信息流的传播逻辑。如表2所示。其中vx,vy,vz是寄存器,fy,fz是字段ID,T()表示污点值。
从表2可以看出,污点传播逻辑中包含了数据在dalvik虚拟机中传播的的三大途径:赋值、参数传递、返回值,换句话说就是无论在虚拟机中对隐私数据进行何种操作都会被污染。
表2 DEX指令级污点传播
2.3.2原生代码污点传播
由于android系统的JNI机制,程序会脱离dalvik虚拟机进入原生代码库调用本地方法,taintdroid不能正常进行污点跟踪。为了实现污点的传播,taintdroid对所有的JNI方法进行了手动的修补,通过增加本地方法参数,在调用返回时更新污点标记。
2.3.3二级存储污点传播
当数据写入文件时可能导致污点的丢失,因此TaintDroid设计了每个文件的存储标记。当检测到隐私数据写入文件的时候或含有隐私数据的文件的污点被读取的时候更新污点标记。
2.3.4IPC污点传播
当APP之间存在交换数据时污点标记必须传播。跟踪的粒度直接影响了性能和内存开销,TaintDroid使用信息级别的污染跟踪。一个信息的污染标签代表了信息上一次污点标记分配给的变量。TaintDroid使用了信息水平级的粒度使得在进程间通讯的性能和存储开销达到最小化。
由Android的体系结构可知,所有应用内与应用间通信都是通过binder实现,而关键部分总是写入数据包parcel当中的。当通信内容中包含整数型时,系统提供WriteInt方法就可以将数据写入。但此时将丢失污点信息,因此在该过程中需要添加污点传播代码。当数据写入时将污点一并写入parcel,同时在通信对方接收时一并将污点信息提取并标记到所读取的数据污点位。
2.4污点标记的提取技术
污点标记的提取是TaintDroid污点追踪的最后一步。污点标记的添加和提取是对应的,不同的数据类型用不同的方法来进行提取。在TaintDroid的源代码taint.java中提供了以下方法对污点标记进行提取:
int getTaintInt(intval);
int getTaintString(String str);
int getTaintFloat(float val);
……
TaintDroid选择在网络出口处提取污点标记。在socket内部添加以上方法来提取污点标记,若为隐私数据就利用taint.log()方法将其写入日志。最终利用TaintDroidNotify应用来读取日志信息,并通知给用户应用存在隐私泄露行为。
3实例分析
(1)创建一个TaintDroid定制版ROM的AVD。首先利用我们自定义ROM的system.img文件(在/out/target/product /generic目录里面)替换掉原生SDK的system.img。然后利用eclipse 中的可视化工具Android Virtual Device Manager来创建一个定制的AVD(Device:Nexus,Target:Android4.3.1,cpu:ARM,RAM:768,SD Card:200)。
(2)运行模拟器并安装“酷我音乐盒”。创建完AVD后直接点击Start来运行模拟器。初次运行会比较慢,因为要创建sdcard.img、 userdata.img、userdata-qemu.img等等一系列相关镜像文件。进入Android系统后打开TaintDroidNotify并开启监控,TaintDroid服务会在后台运行。安装“酷我音乐盒”到系统并打开。这时我们就可以看到一个隐私泄露的系统通知。滑动即可查看具体违规的详细情况:“酷我音乐盒”软件会发送IMEI到ip地址60.28.210.86。IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,它与每台手机一一对应,而且该码是全世界唯一的。如果有人获得你设备的IMEI,他就可以获知你的电话号码、中止你的通话、获得你的位置等信息。因此所有泄露的个人信息类型中,IMEI号泄露行为最为严重。
(3)污点分析。应用在网络出口处发送了含有污点信息的数据(IMEI),由此可以得知程序肯定调用了getDeviceId()方法。利用Apktools反编译程序,在~/cn/kuwo/mod/push/pushInit.smail文件中发现了该方法,TaintDroid修改了该方法(~/telephony/gsm/GSMPhone.java)的具体实现,在内部利用addTaintString(mImei,Taint_IMEI)方法为变量mImei添加了污点,并通过getDeviceId()方法返回。这样就完成了污点标记的添加。
虽然TaintDroid可以跟踪数据流,但是在每个地方都打印日志信息会极大的影响系统性能。因此我们无法获得污点变量的传播路径。
从DDMMS中可以看出TaintDroid在网络出口处检测到了应用程序泄露了手机的IMEI信息(0x400代表IMEI污点标记)。我们在该实例最终调用的sendto()方法中看到,TaintDroid在其内部添加了污点提取和生成日志的函数。Taintdroid只跟踪数据流,因此我们只能知道程序存在隐私泄露,而不知道程序是如何产生隐私泄露的。换句话说就是TaintDroid无法跟踪控制流,这需要结合静态分析才能实现。
4改进方向
(1)TaintDroid不允许调用第三方动态库。根据上文的分析,TiantDroid无法对第三方动态库进行污点跟踪,因此所有带有第三方动态库的应用都不能在taintdroid上运行。而我国的大部分的热门应用都要用到第三方动态库,这个问题急需解决。关键代码可以查看源码 davilk/vm/Native.cpp源文件中的dvmLoadNativeCode方法,该方法判断如果应用加载的是应用自己实现的动态库则直接返回,导致应用运行奔溃。
(2)只能跟踪信息流无法跟踪控制流。Taintdroid可以检测出信息的泄露但不能给出程序执行的路径信息,没有使用控制流分析[11-12],从而无法检测Soundcomber这类利用隐蔽信道(手机震动、选项设置等)的攻击[13],但这类行为可利用静态分析识别。
(3)对字符串和数组类型的跟踪粒度不够细。taintdroid在设计时对于字符串和数组类型只标记了一个引用位置。因此即使字符串或者数组中的污染源已经移走,他们依然存在污点标记。这导致了污点追踪过程中可能产生污点的过度扩散[14-16],从而产生误报。例如,定义一个整形数组a[10],其中a[0]为携带污点的数据。即使a[0]从数组中被移除,整个数组还是带有污点标记的。并且我们从数组中提取任意一个索引如a[0],都是带有污点标记的,这可能带来大量的性能消耗和污点爆炸问题。
(4)检测的隐私泄露点不够多。通常情况下,TaintDroid仅仅对一般的网络通信(Socket)进行监测,蓝牙、短信等通信方式没有被监测。
(5)没有对隐私数据的泄露进行拦截。TaintDroid只是监测隐私数据的流向,当隐私数据产生时并没有阻止操作也没有可选的拦截措施。
5结语
本文首先给出了TaintDroid的整体框架,详细分析该框架的实现原理,然后通过对“酷我音乐盒”的安装测试实验,用污点追踪方法对其隐私泄露进行了检测,验证了TaintDroid的有效性。通过对污点的标记、存储、传播、提取等关键技术的分析,我们可以充分了解TaintDroid的多粒度污点跟踪架构。TaintDroid作为隐私泄露的一种通用解决方案,我们分析了其存在的不足,为以后的研究指出了方向。
参考文献:
[1]吴俊昌,蒋凡,程绍银.基于程序分析的 Android 应用恶意行为检测[J].通信技术,2013,46(07):69-72.
WU Jun-chang,JIANG Fan,CHENG Shao-yin.Malicious Behavior Detection of Android Application based on Program Analysis[J].Communications Technology,2013,46(07):69-72.
[2]Enck W,Gilbert P,Chun B G,et al.TaintDroid: An Information-Flow Tracking System for Realtime Privacy Monitoring on Smartphones.[C]// Usenix Conference on Operating Systems Design & Implementation.2010:99-106.
[3]蔡昌.Android平台恶意软件动态监测系统的设计与实现[D].北京:北京交通大学,2013.
CAI Chang.Design and Implementation of the Android Platform Malware Dynamic Detection System[D].BeiJing: Beijing Jiaotong University,2013.
[4]CHENG K,CUI Y.Design and Implementation of Network Packets Collection Tools based on the Android Platform[C]// Fuzzy Systems and Knowledge Discovery (FSKD),2012 9th International Conference on.IEEE,2012:2166-2169.
[5]汤瑾.Android平台下隐私数据保护方法的研究与实现[D].北京:北京邮电大学,2014.
TANG Jin.Research and Implementation of Privacy Protection on Android.Beijing: Beijing University of Posts and Telecommunications,2014.
[6]Kovacheva A.Efficient Code Obfuscation for Android[M]// Advances in Information Technology.Springer International Publishing,2013:104-119.
[7]Protsenko M,Kreuter S,Muller T.Dynamic Self-Protection and Tamperproofing for Android Apps Using Native Code[C]// Availability,Reliability and Security (ARES),2015 10th International Conference on.IEEE,2015.
[8]Claiborne C L,Ncube C,Dantu R.Random Anonymization of Mobile Sensor Data: Modified Android Framework[C]// Intelligence and Security Informatics (ISI),2015 IEEE International Conference on.IEEE,2015.
[9]ZHU D,JUNG J,SONG D,et al.TaintEraser: Protecting Sensitive Data Leaks using Application-Level Taint Tracking[J].Acm Sigops Operating Systems Review,2011,45(1):142-154.
[10]Schwartz E J,Avgerinos T,Brumley D.All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask)[C]// Security and Privacy (SP),2010 IEEE Symposium on.IEEE,2010:317-331.
[11]YUAN J,QIANG W,JIN H,et al.CloudTaint: An Elastic Taint Tracking Framework for Malware Detection in the Cloud[J].Journal of Supercomputing,2014,70(3):1433-1450.
[12]KING D,Hicks B,Hicks M,et al.Implicit Flows: Can't Live with 'Em,Can't Live without 'Em.[M]// Information Systems Security.Springer Berlin Heidelberg,2008:56-70.
[13]彭国军,李晶雯,孙润康等.Android恶意软件检测研究与进展[J].武汉大学学报:理学版,2015,61(01):21-33.PENG Guo-jun,LI Jing-wen,SUN Run-kang,et al.Android Malware Detection Research and Development[J].Wuhan Univ (Nat.Sci.Ed) 2015,61(01):21-33.
[14]杨广亮,龚晓锐,姚刚等.一个面向Android的隐私泄露检测系统[J].计算机工程,2012,38(23):1-6.
YANG Guang-liang,GONG Xiao-rui,YAO Gang,et al.A Privacy Leakage Detection System for Android[J].Computer Engineering.2012,38(23): 1-6.
[15]Slowinska A,Bos H.Pointless Tainting? Evaluating the Practicality of Pointer Tainting[J].Eurosys,2009:61-74.
[16]Schutte J,Titze D,De Fuentes J M.AppCaulk: Data Leak Prevention by Injecting Targeted Taint Tracking into Android Apps[C]// 2014 IEEE 13th International Conference on Trust,Security and Privacy in Computing and Communications (TrustCom).IEEE Computer Society,2014:370-379.
Taint Droid-based Dynamic Taint Detection Technology
WANG Jian-wei1,JIN Wei-xin2,WU Zuo-shun2
(1.College of Communication Engineering,PLA University of Science and Technology,Nanjing Jiangsu 210007,China;2.Institute of Electronic Equipment System Engineering Company,Beijing 100141,China)
Abstract:With the popularity of android smart phones,user privacy disclosure becomes one of the most serious security problems.TaintDroid for the first time realizes dynamic taint tracking on the android platform and becomes the hot research topic in solving the problem of privacy disclosure.Based on the review of TaintDroid and its basic architecture,this paper analyzes in depth the key technologies including the adding,storage,dissemination and extraction of taint marks.In addition,how for TaintDriod to detect privacy disclosure is verified through practical application of Android.Finally,this paper presents the deficiencies and the points to be improved existing in TaintDroid,thus pointing out the direction for further research.
Key words:Android; TaintDroid; privacy disclosure; dynamic taint track
doi:10.3969/j.issn.1002-0802.2016.02.019
* 收稿日期:2015-09-12;修回日期:2015-12-06Received date:2015-09-12;Revised date:2015-12-06
基金项目:国家863 课题(No.2015AA011104)
Foundation Item:National 863 Programs(No.2015AA011104)
中图分类号:TP309
文献标志码:A
文章编号:1002-0802(2016)02-0221-06
作者简介:
王建伟(1986—),男,硕士研究生,主要研究方向为计算机网络;
金伟信(1965—),副总工程师。硕士生导师,主要研究方向为信息安全;
吴作顺(1974—),高级工程师,硕士生导师,主要研究方向为信息安全。