APP下载

基于动态污点分析的Android隐私泄露检测方法

2017-09-23

计算机应用与软件 2017年9期
关键词:污点应用程序动态

刘 阳 俞 研

(南京理工大学计算机科学与工程学院 江苏 南京 210094)

基于动态污点分析的Android隐私泄露检测方法

刘 阳 俞 研*

(南京理工大学计算机科学与工程学院 江苏 南京 210094)

针对Android应用存在的隐私泄露问题,提出一种基于动态污点分析技术的隐私泄露检测方法。通过插装Android系统框架层API源码标记隐私数据,并修改Android应用程序的执行引擎Dalvik虚拟机,保证准确跟踪污点标记在程序执行期间的传播,当有数据离开手机时检查污点标记判断是不是隐私数据。动态污点分析使得应用程序对隐私数据的使用更具透明性。实验结果表明,该方法能够有效检测出Android应用泄露用户隐私的行为,从而更好地保护用户的隐私信息。

隐私泄露 动态污点分析 Android

0 引 言

随着移动互联网技术的不断发展,智能终端设备在人们生活中扮演的角色越来越重要。Android是目前最流行的智能终端系统,Kantar Worldpanel ComTech的调研数据显示2015年第三季度,Android在中国已经占据了78.1%的市场份额。Android系统的普及加上其开放性的特点使得基于Android平台的应用程序日益繁荣,丰富的应用程序方便了人们的生活、工作与学习,同时也给用户带来安全隐患。

近年来Android平台恶意软件数量急速增长,种类繁多。统计分析表明,Android恶意软件主要包括隐私窃取、恶意扣费、远程控制、系统破坏等,其中尤以窃取隐私的行为最为常见。手机承载了用户大量隐私信息,比如联系人、短信、位置等,如何保护用户的隐私信息是移动安全研究所面临的重要课题。

鉴于Android平台面临的隐私安全问题,一系列解决方案相继出现。文献[1]将Dalvik字节码转化为Java源码,然后使用Fortify SCA[2]对Java源码进行静态分析,包括控制流分析、数据流分析、结构分析和语义分析,用以检查应用程序的恶意行为和漏洞,但是该方法无法分析进程和组件通信过程中产生的隐私泄露行为。Grace等设计实现了Woodpecker[3],用于检测Android应用存在的能力泄露问题。能力泄露是指应用程序没有显式声明权限却可以执行该权限对应的行为,违背了Android系统基于权限的访问控制机制。该工具主要检测Android应用在没有申请权限的前提下存在的隐私泄露行为,但隐私泄露行为不仅限于此。文献[4]通过权限组合的方式判定隐私泄露类型的恶意软件,但应用程序申请权限不代表一定执行权限对应的行为,因此具有较高误报率。Burguera等提出基于行为的动态检测系统Crowdroid[5],该系统包含客户端和服务端两部分。客户端是安装在Android手机上的App,负责监控Linux内核系统调用并将其发送到服务器。服务器部署了一个基于行为的恶意软件检测系统,对客户端发来的数据进行分析处理得出结论反馈给用户。系统调用缺少Java层的语义信息,难以准确判断出具体的隐私泄露行为。

针对上述Android平台隐私泄露问题,本文设计并实现了一款基于动态污点分析技术的Android隐私泄露检测系统。本系统对Android应用获取的隐私数据进行污点标记,并在程序执行期间跟踪污点标记的流向。当隐私数据离开手机时系统会给出提示,让用户知道自己的隐私数据去往何处,实现了Android应用对用户隐私数据的透明化使用。

1 问题描述

本文将隐私泄露界定为用户的隐私数据(短信、位置、联系人等)通过某种方式发送出去,比如网络或者短信。检测是否发生隐私信息泄露需要解决如下三个问题:

(1) 哪些是隐私数据,隐私数据从何处得来

(2) 隐私数据在程序执行期间是如何变化的

(3) 当数据离开手机时,如何确定其是不是隐私数据

上述三个问题具体到基于动态污点分析技术的隐私泄露检测系统中对应于污点标记、污点传播和污点误用检测三个过程。本文将动态污点分析技术用于检测隐私泄露,被标记的对象是Android用户的隐私数据,Android应用能获取到的隐私数据种类繁多,包括位置、短信、通信录等。污点标记要解决如何对这些隐私数据进行标记的问题,对数据进行准确标记是执行动态污点分析的前提和基础。

