基于细粒度污点跟踪策略的Android应用敏感信息泄露检测
杨天长, 崔浩亮, 牛少彰, 宋文     
北京邮电大学 智能通信软件与多媒体北京市重点实验室, 北京 100876
摘要

针对Android应用存在的敏感信息泄露问题,基于细粒度信息流跟踪策略,利用静态污点跟踪技术设计了一个Android应用敏感信息泄露检测方案.该方案根据Smali代码的语法语义特点、应用内部的函数调用关系及Android通信机制建立了细粒度的污点传播策略,用不同的泄露检测策略和污点传播策略来驱动检测过程,根据跟踪结果确定应用是否存在敏感信息泄露.实验结果表明该方案能够对敏感信息泄露进行有效检测,增加了检测的准确性和灵活性,减少了分析过程中存在的信息流不全面和误报问题.

关键词: 信息流     污点跟踪     敏感信息     信息泄露    
中图分类号:TP393.0 文献标志码:A 文章编号:1007-5321(2016)03-0016-06 DOI:10.13190/j.jbupt.2016.03.002
Sensitive Information Leakage Detection for Android Applications Based on Fine-Grained Taint Tracking Strategies
YANG Tian-chang, CUI Hao-liang, NIU Shao-zhang, SONG Wen     
Beijing Key Laboratory of Intelligent Telecommunication Software and Multimedia, Beijing University of Posts and Telecommunications, Beijing 100876, China
Abstract

In response to the sensitive information leakage problem of Android applications, a detection scheme based on fine-grained information flow tracking strategies and static taint tracking technology was proposed. According to the syntax and semantic of Smali code, the internal call graph of application, the Android communication mechanism, and the fine-grained taint track rules were constructed, the taint analysis was executed as well on the application according to the different leak manner and the propagation strategies. The sensitive information leakage was determined by the taint analysis result. Experiments show that the scheme can detect a variety of ways of sensitive data leakage effectively, improve the detection accuracy and flexibility, and reduce the uncomprehensive of information flow path and false positive rate in the process of detection.

Key words: information flow     taint tracking     sensitive information     information leakage    

Android手机用户在设备上存储了大量的敏感信息,特别像社交软件和金融软件更是存储了保密级别需求更高的重要数据,无论是由于应用在开发设计过程引入的缺陷,还是使用过程导致的共谋攻击,都可能会导致用户的敏感信息被恶意攻击者收集,这将会导致不可预测的后果. 虽然Android系统采用多种措施来增强其安全性,如权限管理、沙盒技术、文件系统权限等,然而现实情况是在多个漏洞报告平台上很多Android应用甚至是知名的应用都被曝存在安全隐患. 在应用市场无法保障他们所提供的应用的安全性和现有的安全检测还存在一定的局限性的现状下,为了提高应用的安全性和提供用户一个安全的应用软件使用环境,针对敏感信息泄露问题研究有效的检测方法十分必要.

1 相关研究

目前对敏感信息泄露的检测分析主要是通过对应用内部和应用之间存在的信息流进行分析,根据应用内部的信息流的可达性分析定位和发现潜在的漏洞. Zhao等[1]设计了TrustDroid静态分析器,该工具对APK文件执行静态语义分析,通过分析确定是否存在敏感数据泄露,来防止一个不被信任的Android智能手机泄露隐私. Fritz等[2]提出了新颖的和高度精确的检测工具Flowdroid,研究利用建立的精确的Android生命周期模型可以有效地处理Android框架调用的回调函数,同时上下文、流、字段和对象敏感的特性减少了误报的数量,新的on-demand算法可以保持高效和精度. Klieber等[3]提出了DidFail检测工具,使用静态分析去检测Android应用中可能的敏感数据泄露,其分析是建立在FlowDroid、Epicc和Soot分析框架之上的. Enck等[4]利用Android虚拟执行环境实现了一个动态的实时污点跟踪系统TaintDroid,但需要为内存系统打补丁和修改Dalvik解析器. 杨珉等[5]针对国内Android应用商城中程序隐私泄露问题,采用静态分析技术获取程序中疑似泄露路径,然后采用动态验证技术进行隐私泄露行为的确认. Gibler[6]等提出了一个自动化的静态检测框架,利用新的Taint-Aware切片分析技术和识别回调函数中存在污染源的方法,可以对大规模的Android应用进行隐私泄露检测.

