一种Android应用程序隐私数据泄露检测方法

2020-08-25 06:56孙昌爱朱维忠李伟芳
郑州大学学报(理学版) 2020年3期
关键词:污点源代码字节

孙昌爱, 朱维忠, 李伟芳, 何 啸

(北京科技大学 计算机与通信工程学院 北京 100083)

0 引言

随着移动互联网络的快速发展,Android已经成为智能终端上的主流操作系统,并涌现出了大量的第三方Android应用程序。由于第三方应用程序的监管和审核机制存在缺陷,发布的Android应用程序质量良莠不齐,很多恶意应用程序通过各种手段来窃取用户的通讯录、短信、电话、照片和邮件等个人隐私信息[1]。目前,在Android应用程序的隐私数据保护方面,主要通过权限机制保护用户的隐私数据。改进Android系统的权限访问机制,可以增强应用程序对用户隐私数据的保护能力[2]。

安装时权限改进主要解决Android系统粗粒度权限机制存在的不足,即在安装时用户只能接受或拒绝应用程序需要使用的权限。文献[3]实现一种细粒度权限管理系统,允许用户在安装某一应用程序时,根据自己的需要阻止某项权限,并且在第三方应用想要申请用户隐私数据的授权时给出相应提示信息。文献[4]提出一个基于可信第三方的Android应用程序完整性验证模型,有助于避免可能遭到的恶意篡改。文献[5]提出一种细粒度上下文相关的系统,允许用户定义与上下文相关的策略,该系统在应用程序运行时强制执行策略。文献[6]提出了一组权限组合安全策略,即Kirin安全规则集,如果Android应用程序申请的访问权限中包含了Kirin安全规则集定义的权限组合时,那么该程序则存在用户隐私数据泄露的风险。然而,Kirin安全规则集中没有考虑利用短信泄露隐私数据的危险权限组合,并且部分规则在新版本的Android平台中不再有效,依据Kirin安全规则集的静态分析方法存在较高的误报率。此外,Android应用程序也可以采用字节码的方式发布,这意味着基于源代码的静态分析方法不再适用。

运行时权限改进主要解决Android权限提升攻击问题,即没有任何权限的恶意程序能够通过第三方程序获得所需的权限[7]。文献[8]提出一个检测权限提升的工具,通过传播访问路径来统一数组和访问映射,减少由于字段不敏感和数组访问与映射访问近似所导致的误报,但系统开销大且算法时间复杂度高。文献[9]提出一种权限提升攻击检测与防护方法,通过监视来自应用程序进程的重要函数调用,来阻止试图进行权限提升的系统调用。文献[10]设计并实现了一个数据流动态追踪系统TaintDroid,该系统对用户敏感数据进行标记并维护标记的传播,当检测到带有标记的污点数据通过网络等途径离开时,则在日志文件中记录带标记的隐私数据、传输该数据的应用程序以及数据传输的目的地等信息。

针对上述问题,本文提出一种静态分析与动态检测相结合的隐私数据泄露检测方法。首先对Kirin安全规则集进行扩展,然后从源代码层与字节码层进行Android应用程序的危险权限组合的解析,最后跟踪隐私数据在系统中的信息流动,并在函数接口处检测隐私数据的泄露情况。在此基础上开发了相应的支持工具,采用一组Android应用程序集评估所提方法的有效性和所开发的支持工具的性能。

1 Android权限机制

Android平台由操作系统、中间件、应用程序框架和应用程序组成。隐私数据安全保护涉及应用程序层的访问权限声明、应用程序框架层的API调用和操作系统内核层的进程保护,Android权限机制如图1所示。具体说来,Android应用程序如果需要访问隐私数据,则必须在配置文件(manifest.xml)中通过uses-permission标签申请相应的访问权限。Android应用程序框架层集成了多种系统应用程序接口(API),应用程序通过调用这些API访问系统的资源和服务,而调用这些API则需要具有相应的访问权限。表1列出了对用户隐私数据敏感的危险权限。这些隐私数据都与用户的敏感信息有关,包括用户的手机状态、手机身份信息、用户地理位置和其他一些媒体数据。目前Android系统共设置了140多种权限[11],主要用于系统资源访问和受保护的API调用。Android在执行应用程序时,首先赋予了它唯一的用户ID,并调用安装包服务对应用程序的配置文件进行解析,获取应用程序所申请的权限;根据所申请权限,授予应用程序相应权限的组ID。因此,启动后的应用程序拥有唯一的用户ID和组ID,并且申请的访问权限已经映射到底层的用户和用户组权限。

图1 Android权限机制Figure 1 Permission mechanism of Android

表1 对隐私数据敏感的危险权限Table 1 Privacy-sensitive dangerous permission

