Native 代码是不受TaintDroid监控的。理想情况下,我们获得了相同的传播语义当使用相同的解释副本时。因此,为了精确的在Java层进行污点监控,我们定义了两个必要的前提条件:1)所有被访问的外部变量(对于其他方法的类字段引用)根据数据流都被标记上了相应的污点。2)根据成数据流所有返回值都被分配了一个污点标记。TaintDroid完成这些的前提条件是通过各种人工方式,推断,方法概要,取决于环境要求。
成都创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达10余年累计超上千家客户的网站建设总结了一套系统有效的推广解决方案,现已广泛运用于各行各业的客户,其中包括:集装箱等企业,备受客户赞许。
内部虚拟机方法:内部虚拟机的方法又叫做直接译码法,传递一个指向32位数组的寄存器参数和一个指向返回值的指针。对于java参数和返回值堆栈指针增加提供了如图 4所示的访问污点标记。在不同的版本之间虚拟机内部方法有一个相对很小的数字在频繁的增加,在污点传播需要的时候我们将会进行手动检测和修补。我们鉴定了185个内部虚拟机方法在Android的2.1版本;但是,只有5个要求打补丁的:数组复制的本地方法System.arraycopy()。执行Java反射的几个本地方法。
JNI 方法:调用JNI方法通过JNI调用桥。调用桥解析Java参数并且使用方法的描述符字符串给返回值赋值。为了提供污点传播我们对所有的JNI方法都进行了修补。当JNI方法返回时,TaintDroid调用方法概要标签对污点传播进行更新。一个方法配置文件是一个列表(from,to)指示流动的变量,这些变量可能是方法参数,类变量或返回值。枚举出所有的JNI方法的信息里是一个耗时的过程,最好的方法就是使用源代码完成自动化分析(这个也是我们今后要做的工作)。我们目前包括了一个额外的传播启发式补丁。启发式算法是一个JNI方法中一个保守的方法只操作原语和字符串和返回值。他分配了方法参数污点标记标签到污点的返回值的集合。对于调用方法的对象启发式的算法有假阴性,它涵盖了许多存在的方法。
我们对官方Android版本(2.1)的源码中包含的JNI方法进行了一个调查来确定特定的属性。我们发现了2844个JNI方法与Java接口和C或者C++的实现。在这些方法中,913个方法没有对象的引用(作为参数,返回值,或者方法)因此自动被我们的启发式算法所覆盖。剩下的方法可能有或者可能没有信息流而产生假阴性。目前,我们按需要定义了方法概要。例如,在IBM Native Converter 类中的方法在字符类型和字节类型数组之间要求传播的转换。
当APP之间在交换数据时污点标记必须传播。跟踪的粒度直接影响了性能和内存开销。TaintDroid使用信息级的污染跟踪。一个信息的污染标签代表了信息上一次污点标记分配给的变量。我们使用了信息水平级的粒度使得在进程间通讯的性能和存储开销达到最小化。
我们选择在变量水平实现消息级别的污点传播,因为在一个变量级系统,一个狡猾的接收器可能通过为打包的变量在不同方式的方式下获取没有污点传播的变量而戏弄监控。例如,如果一个IPC包裹的信息包含一系列的标量值,这个接收器可以解包一个字符串,从而获得没有污染传播标签的值在标量值的序列里。因此,为了阻止应用程序可以使用这种来移除污点标记,目前执行污点保护都是在信息层级。
对于IPC之间的污点传播会导致假阳性。类似与数组,所有的数据项为一组分享同一个污点标记。例如,第8部分讨论了跟踪IMSI的限制以免部分配置的参数之在同一个包里。未来将会考虑word级的污点标记以及额外的一致性检查确保解包变量的准确传播。然而这种额外的复杂性将会对IPC性能产生负面的影响。
当数据被写入文件的时候可能会导致污点的丢失。我们设计了存储每个文件的污点标记。这个污点标记将会被更新当写文件或者在读取文件的时候传播数据。TaintDroid存储文件污染标签在文件系统的扩展属性里。为了达到这个目的,我们执行了支持Android的热文件系统扩展属性(YAFFS2)并且格式化了可移除的SD卡与ext2文件系统。至于数组和IPC,存储每个文件的污点标记将会导致假阳性并且限制了信息数据库污点标记的粒度(见第5节)。或者,我们可以跟踪污点标记在更细的粒度通过牺牲更多的内存和性能开销。
污点源和污染池定义的虚拟化环境污染标签必须进行污点交互。我们抽象出污染源和污染池逻辑组成一个单独的污点接口库。这个接口执行两个功能:1)增加对变量的污点标记;2)从变量检索污点标记。这个库只能提供添加未设置或者清除污染标签的功能,这些功能将会被用来对于可以的Java code 移除污点标记。
增加污点标记数组和字符串通过内部虚拟机方式很简单,所有的这些都存储在数据对象当中。对于基本的数据类型,一方面,是存储在解释器的内部栈当方法调用结束之后会被销毁。因此,污点库使用该方法的返回值作为一种污染原始变量的手段。开发人员通过一个值或者变量添加进合适的污点方法中(e.g., addTaintInt())返回的变量值有相同的值只是增加了指定的污点标记。注意栈存储在污点标记检索时不会产生并发。
使用TaintDroid进行隐私分析需要确定操作系统内敏感隐私数据源和检测污染源。在以前,动态污点分析系统假设污点源和污点池的位置是微不足道的。但是,对于像Android这样复杂的操作系统通过各种各样的方式为应用程序提供各种各样的信息,例如:直接访问,服务接口。每一种可能的隐私敏感信息都必须要认真研究才能决定定义污染源的最好方式。
污染源只能够针对TaintDroid提供的存储标签的内存增加污点标记。目前,污点池和污点源的位置都被限定在解释器代码,IPC消息,文件的变量中。本节将讨论这些有价值的污染源和污染池是怎么实现这些限制的。我们给予信息特征对污染源进行了概括。
低带宽传感器:各种各样的隐私敏感信息是通过低带宽传感器获得的。例如:位置信息和加速器。信息是常常会改变的并且会同时被多个应用程序所使用。因此,于智能手机操作系统多路访问低带宽传感器使用一个管理是一个很常见的现象。一个传感器管理者代表了一个理想的污点HOOK位置。对我们分析而言,我们将钩子插入到Android的LocationManager和SensorManager的应用程序中。
高带宽传感器:隐私信息例如麦克风和照相机是高带宽的。它需要传感器频繁的返回许多的数据量并且这些数据都只是一个应用程序来使用。因此,智能手机的操作系统可能通过大数据缓存,文件或者两者共享传感器的信息。当传感器信息通过文件共享,文件必须使用合适的污点便签标记。由于API的灵活性,我们将会对麦克风和照相机信息数据缓冲区和文件污点下钩子。
信息数据库:共享信息例如通讯录地址和短信息常常存储在基于文件类型的数据库中。这样的组织形式提供了有用的明确的污点源类似于硬件传感器。通过添加一个污点标记数据库文件,所有的信息从文件读取将会自动受到污染。我们使用这种技术来跟踪通讯录信息。值得注意的是虽然TrainDroid对于这些变量是文件级别的粒度值是合适的,但是可能存在一些文件对于他们来说粒度可能太大了。但是,我们还没有遇到这样的数据源。
设备标识:信息是唯一的标识电话或者用户敏感隐私。并不是所有的个人的可识别信息都可以很容易的被污染。但是,电话标识了几个容易污染的标识:电话号码,SIM卡标识(IMSI,ICC-ID)以及IMEI都可以通过定义好的API进行访问。我们测试了电话号码的,ICC-ID,IMEI的API。IMSI污染源存在继承限制我们将在第8节进行讨论。
网络污点池:我们的隐私分析确定了污染信息传送的网络接口。VM基于解释器的方法要求污染池被放置在解释的代码中。因此,我们设置了Java framework层的库的HOOK点,这些地方将会被native层的socket库所调用。