无论是通过静态的还是动态的技术,污点跟踪都需要面对2个主要问题:一是建立的污点传播规则是否有效;二是检测的污点传播路径是否全面. 完备的传播路径和传播规则才能使污点跟踪技术发挥其应有的优势和效果. 笔者通过建立细粒度的污点传播策略来提高检测的精确性,采用静态分析技术结合Android应用的生命周期模型来提供全面的信息流传播路径,从而提高污点跟踪对敏感信息泄露问题的检测效果.

2 检测方案设计

为了检测Android应用是否存在敏感信息泄露问题,基于静态分析技术设计了一个敏感信息泄露检测方案,整个检测方案的框架如图 1所示. 框架主要分为两层,上层是代码执行层,下层是策略集合,由下层策略驱动上层代码执行.

图 1 检测方案框架
2.1 预处理

在预处理阶段,系统首先会加载控制策略,主要执行3步工作:第一,对Apk文件进行反编译,调用反编译工具根据反编译策略对应用进行逆向处理,反编译出Manifest、layout文件和Dex文件等;第二,利用词法语法分析算法构建应用的调用关系图(CG,call graph)和组件内的控制流图(CFG,control flow graph),为后续的过程间污点传播提供支持;第三,权限过滤,利用权限提取方法分析和提取Manifest文件中申请的权限,根据权限过滤策略分析应用申请的权限是否包含敏感信息访问权限,如果包含则进行污点跟踪分析,否则放弃检测.

2.2 策略集合

策略集合是方案设计的重点,系统能够正确执行和检测结果的有效性需要合理的策略集合来保障,根据敏感信息的泄露方式的多样性和Android系统的结构特征,设计了控制策略、泄露检测策略和污点传播策略,在系统执行的不同阶段执行不同的策略. 系统在启动阶段首先加载控制策略,对应用进行预处理并控制检测的执行顺序,然后根据泄露检测策略对应用进行各种方式的泄露检测,在污点跟踪阶段执行污点传播策略对应用进行污点跟踪.

1) 控制策略

控制策略用来控制检测过程开始和执行顺序,执行预处理各种操作,选择跟踪过程的入口点执行位置和控制污点跟踪的执行模式. 例如,选择通过敏感数据或者是泄露方式来进行敏感数据泄露检测,通过建立系统的控制策略,增加了系统的灵活性和扩展性.

2) 泄露检测策略

目前针对污点跟踪的研究,都将污点数据的source点和sink点配置在单一的数据文件里,无论使用者想检测何种类型的数据泄露都需要将所有的泄露方式检测一遍,增加了等待时间的同时也降低了结果对比性,通过对不同类型的敏感数据采取不同的检测策略,使泄露问题的分类更加明确,使用者可以根据需要增加或者删除检测策略.

笔者建立的泄露检测策略将不同类型的敏感数据进行分类检测,同时增加了对导致敏感数据泄露的多种泄露方式的检测,主要包括缓存、内外部存储、调试信息、邮件等几种类型. 与网络泄露方式相比,虽然缓存、调试信息等方式未将敏感数据传出设备,但是对于攻击者来说依然有可能通过各种途径获取这些重要数据,最终导致用户敏感信息的泄露. 通过在检测策略中增加对这些泄露方式的检测,使检测结果更加全面.

3) 污点传播策略

污点跟踪过程需要根据污点传播策略来判断污点是否进行传播,方案对于不同类型的污点数据传播建立相应的传播策略,在污点跟踪的过程中执行污点标记和污点传播. 为了使污点传播策略具有全面性、准确性和可靠性,根据污点数据可能传播的方式和存储的位置并结合Android的系统框架结构建立了细粒度的污点传播策略模型,如图 2所示,传播策略包括变量级传播策略、消息级传播策略、方法级传播策略和文件级传播策略.