动态污点分析技术作为一种动态技术,需要实际运行程序执行分析。应用程序在运行期间数据的流动是复杂多变的,如何准确跟踪污点信息在程序执行过程中的流向是污点传播需要解决的关键问题。此外,由于对隐私数据增加了污点标记,还需要考虑程序运行时内存分配,以及数据存取的问题。

对数据进行标记的目的是追踪其流向,最终判断隐私数据有没有离开手机。基于动态污点分析技术的隐私泄露检测系统要能够监控数据是否离开手机并判断离开手机的数据是不是污点数据。

2 方法与实现

2.1 基本思想

动态污点分析是一种动态信息流分析技术,其原理是首先标记程序中的相关数据,然后跟踪程序运行时数据在内存中的显式传播过程,从而监控应用程序的行为。动态污点分析包括确定污点源,制定污点传播规则和选取污点检测点三项内容。

本文将动态污点分析技术用于检测Android隐私泄露,主要思想是:首先标记Android系统中的隐私数据(位置、IMEI、联系人等),将其作为污点源;然后在程序运行期间根据污点传播规则追踪污点数据(被标记的隐私数据)的传播路径,即追踪污点标记流经的变量、方法等,这一步的主要作用是保证污点标记在程序执行过程中不丢失;最后当程序调用向外发送数据的API时检查数据中是否包含污点标记,从而可以判定有没有发生敏感数据泄露。图1是使用动态污点分析技术检测Android隐私泄露示意图。

图1 动态污点分析过程示意图

如图1所示,污点源和检测点都设在Android系统框架层,应用程序通过框架层提供的API获取隐私数据,本文对框架层源码进行插装实现添加标记和提取标记。

Android应用程序运行在Dalvik虚拟机中,Dalvik虚拟机有一套指令集,本文通过修改相关指令来追踪污点数据的传播过程。包含污点标记的数据(污点数据)在程序运行期间会经过多种操作,污点传播规则定义了不同操作对污点标记产生的影响。数据1和数据2经过运算操作产生数据3,则数据3中包含了数据1的污点标记,这就是一条传播规则,程序中除了运算操作还包括其他种类操作,它们共同决定了污点标记如何传播。数据到达污点检测点时,通过取出其中的污点标记判断是不是隐私数据,从而达到检测隐私泄露的目的。

2.2 方法实现

动态污点分析包含三个过程:污点标记、污点传播和污点检测。本文将动态污点分析技术用于检测Android应用隐私泄露问题,实现这三个过程需要对Android源码进行相应修改。

2.2.1 污点标记

(1) 污点源

污点源是隐私数据的来源,Android应用通过调用框架层API获取隐私数据,如通过getDeviceId()方法获取IMEI等,因此污点源设在此类API处。本文通过在这些API源码处插入额外代码为隐私数据添加污点标记。污点标记可以仅仅用来标识一个数据是不是污点数据,比如用0表示非污点数据,1表示污点数据,也可以包含更丰富的信息,例如标明是哪一类隐私数据(位置、IMEI等)。

(2) 污点存储

污点数据相较于原始数据多了污点标记,污点标记本质上也是一种数据,在程序运行期间需要占用相应的内存空间。Android程序运行时的数据存储是通过维护内部栈实现的,方法的调用和返回依赖于出栈入栈操作。污点数据可能是方法中的参数、局部变量或返回值,本文修改Android虚拟机栈结构,通过额外分配一个字节(8位二进制)存储污点标记。如图2所示。

图2 修改后的虚拟机栈结构

图2是修改后的Android虚拟机栈结构,数据与污点标记相邻存储。由于每个变量都多出一个字节的存储空间,导致数据相对于帧指针的偏移地址发生改变,所以需要调整方法执行过程中获取数据的方式。图中输入参数0相对于帧指针的偏移地址为+(4+1),其中多出的1个字节是局部变量0的污点标记。

Dalvik虚拟机执行的是Dex文件,文件包含应用程序运行所需的全部数据,数据以类为单位存放。Dalvik虚拟机定义了若干结构体作为Dex文件中类数据加载到内存之后的存储形式,包括ClassObject、ArrayObject和DataObject,三者均继承自Object结构体。本文对Dalvik虚拟机定义的数据对象进行了修改,通过在Object结构体中添加额外的成员变量存储对象的污点标记。