图2 基于扩展权限组合的隐私数据泄露检测框架Figure 2 Privacy leak detection framework based on extended permission combination

2 基于扩展权限组合的隐私数据泄露检测方法

通过系统地分析Android安全机制与隐私数据的访问权限,发现Kirin安全规则集并不完备,遗漏了一些可能导致隐私数据泄露的权限组合,并且部分规则在新版本的Android平台中不再有效。为了改进基于权限组合的隐私数据泄露分析方法的有效性与精确性,本文首先对文献[6]提出的Kirin安全规则集进行扩展,然后基于扩展的权限组合规则,提出一种基于权限组合且支持源代码和字节码静态分析与动态检测相结合的隐私数据泄露检测方法,该方法是对TaintDroid架构[10]的扩展。基于扩展权限组合的隐私数据泄露检测框架如图2所示。图中虚线框部分为本文的扩展工作,包括权限组合规则集、权限解析器、隐私数据源和隐私数据标签。

2.1 扩展Android安全访问权限组合规则

Kirin安全规则集[6]中存在一些与隐私泄露无关的规则,其中规则1涉及调试模式的开启与关闭,相关的API是隐藏的,不能被应用程序调用;规则7保护接收到的短信不被篡改;规则8可以防止一个应用程序在创建快捷方式时重定向到一个恶意软件,而规则9中SET_PERFERRED_APPLICATION权限在Android 2.1版本以后已经不再使用(API level 7以上弃用)。因此,这些权限组合规则应该被删除。此外Kirin安全规则集忽略了可能造成用户隐私信息泄露的危险权限组合。例如,Kirin规则没有覆盖表1中所列出的READ_CONTACTS、CAMERA、GET_ACCOUNTS三个可能导致隐私数据泄露的权限。本文首先对Kirin规则进行初步扩展,扩展后的权限组合规则集如表2所示,其中规则9~13为保留的Kirin规则,而规则1~8是本文新提出的。

表2 扩展后的权限组合规则集Table 2 Extended permission combination rules

2.2 基于扩展权限组合的隐私数据泄露静态分析

2.2.1权限解析器 权限识别与危险权限组合判别由静态分析部分完成,本文支持两种静态分析方法:① 在源代码层解析Android应用程序的配置文件申请的访问权限集合,权限解析器首先获取待检测应用程序的配置文件(manifest.xml文件),通过解析uses-permission中声明的权限列表,获得该应用程序的访问权限集合。② 通过解析应用程序安装包APK,获得字节码文件并生成函数调用图,遍历函数调用图并与系统函数-权限映射表匹配,从中提取Android应用程序的访问权限集合(见2.2.2节)。在获取访问权限集合的基础上,检查是否满足表2中的某条规则,即判断是否含有包括INTERNET或SEND_SMS在内的危险权限组合。

2.2.2基于字节码的Android应用程序权限解析 与传统的Java程序不同,Android应用程序通常包含多个入口点。在构建函数调用图时,需要对Android生命周期中的所有可能状态转换进行建模,而不是仅从预定义的主方法main()开始。为此,采用FlowDroid工具[12-13]提供的dummymain()方法模拟Android应用程序各组件的生命周期。为了有效预测Android应用程序的控制流,静态分析时不仅对各组件的生命周期进行建模,还需要将组件与它们注册的回调方法(执行某些操作将调用的方法)相关联。基于字节码的权限解析的主要过程如下。

1) 反编译APK文件:获取Android应用程序的manifest.xml文件、classes.dex文件和layout布局文件。

2) 获取应用程序入口点:分析manifest.xml文件和layout布局文件,获取入口点,即Android应用程序中的活动或服务组件。

3) 模拟组件的生命周期:基于classes.dex文件生成jimple文件(jimple是对字节码的一种抽象)。通过分析jimple文件构造dummymain()方法,并将入口点相关类添加到该方法中,此时该方法仅包括组件部分生命周期方法,如onCreate()、onStop()等。然后从这些生命周期方法开始,寻找与该组件注册的回调方法关联的系统函数,得到与该回调方法相关的函数调用图。类似地,选择该组件注册的其他回调方法,最终得到该组件的回调方法列表及生命周期方法的调用关系。

4) 构建函数调用图:根据组件的生命周期方法和与之关联的回调方法列表,生成完整的函数调用图。

5) 系统权限解析:依据系统函数的权限映射表,遍历函数调用图,提取出Android应用程序申请的系统权限集合。

2.3 基于扩展权限组合的隐私数据泄露动态检测

