TaintDroid数据流动态监控关键技术研究

2017-01-06 12:00孙梦阳
中国新通信 2016年21期
关键词:污点数据流调用

孙梦阳

【摘要】 Android 系统凭借其开源、易用等特点备受应用开发商青睐,但随之而来的用户隐私泄露问题确越发严重,如何保护用户的个人隐私数据已成为行业研究热点。本文首先介绍了Android平台逻辑和Dalvik实现原理,分析了TaintDroid 的功能结构,重点研究了TaintDroid数据流动态监控关键技术,最终给出了 TaintDroid 存在的缺陷,为今后TaintDroid系统的拓展和研究指出了方向。

【关键字】 Android 系统 TaintDroid 数据流动态监控

引言

近年来,随着智能移动终端的普及,移动应用市场得到众多商家青睐,其中,Android 系统凭借其开源、易用、自由性等特点占据较大市场份额,针对Android平台开发设计的应用也以指数级增长。正是由于Android系统的开放性等特点,不法开发者有了可乘之机,使得用户的许多隐私数据外泄,给用户造成精神和经济方面的巨大损失。针对这些问题,许多研究者开始致力于安卓用户隐私数据的保护研究,2010 年 Enck 等人在 Android2.1 系统上,经过对系统出口源代码进行修改,实现了系统数据流动态检测系统---TaintDroid,而后一系列基于TaintDroid 的系统和隐私检测工具也相继问世,由于该项技术近几年刚刚起步,对其进行深入研究与拓展意义深远。

一、Android平台逻辑结构及Dalvik实现原理

1.1 Android平台逻辑结构

Android是一个基于Linux内核的移动操作系统,代码是开源的,系统分为四层,分别是Linux内核层,系统运行库和Java运行时环境Dalvik Virtual Machine层,应用程序框架层和应用程序层。

其实现逻辑是:通过linux内核层的内核代码实现最基本的OS操作,而在第二层中,有些已经被编译打包好的系统运行库,可以直接被上层框架调用运行,这部分不是Java代码而是可以直接调用的接口;除此之外,这一层还有对于Android至关重要的虚拟机——Dalvik运行时环境,用于Java代码的执行,其作用相当于PC系统中的JVM。而第三层的应用程序框架层则基本都是由Java代码编写完成的,其中包括一些Android的组件和控件的实现过程和操作,这一部分的代码就需要借助下层的Android Runtime来完成,并且有些需求还依赖于封装好的系统运行库。最顶层的应用程序层便是我们编写Android程序所在层,它调用框架层提供的框架,使用框架层的方法来实现用户APP想要实现的功能。

除此之外,某些对于Android系统的分层方法还包括一层HAL——Android系统的硬件抽象层,它运行在用户空间中,它向下屏蔽硬件驱动模块的实现细节,向上提供硬件服务访问。通过硬件抽象层,Android系统分两层来支持硬件设备。

1.2 Dalvik实现原理

Dalvik是一个面向Linux作为嵌入式操作系统设计的虚拟机,可以看做是Android为了执行Java代码而搭建的,和普通Java虚拟机不同,Dalvik主要是完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等等重要功能。除此之外,Dalvik不仅仅可以执行Java代码,也可以执行Native代码,即C和C++的代码。正是针对于这一特性,Android的Dalvik选择使用C++编写Java接口的实现方法,这样做的好处是让系统的运行更加高效和稳定。TaintDroid基于Android Dalvik的修改大部分就是基于Native代码的修改,由此可以在编译时便封装进环境里去。

Dalvik结构如下图所示:Android系统中包含一个虚拟机VM,它的作用是一句一句执行Java翻译成的dex文件。同时,在Dalvik中还包含有一系列的C、C++代码,这些代码自身就可以执行一系列的操作,并且他们会在系统编译启动是便编译完成,作为机器指令存放于系统中,在VM执行Java任务的过程中,可以对这些机器指令进行调用,这些调用是可见的,也有很多是VM自身对这些机器指令的引用。

