阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 4162阅读
  • 2回复

[安全漏洞公告专区]TaintDroid剖析之File & Memiry & Socket级污点传播

发帖
107
云币
373
— 本帖被 linanxiaoxiao 设置为精华(2016-09-01) —
UB5X2uBv  
JY6&CL`C  
TaintDroid剖析之File & Memiry & Socket级污点传播 Cx,)$!1  
?|}%A9   
Gh.@l\|tf  
XHX$Ur9  
作者:简行、走位@阿里聚安全 9pY`_lxa>  
{Kdr-aC  
+#$(>6Zu"{  

85fv])\y  
3d_PY,=1  
1、涉及到的代码文件 yKy07<Gr>  
kuEB  
9bE/7v  
TaintDroid在File, Memory以及Socket三方面的污点传播主要涉及到如下一些文件: '5:P,1tW U  
PR{y84$  
YY? }/r  
/libcore/luni/src/main/java/libcore/io/Posix.java #" 3az8u  
/libcore/luni/src/main/native/libcore_io_Posix.cpp c <T'_93  
/libcore/luni/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLSocketImpl.java !"dn!X  
/libcore/luni/src/main/java/java/io/FileDescriptor.java Gb?O-z%8*  
/libcore/luni/src/main/java/java/nio/MemoryBlock.java fBZ\,  
/libcore/luni/src/main/java/java/nio/ByteBuffer.java
?n]e5R(cj  
pN]$|#%q(  
A&dNCB  
下面分别对这三方面的内容加以分析。 QqS?-   
+ISXyGu  
vU|.Gw  
1zz.`.R2U  
2、File和Memory级别的污点传播 TAXl73j_CY  
Nvef+L,v  
~w>Z !RuhT  
为了实现文件几倍的污点传播,TaintDroid分别对类FileDescriptor,类MemoryBlock以及类ByteBuffer进行了修改 x: Nd>Fb  
+.p$Yi`  
8G SO]R  
类FileDescriptor在java中用于表征文件句柄,TaintDroid通过两方面的修改达到污点传播的目的。首先是给类FileDescriptor添加了成员变量hasName和name,以及添加了方法getDescriptor(),其作用主要是用于当监控到污点到达污点槽是,可以打印信息之用。 9gz"r  
0lvX,78G;  
Ya_4[vR<  
c/c%-=  
E?& x5?  
9hG+?   
D(GAC!|/]  
其次,在Taint.java中的getTaintFile,addTaintFile,logPathFromFd以及logPeerFromFd函数都是针对fd的。getTaintFile是给某个fd添加污点记录,其实现在(/dalvik/vm/native/dalvik_system_Taint.cpp),代码如下: 0M?nXHA[  
SwDUg}M~  
HxVQeyOR  
GW(-'V/  
z~g7O4#  
~'4:{xH  
mndUQN_Gb  
TaintDroid对Android的文件系统Yaffs2进行了扩充,利用其可扩展字段保存污点信息。getTaintXattr最终会通过系统调用,获取对应fd的污点信息。addTaintFile的实现逻辑分getTaintFile类似,这里不做详细解析。接下来分析logPathFromFd函数。该函数根据fd来获取对应的文件路径,其实现代码如下: ~YuRi#CTD:  
wmNc)P4  
}/Wd9x  
3xW;qNj:!l  
{d;eZt `  
n},~2  
从实现来看,这个函数并没有实质性的操作,因此就不过多分析了。最后是logPeerFromFd函数,从字面意思来看这个函数也是日志打印相关的,而在TaintDroid4.1.1中这个函数还没有实现。 1m/=MET]  
}G8RJxy  
PAe2 hJ  
类MemoryBlock主要在java层提供mmap,malloc等内存的操作封装,这类的使用情景非常多,其中ByteBuffer的实现就是基于MemoryBlock的。TaintDroid为类MemoryBlock添加了一个成员变量taint用于记录污点数据,它对外提供的一系列poke和peek接口都有污点跟踪处理,下面是pokeIntArray和peekIntArray函数的实现,其他类型变量的实现类似: ax0:v!,e  
RRD\V3C84  
6, Q{/  
zS:89y<  
!Xwp;P=  
y*M,&,$  
;3n0 bKDY  
B[ f{Ys  
Ru?Ue4W^b  
b'$j* N  
虽然ByteBuffer是基于MemoryBlock实现的,但ByteBuffer需要对外提供信息的访问接口,因此TaintDroid为了ByteBuffer添加了两个方法,如下所示: ? OBe!NDf  
EX>|+zYL  
F}Bc +i#]  
DytOS}/^9  
+q]  
*@Z/L26s;=  
有了上述的基本修改之后,接下来我们开始分析文件级别的污点传播逻辑。在Android Framework中,所有文件的读写操作,最后都是通过Posix.java实现的,主要有read, pread, write,pwrite四个流程。这里只分析read和pwrite,其他两个流程是类似的。Posix.read实现如下: s)HbBt-  
!oU$(,#9  
XN"V{;OP1  
do{#y*B/g!  
h<*l=`#  
( $3j  
,{c9Lv%@J  
read最终会调用readBytes, readBytes里首先调用原始逻辑readBytesImpl,然后调用Taint.getTaintFile获取当前fd的tag,最终把tag通过Taint.addTaintByteArray函数将污点信息传播到返回结果buffer中。再来看一下pwrite的实现: p5C sw5  
0D>~uNcT}  
-p>KFHj6  
xIF z@9+k  
Q8M&nf  
hQBeM7$F_  
pwrite的污点传播实现,依据bffer的类型(byte[]或者ByteBuffer)会有一个分支,但逻辑都是一样的。这里复用了之前ByteBuffer添加的getTaintDirectByteBufferTaint方法。至此File和Memory级别的污点传播就分析完毕了,接下来看一下网络污点传播。 dUn8Xqj1  
@yaBtZUp3  
Bh*~I_Ta>  
.jr1<LE  
3、Socket级别的污点传播 ;,'!  
UhY )rezh  
`q eL$`  
关于Socket级别的污点传播,TaintDroid主要修改了两个文件,分别是OpenSSLSocketImpl.java和Posix.java(没错,又是它)。先看一下OpenSSLSocketImpl.java。这个文件主要是修改了类SSLOutputStream的两个write方法,需要注意的是这两个方法是污点槽(taint sink),因此这里的主要工作不是进行污点传播,而是实现污点监控日志的输出。我只分析其中一个的实现,见如下代码: |Xd[%W)  
Ii*v(`2b  
AnPm5i.  
nl5K1!1  
;sNyN#  
.,,?[TI  
红色框中的输出表示污点跟踪的数据已经通过网络接口传播到外面了。Posix.sendto函数主要是socket的数据发送,也是一个污点槽,即这里也是污点跟踪的终点。Sendto最终会调用sendtoBytes,我们分析sendtoBytes就行了: 5S$HDO&  
;k7` `  
ER5Q` H  
|i?AtOt@f  
Njq#@*>[p  
^i-%FY_i5}  
]rn!+z  
4、总结 :M|c,SQK  
P>pkLP} Vo  
"MC&!AMv  
通过上面的分析,我们知道了TaintDroid在File,Memory以及Socket这三方面的污点传播实现原理,其实分析下来并不复杂,不过需要把关联代码找全还是需要一些时间的。明白这三个方面的污点传播的实现对我们非常有帮助,因为接下来我们要补充完善其他污点的传播,就可以依葫芦画瓢了。 y%TR2CvT  
7L;yN..0  
Ffj:xZ9rk  
至此,关于TaintDroid的深入剖析系列文章就告一段落了。回顾所有文章,我们发现在整个分析过程中,并不仅仅分析了TaintDroid的污点传播实现,还顺带详细了解了Dalvik、Native栈帧结构,java层数据组织方式以及Android IPC,File, Memory,Socket操作等等等等。我相信,有了这些知识,读者后面无论分析多么复杂的android平台系统,都能做到事半功倍。 6{azzk8  
v_c'npC  
/gy;~eB01  
gSR&CnqZ<  
lu(G3T8  
TaintDroid深入剖析系列文章目录: ZFW}Vnl  
|,sUD/rt  
CM5A-R90  
TaintDroid深入剖析之启动篇 5\=9&{WjND  
TaintDroid剖析之DVM变量级污点跟踪(下篇) `Q(ac| 0  
TaintDroid剖析之Native方法级污点跟踪分析 'b661,+d  
'12|:t&7  
TaintDroid剖析之IPC级污点传播 #(aROTV5a  
j{U-=[$'  
_\]D<\St  
oN `tZ;a  
<*(~x esPS  
作者:简行、走位@阿里聚安全,更多安全类技术文章,请访问阿里聚安全博客
级别: 管理员
发帖
759
云币
1687
只看该作者 沙发  发表于: 2016-09-01
好文,帮推荐!
级别: 新人
发帖
6
云币
6
只看该作者 板凳  发表于: 2016-09-06
ReTaintDroid剖析之FileMemirySocket级污点传播
还不错 ):|)/ZiC'  
M^[ jA](a  
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)