在静态分析中,分别从源代码层和字节码层提取出Android应用程序申请的访问权限集合,如果识别出危险的权限组合,则进入动态检测过程。该过程采用动态检测方法跟踪是否存在隐私数据泄露的情形,如果存在泄露情形,则给出警报消息。

2.3.1API调用与隐私数据的污点标记 Android平台的安全机制规定:如果Android应用程序需要访问系统提供的资源和服务,则必须调用系统API。通过分析Android中与隐私数据相关的系统API调用,可以得到隐私数据敏感的权限(危险权限)、污点标签和与隐私数据相关的API的对应关系,如表3所示。

表3 危险权限、API和污点标签的对应关系Table 3 Association of dangerous permission, API and taint tags

2.3.2隐私数据着色和传播 采用动态污点分析方法监控隐私数据的处理过程,即图2中的中间件层,并采用着色逻辑进行隐私数据的跟踪。实现着色逻辑的数据结构是着色表,Android应用程序框架层提供了着色表数据结构,并提供访问隐私数据污点标记的接口。隐私数据动态跟踪过程描述如下:当有应用程序访问隐私数据时,记录其数据类型和标签,形成隐私数据污点源。隐私数据污点的传播利用着色表,着色标记接口利用Android系统的JNI机制调用本地方法将着色信息存储在着色表里。Dalvik虚拟机按照应用程序指定的数据流规则对污点标签进行传播,当应用程序在执行一个跨进程的事务中使用隐私数据时,Binder IPC库将记录隐私数据的污点标签封装在Binder(负责进程间通信的内核)消息包(Parcel)中,并进行着色。污点标签通过Binder透明传递后,Binder IPC库从接收到的消息包中提取着色的污点标签,更新着色表,远程的Dalvik虚拟机以同样的方式传播污点标签。当存在非信任程序调用隐私数据(污点终点)时,提取相应的污点标签信息并记录事件。通常情况下,Android应用程序与第三方程序交换数据的途径包括网络、短信、蓝牙与局域FTP连接等[14]。然而,现有的TaintDroid系统实现中仅仅考虑了通过网络接口的隐私数据泄露的检测,因此无法检测出短信接口的隐私数据泄露情况。考虑到蓝牙与局域FTP连接只能在短距离、小范围内传输信息,本文对TaintDroid进行扩展,进一步支持在短信接口处识别隐私数据泄露的情形。处理方法如下:Android应用程序框架最终通过“sendRawPdu()”方法发送短信,该方法的参数中包括发送途径(smsc)、发送编码形式(pdu)和目的地址(desAddr)等,本文在“sendRawPdu()”方法中增加一个发送内容参数(content),跟踪短信发送的内容与地址。

2.4 支持工具

图3 DroidProtector的系统架构Figure 3 Architecture of DroidProtector

基于Java语言开发了面向Android应用程序的隐私数据泄露检测工具DroidProtector,该工具以后台服务的方式提供用户使用。DroidProtector的系统架构如图3所示。该工具的四个模块功能描述如下:① 预处理模块启动后台监控服务,可接受Android应用程序的安装包(APK)进行字节码解析获得申请的权限集合,也可以通过Android源代码的配置文件(manifest.xml)获得申请的权限集合。② 静态分析模块依据扩展的权限组合规则对权限集合进行分析,识别存在隐私数据泄露风险的危险权限组合,设置隐私数据标签。③ 动态检测模块调用TaintDroid对涉及隐私数据访问的API进行污点标记,跟踪隐私数据污点的传播,在网络接口与短信接口处识别是否存在隐私数据的泄露,记录泄露事件的Logcat日志。④ 结果分析模块分析危险权限组合和Logcat日志,生成有关隐私数据泄露的报告。

3 实验评估

3.1 实验一:验证本文方法的有效性

以安卓市场中下载排名靠前的应用程序作为实验对象,选取了209个应用程序。在静态分析阶段,基于源代码的方法有15个应用程序无法通过检测,基于字节码的方法有38个应用程序无法通过检测,原因是在调用第三方库函数时系统发生崩溃,因此不计入实验对象的范畴。采用本文开发的支持工具DroidProtector对实验对象进行检测,实验结果表明:① 基于源代码的静态分析与动态检测相结合的方法检测出18.6%的应用程序存在隐私数据泄露问题,基于字节码的静态分析与动态检测相结合的方法检测出的比例为24.0%。② 本文方法与工具能有效地检测出Android应用程序的各种隐私数据泄露问题。以源代码方法检测结果为例,其中包括:18个应用程序泄露隐私数据IMEI;1个程序泄露IMSI(国际移动用户识别码);4个应用程序同时泄露IMEI和ICCID(SIM卡序列号);4个应用程序泄露地理位置(Location);5个应用程序泄露用户手机号码(Phone Number);2个应用程序泄露用户的联系人信息(Contacts);1个应用程序泄露短信信息(SMS);1个应用程序泄露账户信息(Accounts)。这表明了本文提出的方法有助于降低用户隐私数据被窃取的风险。③ 与源代码方法相比,字节码方法能够检测出更多数量与更多类型的隐私数据泄露情形。