图 2 污点传播策略模型

变量级传播策略:Dalvik字节码的数据类型包括基本类型和引用类型,基本类型包括byte、short、char等类型,除了基本数据类型外就是引用类型,引用类型包括数组和对象. 对于基本的赋值语句,如move vA vB表示将寄存器vB的值赋予vA,如果vB为污点数据就将vA也标记为污点数据,另外还可以通过方法的返回值和对象的字段对基本类型的变量进行操作. 对于数组操作主要包括被赋值和赋值两个操作,如指令fill-array-data vAA +BBBBBBBB表示用指定的数值为vAA引用的数组赋值,如果被赋予的值为污点数据,那么将数组标记为污点数据;指令arrayop vAA vBB,vCC表示将索引vCC指向的vBB寄存器的值取出赋予vAA寄存器,如果vCC指向的数据为污点数据,那么vAA指向的数组就标记为污点数据. 同理,还有aget和aput等指令的操作.

消息级传播策略:Android应用是由4类核心组件构成的,组件之间是通过Intent来实现相互调用的,通信既可以是在单个应用的内部组件之间,也可以是独立应用组件间的通信,因此敏感数据就可以在组件之间进行传播,针对该类型的敏感信息传播采用消息级传播策略进行跟踪. 消息级传播策略用来应对隐式Intent,以组件A和组件B存在Intent通信为例,假设该Intent对象的编号为id1,其通信过程如图 3所示.

图 3 组件通信实例

首先构建Intent的精确模型实现对Intent对象的详细表示,解析应用中存在的每一个Intent对象用信息属性和流属性两个属性来表示. 信息属性包括对象的action、category和data 等字段;流属性用四元组I(From,To,Flag,Id)来表示,From既表示该对象的建立位置也表示该行为的发起者,To表示Intent对象的接收者,Flag用来表示接收者是应用内还是应用间的组件,Id是该Intent对象的编号(如果为null表示为接收者内部虚拟Intent). 对于图 3所示的组件A调用的StartActivityForResult()方法导致传播的Intent对象的流属性就可以表示为I(A,B,true,id1),将onActivityResult接收的信息表示为R(I),该过程信息流就可以表示为source→I(A,B,true,id1); I(null,B,true,null)→R(I(null,B,true,null)); R(I(A,null,true,null))→sink,同理可以将多个组件的通信进行表示. 如果Intent的信息属性存在污染数据就可以传播到组件B中,在组件B中可能进入下一个污点传播的路径,这样通过信息属性和流属性就可以实现消息级的污点标记和传播.

方法级传播策略:Java虚拟机可执行Android应用的代码,还可以通过加载native库执行库内部的方法,Android通过JNI调用native方法,JNI调用桥接器解析方法的参数并分配返回值,如果污点数据通过参数传入native方法,将返回值标记为污点数据,继续进行传播判断,同时记录so库和调用方法的相关信息,考虑采用人工分析进行确认.

污染数据也有可能通过回调函数进行传播,对于普通的方法调用可以将函数的返回值或者参数进行污点标记并继续进行分析,然而对于通过采用注册监听方式的回调方法就不可取了,方案在分析代码的过程中识别调用注册侦听器方法,通过检查参数确定监听者,将回调函数的调用类的调用方法的参数标记为污点数据后继续进行污点传播.

文件级传播策略:Android的存储空间包括内部存储和外部存储,将敏感数据写入两个位置可能会导致敏感数据的泄露,文件的存储是以整体的形式存储的,很难区分是哪一部分,将写入污点数据的整个文件都标记为污点数据,并将关于该文件的格式化信息存放到指定位置进行记录,如果产生读取该文件的操作,其返回值将被标记为污点数据继续传播. 但是保存在外部存储和内部存储的文件的安全性是不一样的,对于sink点为外部存储的信息流,由于文件能被所有应用访问,存在泄露的危险;对于sink点为内部存储的信息流,其安全性根据应用能否获得root权限来判断;如果存储文件被信息流在中间过程访问,将其标记为污点数据继续传播. 根据控制策略将文件级的污点传播路径标记为不同的安全等级加以区分,根据产生的文件记录可以手工进行确认.

