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级污点传播

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


阿里聚安全由阿里巴巴移动安全部出品,面向企业和开发者提供企业安全解决方案,全面覆盖移动安全、数据风控、内容安全、实人认证等维度,并在业界率先提出“以业务为中心的安全”,赋能生态,与行业共享阿里巴巴集团多年沉淀的专业安全能力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108896.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SPI接口详细介绍

    SPI接口详细介绍1.概述SPI=SerialPeripheralInterface,是串行外围设备接口,是一种高速,全双工,同步的通信总线。常规只占用四根线,节约了芯片管脚,PCB的布局省空间。现在越来越多的芯片集成了这种通信协议,常见的有EEPROM、FLASH、AD转换器等。优点:支持全双工,push-pull的驱动性能相比open-drain信号完整性更好;支持高速(100MHz以上…

  • vue 如何关闭 eslint 检查

    vue 如何关闭 eslint 检查在实际开发过程中,eslint的作用不可估量,诸如:1.审查代码是否符合编码规范和统一的代码风格;2.审查代码是否存在语法错误;But,对于初学者来说,这个功能极其不友好,各种问题层出不穷,让很多初学者头疼不已,我们有没有办法关掉它,等适当时机在启用它呢,答案是肯定的。不同vuecli版本创建工程的时候,稍微有些差别,要仔细甄别,我的vuecliv4.5.9方案一:vue脚手架创建工程的时候,不要选择Linter/Formatter选项,(那如何选择启用,请参照方案二)

  • Java多线程系列–“JUC锁”09之 CountDownLatch原理和示例

    Java多线程系列–“JUC锁”09之 CountDownLatch原理和示例概要前面对"独占锁"和"共享锁"有了个大致的了解;本章,我们对CountDownLatch进行学习。和ReadWriteLock.ReadLock一样,Coun

  • noip2018普及组初赛解析_NOIP复赛

    noip2018普及组初赛解析_NOIP复赛博主是一个高中生,在进行noip训练的时候遇到这一题,当时写了2个多小时惭愧啊惭愧,只能感叹一声普及组好可怕!!!然而这题在code.vs里只有黄金。。。我现在很怀疑自己是怎么做出那些大师题的。。。原题链接在此:http://codevs.cn/problem/1133/好了,现在我们来分析一下这个题目。这个题目中读入的字符串是只有‘*’、‘+’、‘(‘和’)‘的,而

  • USB转RS485串口电路设计「建议收藏」

    USB转RS485串口电路设计「建议收藏」USB转串口芯片的串口信号一般为TTL/CMOS电平,在实现半双工RS485串口时需要外接485电平转换芯片,设计中需要有信号来控制485转接芯片的发送和接收使能端,建议选择自带485控制引脚的转接芯片(如CH340/CH342系列芯片的TNOW引脚),该引脚默认为低电平,当串口处于发送状态时会自动拉高处于有效状态,发送完成再恢复低电平。同理,可以延伸到其他应用场景,如单片机串口转485电路设计中可以使用GPIO口来控制485转接芯片的发送和接收使能。以MAX485为例:1.DE..

  • 字符串的匹配算法_多字符串匹配

    字符串的匹配算法_多字符串匹配文章目录BF算法RK算法编辑器中的全局替换方法:BM算法坏字符好后缀规则代码实现KMP算法一说到字符串匹配算法,不知道会有多少小伙伴不由自主的想起那个kmp算法呢?想到是很正常的,谁让它那么优秀呢。BF算法不要被事物的表面现象所迷惑,这个算法全称:BruteForce,有个拉风的中文名:暴力匹配算法。能想明白了吧。如果模式串长度为m,主串长度为n,那在主串中,就会有n-m+1个长度为m的子串,我们只需要暴力地对比这n-m+1个子串与模式串,就可以找出主串与模式串匹配的子串。.

发表回复

您的电子邮箱地址不会被公开。

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