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

[安全漏洞公告专区]TaintDroid剖析之IPC级污点传播

发帖
107
云币
373
l:6,QaT1  
TaintDroid剖析之IPC污点传播 8E&XbqP+  
U`Jy!x2m  
作者:简行、走位@阿里聚安全
Ko&hj XHx  
V]c;^  

+#b:d=v!  
S|rgCh!h  
前言 H_!4>G@  
在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪、Native方法级跟踪。本篇文章我们来分析下IPC级污点传播。 Nfe>3uQK  
i`/+,<  
TaintDroid深入剖析系列目录: o47r<>t  
6+V\t+aug  
TaintDroid深入剖析之启动篇 IC{eE  
TaintDroid剖析之DVM变量级污点跟踪(下篇) jEc|]E  
TaintDroid剖析之Native方法级污点跟踪分析 z|?R/Gf8  
! / y!QXj  
具体实现 )5%C3/Dl!  
q'oMAMf}  
这里我以情景为上下进行跟进,每个情景会涉及多个源文件,它们之间的逻辑是互相完整和独立的。 FLoNE>q  
Java层Taint的传播是通过类Taint(libcore/dalvik/src/main/java/dalvik/Taint.java)实现的。 j7FN\ cz  
M fk2mIy  
d0hhMx6$  
情景——IPC传递 zJ+8FWy:S  
T{]~07N?  
代码:frameworks/base/cmds/servicemanager/binder.c ]maYUKqv}'  
frameworks/native/libs/binder/Parcel.h zPEg  
frameworks/native/libs/binder/Parcel.cpp E6Rz@"^XV  
framework/base/core/java/android/os/Parcel.java ?::NO Dg  
framework/base/core/jni/android_os_Parcel.cpp
KucV3-I  
41#w|L \  
#X: 'aj98  
分析: 2=-utN@Z  
为了实现IPC的污点跟踪,taintdroid给每个Parcel单独维护了一个taint_info的结构体,其定义在Parcel.h,如下所示: xE}VTHFo'  
>$gG/WD?KR  
struct taint_in_parcel Lf:uNl*D  
{ 5`~mmAUk;`  
uint32_t pos; //污点始址 W$JebW<z(  
uint32_t len; //污点长度 |W$DVRA  
uint32_t taint; //污点标记 sUl6hX4  
}; !>x|7   
struct taint_info G{aT2c  
{ UH@a s  
uint32_t mTaintSize; // 当前污点项长度 H@X oqgI  
uint32_t mCurPos; // 当前项索引 :J}t&t  
uint32_t mCurAllocatedSize; // 当前可用项长度 ~5ZvOX6L2  
struct taint_in_parcel * parcelArray; //污点项数组 %zC[KE*~  
void* mOwnerCookie; //作用未知 4@ILw  
};
s/"&9F3  
k)S.]!u&G  
然后提供了两个方法对这个结构进行操作,分别是Parcel::updateTaint和Parcel::getTaint。 =U OLT>!  
updateTaint的功能是动态添加污点到当前Parcel,其实现如下:
ezhDcI_T  
D0Z\Vvy  
ufa41$B'yG  
r%wA&FQ8U  
而getTaint的功能是根据指定的范围获取对应的tag值(因为Parcel的数据是线性存储的),其实现如下所示: 4A{|[}!  
1{pmKPu  
a\kb^D=T  
v/uO&iQw5  
t<uYM  
为了可以方便上层接口调用,在android_os_Parcel.cpp通过JNI对上层提供了接口, :&}odx!-!C  
e"-X U@`k1  
P7r'ffA  
Mr+@c)  
Jsg I'  
p\wJD1s  
再来看一下Parcel.java层污点传递的具体实现,我从四个函数分析,其他的逻辑是类似的。 G@!z$  
>YW\~T  
Parcel.marshall是把Parcel序列化为byte[],其实现如下 PZ:u_*Vu`  
m!XI{F@x  
3HG;!D~m;  
dYFzye  
&zL#hBE  
[{[N(g&d  
通过getTaint获取当前Parcel的污点集合tag,再通过Taint.addTainByteArray把tag传递给序列化后的data对象。
vY6W|<s  
(J$\-a7<f  
Parcel.unmarshall的作用跟Parcel.marshall是相反的,通过byte[]还原Parcel对象,其实现如下:
S6nhvU:  
NCeaL-y7  
4}v@C|.p  
*E>.)B i  
78#!Q.##  
WiNT;v[  
先通过Taint.getTainByArray拿到data的tag,然后再同步到还原后的Parcel对象。
`Y?t@dd  
\ v@({nB8  
Parcel.writeInt是往Parcel中写入一个32位的整型,其实现如下:
O/AE}]  
XY7Qa!>7j  
a+41|)pt  
xc 1A$EY  
%:6?Y%`*[  
7D"%%|: h  
先获取被写入的val的tag,然后再通过调用updateTaint把污点数据同步到当前Parcel对象。
`%K`gYhG1  
<T,A&`/  
Parcel.readInt是执行与Parcel.writeInt相反的动作,从Parcel中读出一个32倍整形,其实现如下所示: )yee2(S  
A(6xg)_XQ  
UgHf*m  
.,2V5D-${  
,#u\l>&$  
9 wa,k  
依据当前的pos和len,getTaint返回对应的tag,然后再通过Tain.addTainInt同步到最终结果val2。
uq7T{7~<  
0O@_ cW  
Go\VfLLw  
4z4v\IpB  
总结: 8m=Z|"H@  
J07O:cjyu  
TaintDroid的IPC污点跟踪粒度是变量粒度的,因此大大提高了污点传播的精准度。下一步继续分析下File & Memory & Socket 级污点传播。 1IH[g*f  
"Tbnxx]J  
=Z0t :{  
作者:简行、走位@阿里聚安全,更多Android安全类技术文章,请访问阿里聚安全博客
:Z`4j  
^tAO_~4  
<HoAj"xf  
nnCug  
[ 此帖被移动安全在2016-08-10 11:07重新编辑 ]
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)