如前所述,本文增加了一个字节的空间存储变量的污点标记,八位二进制共有256种编码方式,亦即可以存储256种污点信息。目前,对于Android隐私数据尚没有统一的界定,一般认为隐私数据是涉及用户及系统相关的机密信息,取决于用户的决策,由用户决定。本文根据Google官方对Android权限级别的划分[14],将危险级别权限对应的数据作为本文关注的隐私数据,因为此类数据机密性较高,所以Google才会用危险级别的权限控制应用程序对此类数据的访问,主要包括位置、通信录、手机状态信息、短信、照相机、麦克风、浏览器历史记录,并定义了上述隐私数据对应的污点标记。对于同一种隐私数据,Android系统提供API可能不止一个,比如发短信的API有sendTextMessage()、sendSms()等。本文建立一张存储表用来存储不同编码方式对应的隐私数据种类以及获取该数据所调用的API,如表1所示。

表1 污点标记编码及对应API

2.2.2 污点传播

程序运行过程中会对污点数据进行多次操作,这些操作对污点数据的影响可以概括为两种情况:(1) 原污点数据变为非污点数据;(2) 非污点数据变成新的污点数据。动态污点分析要保证污点标记在程序执行过程中不丢失,亦即实现准确的污点传播过程。污点传播需要考虑两个问题:一是污点标记的存储,二是污点标记的传播规则。

本文通过修改Object结构体和Dalvik虚拟机栈结构实现第一点。对于第二点,Android应用程序运行在各自独立的Dalvik虚拟机实例中,Dalvik虚拟机执行的是由Dalvik字节码组成的指令集合,Dalvik字节码(Android4.3)大约包含250左右条指令。不同指令对污点传播产生的影响是不一样的,本文中污点传播规则是根据Dalvik字节码指令集制定的,此处列举部分规则,见表2。

表2 根据Dalvik指令集制定的污点传播规则

表2中列举的指令格式代表一类指令,比如mov_op vX,vY可以指mov vA,vB,也可以指mov/from16 vAA,vBB等。污点传播规则是根据指令对污点传播产生的不同效果制定的,涵盖了Android虚拟机指令集中的大部分指令。

2.2.3 污点检测

污点检测作用是检查到达sink点的数据中是否包含污点标记。本文将sink点设在向外发送数据的地方,经分析共定义两类sink点:一是通过网络发送数据,二是通过短信发送数据。这两种方式是Android应用最常用的发送数据的方式,Android系统提供了丰富的向外发送数据的API,如通过sendTextMessage发送短信,通过Socket进行网络通信等。与对污点源的处理类似,本文在这些sink点处插装代码用以判断到达sink点的数据中是否包含污点标记。

3 实验结果分析

本部分内容是测试使用本文提出的动态污点分析方法检测Android应用隐私泄露行为的效果。实验中从Android应用市场(豌豆荚)下载了20个生活中常用的App,包含天气、新闻、社交、地图、网购、游戏等多个分类。考虑到篇幅限制,下文选取微信、酷我音乐等几款应用程序的实验结果进行分析。实验主要选取短信(M),位置信息(L),手机状态信息(P)和照相机(C)四种最常见类型的隐私数据进行验证,结果如表3所示。

表3 检测结果

注:“√”表示申请了对应权限,“×”表示没有申请对应权限

由表3的实验结果可见,Android应用普遍存在泄露用户隐私信息的行为,本方法能够有效检测出Android应用是否获取用户的隐私信息并将其发送出去。例如,酷我音乐获取手机IMEI并发送到地址为60.28.201.13的服务器;墨迹天气发送手机IMEI和地理位置到54.223.224.2。由于样本空间的有限,所选样本并未涵盖本文定义的全部隐私数据类型,但是考虑到不同隐私数据仅仅体现在污点源API的不同,因此并不影响本方法的有效性。为保证严谨性,本文编写测试应用对其他几种隐私数据进行了验证,结果表明本方法能准确检测出对应的隐私数据泄露行为。表3中检测出的隐私泄露行为概括起来可以分为两类:一类是需要用户触发,即由用户的相关操作引起的;另一类是在用户不知情的情况下发生的。例如,墨迹天气会在启动后发送手机的IMEI;微信在新用户注册时发送短信。

为了测试本方法的准确度和实用性,实验选取若干已知存在隐私泄露行为的Android应用程序样本进行测试,观察正确检测出隐私泄露行为的比率,并将测试结果与静态污点分析系统FlowDroid[15]进行对比,实验结果如表4所示。

表4 本方法检测隐私泄露行为的准确度

从表4可以看出本方法对不同隐私信息的泄露都有较高的检出率,略低于FlowDroid的检测结果,分析发现是因为FlowDroid将日志输出也作为污点检测点,而本文的污点检测点设在短信和网络发送。对于本方法未检测到的样本,分析认为可能是以下原因:(1) 其使用到的API不包含在本系统修改的API中;(2) 应用程序的有些行为需要满足一定条件才会触发,本实验未满足此类条件;(3) 应用中使用了Native代码,导致系统无法准确跟踪污点标记。