Dalvik在底层实现了对上层对象的定义,在源文件中可以看到Dalvik对于上层Object在底层是如何定义的。同时,Dalvik还备有上层函数处理底层对象数据域的接口,并在文件中做了声明。由此,上层的函数也可以通过虚拟机访问真实的数据,这样的结构使得我们通过修改VM虚拟机来添加一些对Java开发者不可见的附加操作变得可能。

二、 TaintDroid数据流动态监控技术原理剖析

TaintDroid不是Android平台的一个应用程序,跟常规的App应用不同,它是通过改写 Android 的接口代码来实现的,因此对Android系统版本有绝对的依赖性。到目前为止TaintDroid 分别在Android2.1、Android2. 3、Android4. 1 和 Android4. 3 版本上进行了移植。TaintDroid是首次在Android使用污点追踪技术,它是在相关的API调用处把隐私数据标记为污染数据来实现对隐私数据的动态监测。

TaintDroid系统想要实现动态监测功能需要解决几个系统的挑战:

(1)污点的存储

(2)解释代码污点传播

(3)原生代码污点传播

(4)IPC污点传播

(5)二级存储污染

2.1 TaintDroid关键技术

TaintDroid主要由如下几部分构成:

(1)给数据的定义类内添加污点字段

在Dalvik对于虚拟机的Object定义的地方加一个成员变量taint,每一个Object都包含一个taint变量。由于是在Dalvik源代码里做的修改,因此上层Java语言不可见。

(2)添加访问污点字段数据域的函数接口

在函数和对象数据域之间的接口声明的文件中,声明Taint接口(函数和数据域),这一步的作用是可以让其它与之关联的C++代码可以使用这些接口来操作这些Taint标记。

(3)实现接口功能

使用底层的C++语言来实现Java呈现出来的接口,接口和实现之间的关联则通过接口

声明来实现。具体代码如下例:

}

总的来说,TaintDroid的功能主要由上述两部分构成:Java环境可见的主动接口调用,和Java环境不可见的底层标记及被动传递。

具体各个修改细节见图片所示

TaintDroid修改细节

首先,我们将所有的TaintDroid系统分为两部分,分别代表修改虚拟机定义的部分和针对污点操作的部分。在虚拟机定义的部分,修改每个Java对象对应于C++代码的现实对象的声明,添加一个Tag用来标记Taint污点记录。显然这个记录是Java不可见的,通过重写相关运算,可以实现在Java开发者不知情的情况下将Taint Tag传递下去。这一部分定义了Taint污点并允许其被动继承,通过重写相关函数来实现。在针对污点操作的部分,主要针对那些系统中的各个隐私组件Frameworks,例如GPS和MIC,这些组件本身就是污

点数据的源头,并且也是基于Java代码级别的功能,因此需要一个Java层可见的接口来处理这些不可见的Taint Tag。所以TaintDroid系统中还包含Taint.java这一部分。而它的实现很显然不可以使用Java,因为它对TaintTag不可见,要用C++来实现,这一部分实现的代码就是上文所说的Native代码部分。

虚拟机对于Dex字节码的运行有如下两个阶段:1.解析Dex字节码并了解其含义; 2.根据其含义进行相关的C/ C++操作。TaintDroid并不关注于如何解释Dex字节码,因为Dex字节码有其特殊规范,而解释这些字节码需要了解其规范,这不在TaintDroid的考虑范围之内。TaintDroid只关注与C/C++如何实现字节码所描述的含义的。换句话说,虚拟机对于dex字节码有翻译和执行两个部分,而TaintDroid则主要关注于执行这一部分。

TaintDroid所能检测到的数据类型的范围正如绪论所言,而这些隐私数据类型也在其实现中被体现了出来,具体代号如下:

TAINT CLEAR

TAINT LOCATION

TAINT CONTACTS

……