如果log输出的内容包含重要的敏感数据,无论是故意或者是忘记关闭将调试信息通过log日志输出都可能导致信息泄露,将调试信息输出也虚拟为文件,对日志系统的输出作为污点传播的一个重要环节,对其进行检测以防止系统将重要敏感数据通过日志输出;缓存文件可能被写入用户的用户名和密码等信息,也可能包括应用的配置信息,如果敏感数据最终写入这些文件,就有可能导致用户敏感信息的泄露,在污点的传播过程中如果存在数据写入了缓存文件,需要将这些文件标记为污点数据,对于读取该类型文件的信息流数据也标记为污点数据.

2.3 污点跟踪

污点跟踪过程根据建立的污点传播策略对敏感数据是否进行污点扩散进行判断,基于对Android Smali代码的语法语义分析和应用的调用关系图,设计的整体污点跟踪过程如图 4所示.

图 4 污点跟踪流程

根据预处理阶段构建的应用的入口点函数集合和检测策略配置的source和sink点集合,污点跟踪阶段匹配应用中存在的入口点函数,从每一个入口点开始对应用进行污点跟踪,在过程内根据预处理阶段产生的CFG对每一句代码进行解析,分析其是否符合2.2节建立的污点传播策略,如果符合则继续传播并将被传播的数据标记为污点数据,如果产生了过程间调用,则通过建立的CG遍历下一个过程函数,并进入下一个过程内的跟踪,从而完成对整个应用的污点跟踪. 通过污点跟踪技术标记污点数据,通过变量、文件或者过程间调用的信息的传播过程记录污点数据是否离开了设备,被传输到外部或者被存储到不安全的位置,即存在从source点到sink点的信息流传播路径,如敏感数据通过网络传输出设备.

3 实验及分析

为了对所设计的检测方案进行验证,实现了一个自动化检测工具,通过对大量的Apk进行检测来检验其有效性和准确性. 例如,联系人信息、图片、短信、位置信息、设备信息等敏感数据,通过短信、网络等方式传输出设备,或者将敏感数据存储或输出到危险的位置,如存储到缓存或外部存储设备等,重点设计了数据库、内外部存储、调试信息、邮件位置等几种类型数据的泄露跟踪策略并进行了检测.

1) 检测结果

对百度移动应用市场下的理财购物、社交通信、办公学习、生活实用、系统工具、休闲游戏6种类型下载量排名至少在前100位的Android应用进行了下载,应用总量为404个. 通过对Android应用市场上的404个应用程序进行大规模的自动化分析与检测,结果发现,214个应用存在敏感数据泄露问题(占总数的53%),180个应用不存在敏感信息泄露问题(占总数的45%),10个应用检测失败,总检测结果如表 1所示.

表 1 检测结果

2) 对比分析

安全市场上存在多个安全检测项目,捉虫猎手和金刚是市场上主流的和具有代表性的两个安全检测平台,笔者选取这两个检测平台作为比较对象. 通过总结这两个检测平台的检测报告和相关资料,将该系统与这两个检测平台进行了对比分析,敏感信息泄露检测项对比如表 2所示. 与这两个检测平台相比,所提方案增加了可以导致敏感数据泄露的多种泄露方式的检测,如调试信息泄露、缓存信息泄露等,从而实现了对敏感数据更加完备的检测,也增加了检测的灵活性.

表 2 检测项对比结果

以“MonitorClient.Apk”作为测试用例1,该Apk是“360手机助手”篡改之后的Apk,加入了一条彩信从调试信息中泄露的路径,检测结果如图 5所示.

图 5 测试用例1

