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

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

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


简行、走位@阿里聚安全


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(),其作用主要是用于当监控到污点到达污点槽是,可以打印信息之用。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3、Socket级别的污点传播

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

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

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

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

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://javaforall.net/108896.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入分析C++引用

    深入分析C++引用

    2021年12月10日
  • ucosii操作系统详解_curdate函数

    ucosii操作系统详解_curdate函数UCOSII的用法OSTaskCreate()函数原型:INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)调用者:任务或者是初始化代码。作用:建立一个新任务,任务的建立可以在多个任务环境启动之前,也可以在正在运行的任务中建立,中断处理程序中不能建立任务,一个任务必须为无限循环结构,且不能有…

    2022年9月4日
  • vs tfs使用_win10安装vs2010不兼容

    vs tfs使用_win10安装vs2010不兼容一直是用vss的,最近突然看到,原来已经流行用vsts了(版本管理等服务用tfs)。太落伍了。故决定自己在个人电脑上安装vsts。首先在MSDN上看到,tfs2008以前要装在service系统上面,我没有,也不想去装。后来看到tfs2010几乎支持所有windows系统。故决定用现有的vs2008+tfs2010搭配。            ok,vs2008已有,打补丁sp1,下

    2022年9月23日
  • 操作系统概念第八章部分作业题答案

    操作系统概念第八章部分作业题答案题目一:试说明内部碎片和外部碎片之间的差别解答:内部碎片是指进程所分配的内存可能比进程所需要的大外部碎片是指由于进程的大小不一导致内存被分成小片段且不连续,造成空间浪费。题目二:考虑一个页表在内存中的内存分页系统:(1)如果内存访问的时间为200ns,试问访问页表中的一个数据需要多长时间?(2)如果增加TLB,其中90%的页引用被TLB命中,TLB的访问时间为10n…

    2022年7月14日
  • android 模拟器 haxm,Android模拟器不使用HAXM

    android 模拟器 haxm,Android模拟器不使用HAXM我遇到HAXM问题.在我使用Windows7之前,一切都很好,但升级到Win8.1Pro后,当我从AVD屏幕启动模拟器时,我看不到haxm启动消息.HAXM安装并正常工作,我安装了x86的图像,我的设备使用它但仍然无法在启动窗口中看到Emulator正在使用haxm的确认消息.这是情况;>我的处理器支持vt.>我检查了我的服务,所有Hyper-VT服务都“停止”>HAXM…

    2022年6月28日
  • 论latex插入图片最好的方法!

    论latex插入图片最好的方法!在写过几篇论文后总结出来的一些写论文新手都会遇到的插入图片问题的最高效的解决方法,这是本人在摸索了很多次以后总结出来的方法希望后人可以少走些弯路。毕竟这种小问题读研的时候老师师兄师姐都不会告诉你的都是要靠你自己去解决的。

    2022年6月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号