TaintDroid使用整型来定义这些隐私数据类型,譬如TAINT LOCATION代表的就是0x00000001,而TAINT CONTACTS就代表的是0x00000002,TAINT MIC就是0x00000004。可见,每一个数据都是2的次方数。

这样表示有一个显著的好处,就是可以以最快捷高效的方式实现污点数据的污点传递逻辑。譬如一个数据C是由一个数据A和另一个数据B生成的,则C的污点逻辑为:

C.taint = A.taint | B.taint;

若A的污点标记是1,B的污点标记是2,则C的污点标记就是1 | 2 = 3。而我们一看到3,就知道它是由1和2两个2的次方数构成的。不可能有别的组合情况。也就是说,我们知道了C包含LOCATION污点和CONTACTS污点。

2.2 TaintDroid的数据类型

提到TaintDroid的数据类型,其实有两个含义,一个是TaintDroid可以添加污点的Java基本数据类型范围,这其中就包括Int、String、Array、Char等类型。针对于这些Java基本类型,TaintDroid给每一个类型提供了添加污点的接口调用。同时在能够真正看到taint标记的C++层面实现这些声明过的接口。

另一个有关“数据类型”的含义指的是TaintDroid隐私数据的隐私类型,也就是说数据到底是GPS数据、还是IEMI数据等。

三、TaintDroid缺陷分析

TaintDroid虽然能够很好的实现隐私数据流的检测,但是其自身还是存在一定不足。

(1)能够检测的控件组件类型有局限性

TaintDroid可以检测GPS位置等诸多隐私数据,但系统中还有许多隐私数据没有被TaintDroid检测到,譬如我们在许多的场合会遇到让用户输入用户名和密码的行为,这些行为最终都会被归结到基于EditText控件的使用,而TaintDroid确缺省了对该控件信息的监控,也就是说,TaintDroid能够监测到的隐私数据源有局限性。

(2)隐私数据源路经不明确

TaintDroid只能了解到途径网络API的各个数据包中是否有添加了污点的隐私数据,但并不能了解这些隐私数据所途径的过程,它们如何被加密,它们如何被传递,它们如何被继承等等。

这主要是因为TaintDroid在隐私传播的过程中使用了被动的污点继承算法,只有虚拟机才能清楚的知道数据的污点是来自于哪些数据的继承,可是利用Java语言写的检测程序则无法通过数据本身获得任何这方面的信息。

(3)关于加密的问题

加密问题是TaintDroid的固有缺陷,它主要涉及两方面:

? 当变量只在逻辑上有关,而在代码和内存上无关的时候,TaintDroid显然无法追踪到数据的传递,因为真正的那个数据根本没有被赋值给任何内存。这是无法改良和完善的,因此TaintDroid并不适用于解决加密数据的监控问题。

? 当一个数组中有某几个数组项是隐私数据,但是整个数组并没有隐私标记的时候,这个数组在继续传递自己的数据的同时的确可以避开污点传递算法的调用。换而言之,TaintDroid无法跟踪如下污点:在一个数组类型的数据中,某一位或几位的字符是有污点的,其它没有污点,那么,整个数组是没有污点的。

四、结语

本文在介绍Android系统逻辑及Dalvik结构基础上,重点对TaintDroid数据流动态监测关键技术进行了剖析,结果表明, TaintDroid工作原理是基于动态污点跟踪技术,其在一定程度上实现了对用户隐私数据的保护,但该系统还存在诸多缺陷,比如监控范围有局限性、隐私数据源路经不清晰、加密数据的监控等,这些都是未来研究与拓展的方向。

猜你喜欢
污点数据流调用
应用数据流分析排除起动机不转故障的研究
数据流和波形诊断技术在发动机故障诊断中的应用
黑蚂蚁
污点
数据流安全查询技术综述
基于Android Broadcast的短信安全监听系统的设计和实现
利用数据流进行电控故障诊断的案例分析
一节生物课的课堂生成
利用RFC技术实现SAP系统接口通信
C++语言中函数参数传递方式剖析