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

其次,在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.java和Posix.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剖析之File & Memiry & Socket级污点传播的更多相关文章
- TaintDroid剖析之IPC级污点传播
TaintDroid剖析之IPC级污点传播 作者:简行.走位@阿里聚安全 前言 在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟 ...
- TaintDroid剖析之Native方法级污点跟踪分析
1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪—— ...
- TaintDroid剖析之DVM变量级污点跟踪(下篇)
TaintDroid剖析之DVM变量级污点跟踪(下篇)作者:简行.走位@阿里聚安全 1 回顾 在上一章节中我们详细分析了TaintDroid对DVM方法参数和方法变量的变量级污点跟踪机制,现在我们 ...
- TaintDroid深入剖析之启动篇
1 背景知识 1.1 Android平台软件动态分析现状 众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外.而随着软件加固.混淆技术的不 ...
- TaintDroid:智能手机监控实时隐私信息流跟踪系统(三)
4.3 原生代码标记传播 Native 代码是不受TaintDroid监控的.理想情况下,我们获得了相同的传播语义当使用相同的解释副本时.因此,为了精确的在Java层进行污点监控,我们定义了两个必 ...
- 套接字socket 的地址族和类型、工作原理、创建过程
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- TaintDroid:智能手机监控实时隐私信息流跟踪系统(一)
1.1 摘要 现今,智能手机操作系统不能有效的提供给用户足够的控制权并且很清楚的了解到第三方的应用程序是如何使用其的隐私数据.我们使用了TaintDroid来阐明这个缺点,其是一个高效的,全系 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
随机推荐
- html5 websocket 实时日志推送
http://blog.csdn.net/neutrojan/article/details/46119645
- SQL 常用脚本
SELECT o.name AS tableName,c.name AS colName,k.keyno AS sort FROM sysindexes i JOIN sysindexkeys k O ...
- php单点登录之模拟淘宝天猫同步登录
说到单点登录大家都很了解,一个站点登录其他域会自动登录. 单点登录SSO(Single Sign On)的方法有很多,比如:p3p.共享session.共享cookice.第三方OAuth认证. 这里 ...
- oracle表分区以及普表转分区表(转)
概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...
- Windows平台下和跨平台的相关公共库
以下主要包含windows下公共库以及跨平台公共库: 1. google base库:google下chromium项目的跨平台公共库: 2. vc_common_src:即HP_SOCKET项目中的 ...
- ViewPager 简单实现左右无限滑动.
只需在在适配器中将getCount 给一个较大的值, 然后将currentItem 设为值的一半 就可以伪实现 无限循环. private static final int PAGE_COUNT = ...
- 前端项目通用、常用js common.js
var url = location.href; if (url.toLowerCase().indexOf("/akweb_admin/") == -1) { function ...
- D3数据绑定
这里转载一个非常经典的关于D3数据绑定的帖子,由D3作者自己写的,非常棒,以至于我忍不住全文copy到此. 原文地址 Thinking with Joins Say you’re making a b ...
- js字符串格式化扩展方法
平时使用js的时候会遇到很多需要拼接字符串的时候,如果是遇到双引号和单引号混合使用,经常会搞混.在C#中有string.Format方法,使用起来非常方便,也很容易理解,所以找到一种参考C#的form ...
- while 循环 。。
这是一个可以循环到天荒地老的循环: 如果while 为真就一直循环下去: count=0 while True: count+=1 if count>50 and count<60: co ...