4 结 语

本文针对Android应用泄漏用户隐私问题,提出一种基于动态污点分析技术的检测方法,主要包括污点标记、污点传播和污点检测三个过程。实现这三个过程需要修改Android源码,其中主要涉及到对Android系统架构中的framework层和运行时环境(Dalvik虚拟机)的修改。实验表明,本文方法对检测Android平台隐私泄露行为具有较高的准确度。相对于静态分析技术,动态分析不需要获得Apk源码,现在很多商用软件使用加固技术增加了对其进行静态分析的难度,动态分析技术则不受这方面的限制。

对于通过JNI调用的Native代码,其执行不受Dalvik虚拟机的控制,因此本文无法对Native代码进行准确分析,这是未来工作研究的重点和难点。

[1] Enck W,Octeau D,McDaniel P,et al.A study of android application security[C]//USENIX security symposium,2011,2:2.

[2] Fortify 360 Source Code Analyzer(SCA)[OL].https://www.fortify.com/products/fortify360/source-code-analyzer.html.

[3] Zhou Y,Jiang X.Systematic detection of capability leaks in stock android smartphones[C]//Proceedings of the Nineteenth Annual Network & Distributed System Security Symposium Ndss’12 Isoc,2012:19.

[4] 黄梅根,曾云科.基于权限组合的Android窃取隐私恶意应用检测方法[J].计算机应用与软件,2016,33(9):320-323,333.

[5] Burguera I,Zurutuza U,Nadjm-Tehrani S.Crowdroid: behavior-based malware detection system for android[C]//Proceedings of the 1st ACM workshop on Security and privacy in smartphones and mobile devices.ACM,2011:15-26.

[6] Mann C,Starostin A.A framework for static detection of privacy leaks in android applications[C]//Proceedings of the 27th Annual ACM Symposium on Applied Computing.ACM,2012:1457-1462.

[7] Wei Z,Lie D.Lazytainter:Memory-efficient taint tracking in managed runtimes[C]//Proceedings of the 4th ACM Workshop on Security and Privacy in Smartphones & Mobile Devices.ACM,2014:27-38.

[8] Chen K Z,Johnson N,D’Silva V,et al.Contextual Policy Enforcement in Android Applications with Permission Event Graphs[J].Heredity,2013,110(6):586.

[9] Chen X,Zhu S.DroidJust: automated functionality-aware privacy leakage analysis for Android applications[C]//Proceedings of the 8th ACM Conference on Security & Privacy in Wireless and Mobile Networks.ACM,2015:5.

[10] 高岳,胡爱群.基于权限分析的Android 隐私数据泄露动态检测方法[J].信息网络安全,2014(2):27-31.

[11] 丰生强.Android软件安全与逆向分析[M].人民邮电出版社,2013.

[12] 张子言.深入理解Android虚拟机[M].清华大学出版社,2014.

[13] 吴泽智,陈性元,杨智,等.安卓隐私安全研究进展[J].计算机应用研究,2014,31(8):2241-2247.

[14] https://developer.android.com/guide/topics/security/permissions.html.

[15] 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.

DETECTIONOFANDROIDPRIVACYLEAKBASEDONDYNAMICTAINTANALYSIS

Liu Yang Yu Yan*

(SchoolofComputerScienceandEngineering,NanjingUniversityofScienceandTechnology,Nanjing210094,Jiangsu,China)

This study was motivated by privacy leakage existing in Android applications. Therefore, a privacy leakage detecting method based on dynamic taint analysis was proposed. We first added taint mark to user privacy data through Android framework source code instrumentation. Moreover, we modified execution engine (Dalvik virtual machine) of Android application to ensure that the taint mark can accurately be traced during the execution of the program. When data moves, dynamic taint analysis will check whether or not the taint marks is private data, which makes those applications more transparent. Thus, our approach can effectively detect user privacy leakage, so as to protect the user privacy.

Privacy leakage Dynamic taint analysis Android

TP3

A

10.3969/j.issn.1000-386x.2017.09.029

2016-10-31。国家自然科学基金项目(61572255);中兴通讯研究基金资助项目。刘阳,硕士生,主研领域:Android安全。俞研,副教授。

猜你喜欢

污点应用程序动态
国内动态
国内动态
基于代码重写的动态污点分析
国内动态
动态
黑蚂蚁
删除Win10中自带的应用程序
污点
谷歌禁止加密货币应用程序
三星电子将开设应用程序下载商店