系统可以正确地检测出彩信内容通过调试信息泄露的路径,对比金刚和捉虫猎手的检测结果发现,金刚并未实现调试信息的检测,捉虫猎手在安全编码提醒显示没有编码提醒.

以一款知名的购物软件作为测试用例2,系统检测到其将电子发票存放到了外部存储卡上,这将带来安全隐患,但是金刚和捉虫猎手都未检测出该问题,系统检测到导致安全问题的部分代码如图 6所示.

图 6 测试用例2

3) 准确性分析

针对自动化检测工具的检测结果,为了对检测结果的正确性进行分析,通过手工方式对应用中存在的泄露路径进行检测分析,将工具检测结果和手工检测结果进行了比对,对比分析的对象为工具检测出的15个存在敏感信息泄露的应用,对比分析结果如表 3所示.

表 3 准确性分析结果

手工分析共发现存在敏感数据泄露风险的路径为33条,而所实现的自动化检测系统检测结果为31条. 对每一条路径进行人工审查比对,发现误报路径个数为1条,漏报路径个数有2条,造成误报和漏报的主要原因是路径中需要考虑控制语句. 工具检测出的正确路径为30条,泄露路径检测正确率在90%以上,检测结果基本涵盖了应用中存在的敏感信息泄露路径.

4) 运行时间分析

为了测试执行时间,针对3个大小不同的Apk文件:360免费WiFi、360浏览器和360影视,记录了系统对内部存储和外部存储泄露问题的检测时间,运行时间如表 4所示.

表 4 运行时间测试

目前市场上对Android应用进行安全分析主要采取人工分析和工具检测相结合的模式,人工分析导致检测时间的不确定性因素太多,人工分析的时间周期可能从几十分钟到几天不等. 由表 4可以看到,自动化检测工具的策略执行时间与Apk中Dex文件的大小紧密相关,Dex文件越大,执行时间越长. 从具体执行时间来看,内部存储和外部存储敏感数据泄露检测所需的检测时间均在1 min以内,所实现的自动化检测工具的检测时间可以满足实际的应用需求.

4 结束语

针对Android应用泄露用户敏感信息问题,提出了一种基于细粒度污点跟踪策略的敏感信息泄露检测方案,根据Android的通信机制和Smali代码的语法语义特点建立灵活的污点传播策略,用控制策略、检测策略和污点传播策略来驱动检测的执行. 实验结果表明,设计方案可以有效地覆盖应用中存在的信息流传播路径,提高了检测的灵活性和准确性,可以增强对用户敏感信息的保护.

参考文献
[1] Zhao Zhibo, Osono F C C. "TrustDroidTM":preventing the use of smartphones for information leaking in corporate networks through the used of static analysis taint tracking[C]//International Conference on Malicious and Unwanted Software. IEEE Computer Society, 2012:135-143. (0)
[2] 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. doi:10.1145/2666356 (0)
[3] Klieber W, Flynn L, Bhosale A, et al. Android taint flow analysis for app sets[C]//Proceedings of the 3th ACM SIGPLAN International Workshop on the State of the Art in Java Program Analysis. ACM, 2014:1-6. (0)
[4] Enck W, Gilbert P, Chun B G, et al. TaintDroid:an information flow tracking system for real-time privacy monitoring on smartphones[J]. Acm Transactions on Computer Systems , 2010, 57 (3) :393–407. (0)
[5] 杨珉, 王晓阳, 张涛, 等. 国内Android应用商城中程序隐私泄露分析[J]. 清华大学学报:自然科学版 , 2012, 52 (10) :1420–1426. Yang Min, Wang Xiaoyang, Zhang Tao, et al. Empirical study of privacy leakage in android marketplaces in China[J]. Journal of Tsinghua University:Science and Technology , 2012, 52 (10) :1420–1426. (0)
[6] Gibler C, Crussell J, Erickson J, et al. AndroidLeaks:automatically detecting potential privacy leaks in Android applications on a large scale[M]//Trust and Trustworthy Computing. Springer Berlin Heidelberg, 2012:291-307. (0)