资讯专栏INFORMATION COLUMN

TaintDroid剖析之File & Memiry & Socket级污点传播

zhaochunqi / 2849人阅读

摘要:类在中用于表征文件句柄,通过两方面的修改达到污点传播的目的。其次,在中的,,以及函数都是针对的。最终会通过系统调用,获取对应的污点信息。至此和级别的污点传播就分析完毕了,接下来看一下网络污点传播。

1、涉及到的代码文件

TaintDroid在File,Memory以及Socket三方面的污点传播主要涉及到如下一些文件:

/libcore/luni/src/main/java/libcore/io/Posix.java

/libcore/luni/src/main/native/libcore_io_Posix.cpp

/libcore/luni/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSocketImpl.java

/libcore/luni/src/main/java/java/io/FileDescriptor.java

/libcore/luni/src/main/java/java/nio/MemoryBlock.java

/libcore/luni/src/main/java/java/nio/ByteBuffer.java

下面分别对这三方面的内容加以分析。

2、File和Memory级别的污点传播

为了实现文件几倍的污点传播,TaintDroid分别对类FileDescriptor,类MemoryBlock以及类ByteBuffer进行了修改。

类FileDescriptor在java中用于表征文件句柄,TaintDroid通过两方面的修改达到污点传播的目的。首先是给类FileDescriptor添加了成员变量hasName和name,以及添加了方法getDescriptor(),其作用主要是用于当监控到污点到达污点槽是,可以打印信息之用。

其次,在Taint.java中的getTaintFile,addTaintFile,logPathFromFd以及logPeerFromFd函数都是针对fd的。getTaintFile是给某个fd添加污点记录,其实现在(/dalvik/vm/native/dalvik_system_Taint.cpp),代码如下:

TaintDroid对Android的文件系统Yaffs2进行了扩充,利用其可扩展字段保存污点信息。getTaintXattr最终会通过系统调用,获取对应fd的污点信息。addTaintFile的实现逻辑分getTaintFile类似,这里不做详细解析。接下来分析logPathFromFd函数。该函数根据fd来获取对应的文件路径,其实现代码如下:

从实现来看,这个函数并没有实质性的操作,因此就不过多分析了。最后是logPeerFromFd函数,从字面意思来看这个函数也是日志打印相关的,而在TaintDroid4.1.1中这个函数还没有实现。

类MemoryBlock主要在java层提供mmap,malloc等内存的操作封装,这类的使用情景非常多,其中ByteBuffer的实现就是基于MemoryBlock的。TaintDroid为类MemoryBlock添加了一个成员变量taint用于记录污点数据,它对外提供的一系列poke和peek接口都有污点跟踪处理,下面是pokeIntArray和peekIntArray函数的实现,其他类型变量的实现类似:

虽然ByteBuffer是基于MemoryBlock实现的,但ByteBuffer需要对外提供信息的访问接口,因此TaintDroid为了ByteBuffer添加了两个方法,如下所示:

有了上述的基本修改之后,接下来我们开始分析文件级别的污点传播逻辑。在Android Framework中,所有文件的读写操作,最后都是通过Posix.java实现的,主要有read, pread, write,pwrite四个流程。这里只分析read和pwrite,其他两个流程是类似的。Posix.read实现如下:

read最终会调用readBytes,readBytes里首先调用原始逻辑readBytesImpl,然后调用Taint.getTaintFile获取当前fd的tag,最终把tag通过Taint.addTaintByteArray函数将污点信息传播到返回结果buffer中。再来看一下pwrite的实现:

pwrite的污点传播实现,依据bffer的类型(byte[]或者ByteBuffer)会有一个分支,但逻辑都是一样的。这里复用了之前ByteBuffer添加的getTaintDirectByteBufferTaint方法。至此File和Memory级别的污点传播就分析完毕了,接下来看一下网络污点传播。

3、Socket级别的污点传播

关于Socket级别的污点传播,TaintDroid主要修改了两个文件,分别是OpenSSLSocketImpl.javaPosix.java(没错,又是它)。先看一下OpenSSLSocketImpl.java。这个文件主要是修改了类SSLOutputStream的两个write方法,需要注意的是这两个方法是污点槽(taint sink),因此这里的主要工作不是进行污点传播,而是实现污点监控日志的输出。我只分析其中一个的实现,见如下代码:

红色框中的输出表示污点跟踪的数据已经通过网络接口传播到外面了。Posix.sendto函数主要是socket的数据发送,也是一个污点槽,即这里也是污点跟踪的终点。Sendto最终会调用sendtoBytes,我们分析sendtoBytes就行了:

4、总结

通过上面的分析,我们知道了TaintDroid在File,Memory以及Socket这三方面的污点传播实现原理,其实分析下来并不复杂,不过需要把关联代码找全还是需要一些时间的。明白这三个方面的污点传播的实现对我们非常有帮助,因为接下来我们要补充完善其他污点的传播,就可以依葫芦画瓢了。

至此,关于TaintDroid的深入剖析系列文章就告一段落了。回顾所有文章,我们发现在整个分析过程中,并不仅仅分析了TaintDroid的污点传播实现,还顺带详细了解了Dalvik、Native栈帧结构,java层数据组织方式以及Android IPC,File, Memory,Socket操作等等等等。我相信,有了这些知识,读者后面无论分析多么复杂的android平台系统,都能做到事半功倍。

TaintDroid深入剖析系列文章目录:

TaintDroid深入剖析之启动篇

TaintDroid剖析之DVM变量级污点跟踪(下篇)

TaintDroid剖析之Native方法级污点跟踪分析

TaintDroid剖析之IPC级污点传播


作者:简行、走位@阿里聚安全,更多安全类技术文章,请访问阿里聚安全博客

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13122.html

相关文章

  • TaintDroid剖析IPC污点传播

    摘要:前言在前三篇文章中我们详细分析了对栈帧的修改,以及它是如何在修改之后的栈帧中实现变量级污点跟踪方法级跟踪。总结的污点跟踪粒度是变量粒度的,因此大大提高了污点传播的精准度。下一步继续分析下级污点传播。 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪、Native方法级跟踪。本篇文章我们来分析下IPC级污点传...

    baishancloud 评论0 收藏0
  • TaintDroid剖析Native方法污点跟踪分析

    摘要:现在我们继续分析其第二个粒度的污点跟踪方法级跟踪。深入剖析系列目录深入剖析之启动篇剖析之变量级污点跟踪下篇分析该函数与基本相同,也是对寄存器所占用的空间进行了倍增。 作者:简行、走位@阿里聚安全 1、Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的。现在我们继续分析其第二个粒度的污点...

    LiuZh 评论0 收藏0
  • TaintDroid深入剖析启动篇

    摘要:虽然很多人都用过,甚至大牛们进行过二次开发,但是目前市面上并没有对进行深入剖析文章。栈帧结构的两端由两个指针来指定。分析当从内部的函数或通过反射调用一个时,系统会为之分配一个栈帧,为了方便,后文将这种栈帧统称为栈帧。 ​ 1 背景知识 1.1 Android平台软件动态分析现状 众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外。...

    elliott_hu 评论0 收藏0
  • TaintDroid 剖析 DVM 变量污点跟踪(下篇)

    摘要:回顾在上一章节中我们详细分析了对方法参数和方法变量的变量级污点跟踪机制,现在我们将继续分析对类的静态域实例域以及数组的污点跟踪。充分理解这一点,对我们后续分析复杂污点传播逻辑很有帮助。对数组对象的修改在成员之后添加成员。 1 回顾 在上一章节中我们详细分析了TaintDroid对DVM方法参数和方法变量的变量级污点跟踪机制,现在我们将继续分析TaintDroid对类的静态域、实例域以及...

    JeOam 评论0 收藏0
  • 浅入浅出FlowDroid(一): 简介&基本使用

    摘要:后文将围绕做一些介绍。尽管如此,的使用对新手而言仍然充满了困难。本系列文章基本为个人见解,难免有错误与误解,如有客观错误欢迎提出。 前言 说到Android的污点分析框架,网上的搜索结果大多指向静态的FlowDroid与动态的TaintDroid。尽管由于加固、混淆等技术使得针对Android的静态分析越来越困难,但静态分析的无先验分析能力无法被动态分析取代,使得静态分析仍有发挥空间。...

    wqj97 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<