3.2 实验二:本文方法与Kirin安全规则有效性的比较

本文分析与比较了不同权限组合规则检测出的隐私数据泄露的种类与数量。表4统计了源代码方法和字节码方法依据权限组合规则检测出的用户隐私数据泄露情况。从表4可知,权限组合规则1、3、5、6、8、10、11在源代码层或字节码层能检测出应用程序泄露不同类型的隐私数据,权限组合规则2、4、7、9没有检测出隐私数据泄露的应用程序。实验结果表明:① 本文提出的源代码方法与字节码方法基于扩展的权限组合规则(规则1~8)能够检测出更多的隐私数据泄露数量(分别为88.89%与82.26%),而Kirin规则(规则9~13)检测出的隐私数据泄露数量较少(分别为11.11%和17.75%)。② 源代码方法与字节码方法能够检测出更多类型的隐私数据泄露情形(前者检测出的隐私数据类型包括IMEI、IMSI、ICCID、Phone Number、

表4 扩展权限组合规则检测的隐私数据泄露情况Table 4 Summary of privacy data leak detected by extended permission combination rules

SMS、Contacts、Accounts,后者检测出的隐私数据类型包括IMEI、IMSI、ICCID、Phone Number、Camera),而Kirin规则仅检测出音频信息和地理位置隐私数据的泄露。综上所述,与Kirin规则及其检测方法相比,本文扩展后的权限组合规则集及其检测方法能够检测出更多类型和更多数量的隐私数据泄露问题。此外,基于Kirin规则的检测方法适用于源代码层,而本文提出的字节码方法适用于在Android应用程序的源代码无法访问的情形下进行隐私数据泄露检测,因此本文方法具有更强的适用性。

3.3 实验三:DroidProtector的性能评估

图4 性能测试结果Figure 4 Performance evaluation results

由于DroidProtector的动态检测模块是通过扩展TaintDroid实现的,因此通过比较DroidProtector和TaintDroid性能来评估扩展所导致的性能开销。此外,通过比较DroidProtector和Android平台的性能来评估DroidProtector在检测Android应用程序时的时间效率。CaffeineMark[15]是一个广泛的用来比较不同平台上Java程序执行速度的工具。该工具提供了一组基线程序集(包括sieve、loop、logic、string、float、method),采用每秒执行的Java指令数作为度量指标。本文采用CaffeineMark 3.0评估与比较DroidProtector、TaintDroid和Android三个系统的性能,测试结果如图4所示,其中“总得分”表示所有基线程序的总体得分,DroidProtector、TaintDroid和Android的总体性能得分别为1 152、1 403和1 620。实验结果表明:① 与TaintDroid的性能相比,DroidProtector虽然以17.89%的性能开销为代价(主要用于危险权限组合的识别与判断、短信出口检测),但大幅度提高了应用程序的隐私数据泄露的检测能力。② 与Android的性能相比,DroidProtector的性能下降了28.89%。这意味着在使用DroidProtector检测Android程序时性能开销只有28.89%,而基于指令层插桩工具的性能开销通常为2~20倍。

4 结论

本文提出一种基于权限组合的静态分析与动态检测相结合的Android应用程序隐私数据检测方法,并开发了相应的支持工具。采用多个常用Android应用程序对本文提出的方法与工具进行评估,实验结果表明,本文的工作不仅有效解决了Kirin安全规则集存在的不完备和不现实问题,而且能够检测出更多数量与更多类型的隐私数据泄露情形。本文方法能够在源代码存在与不存在两种情形下进行隐私数据泄露的检测,增强了适用性,且开发的支持工具在大幅度提高隐私数据泄露检测有效性的前提下仅引入了较小的性能开销。本文工作仅仅关注检测应用程序隐私数据的泄露,没有区分隐私数据泄露是否合法,未来工作中将进一步研究如何区分合法与恶意的隐私数据泄露问题。

猜你喜欢
污点源代码字节
基于代码重写的动态污点分析
No.8 字节跳动将推出独立出口电商APP
基于TXL的源代码插桩技术研究
No.10 “字节跳动手机”要来了?
污点
轻量级分组密码Midori64的积分攻击
基于语法和语义结合的源代码精确搜索方法
使用Lightroom污点去除工具清理照片中的瑕疵
解密别克安全“源代码”
人类进入“泽它时代”