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

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

发帖
107
云币
373
0 u,=OvU  
TaintDroid剖析之IPC污点传播 h:z;b;  
J.$<Lnt>u  
作者:简行、走位@阿里聚安全
xv$^%(Ujp  
>m:.5][yu  

FT[oM<M\Xd  
"f!*%SR: 1  
前言 Gqk"%irZ  
在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪、Native方法级跟踪。本篇文章我们来分析下IPC级污点传播。 j72cSRv  
KjZ^\lq'  
TaintDroid深入剖析系列目录: C: kl/9M@  
HoH3.AY X  
TaintDroid深入剖析之启动篇 I%e7:cs>  
TaintDroid剖析之DVM变量级污点跟踪(下篇) ,\+tvrR4X  
TaintDroid剖析之Native方法级污点跟踪分析 }sPY+ZjV  
E;VBoN [  
具体实现 x^+ C[%  
M0=ZAsN  
这里我以情景为上下进行跟进,每个情景会涉及多个源文件,它们之间的逻辑是互相完整和独立的。 $#]?\psf  
Java层Taint的传播是通过类Taint(libcore/dalvik/src/main/java/dalvik/Taint.java)实现的。 v0"|J3  
z9w@-])  
AA>5h<NM  
情景——IPC传递 *VHBTO9  
@h>#cwhU  
代码:frameworks/base/cmds/servicemanager/binder.c Se0/ysVB  
frameworks/native/libs/binder/Parcel.h "sT`Dhr  
frameworks/native/libs/binder/Parcel.cpp AU87cqq  
framework/base/core/java/android/os/Parcel.java QAygr4\X^  
framework/base/core/jni/android_os_Parcel.cpp
U|{WtuR  
Vq9hAD|k  
GdG%=+  
分析: }^`{YD  
为了实现IPC的污点跟踪,taintdroid给每个Parcel单独维护了一个taint_info的结构体,其定义在Parcel.h,如下所示: ,J}lyvkd  
<RGRvv  
struct taint_in_parcel m+OR W"o  
{ MYN1zYT6j  
uint32_t pos; //污点始址 OQ+?nB  
uint32_t len; //污点长度 m G?a)P  
uint32_t taint; //污点标记 JYv&It  
}; /3KEX{'@U  
struct taint_info })mez[UmZ  
{ ]"/ *7NM  
uint32_t mTaintSize; // 当前污点项长度 Q96g7[  
uint32_t mCurPos; // 当前项索引 Ae ue:u>  
uint32_t mCurAllocatedSize; // 当前可用项长度 `&pb`P<`  
struct taint_in_parcel * parcelArray; //污点项数组 +Kf::[wP7  
void* mOwnerCookie; //作用未知 rBr28_i   
};
Jc:G7}j6  
>$R-:>~zN  
然后提供了两个方法对这个结构进行操作,分别是Parcel::updateTaint和Parcel::getTaint。 []dRDe;#  
updateTaint的功能是动态添加污点到当前Parcel,其实现如下:
R`1$z8$  
Jt)<RMQ^R  
#e8CuS  
QQ!,W':  
而getTaint的功能是根据指定的范围获取对应的tag值(因为Parcel的数据是线性存储的),其实现如下所示: l@j!j]nE  
j<l>+., U  
:"QRB#EC%  
^eZqsd8a  
8uI^ B  
为了可以方便上层接口调用,在android_os_Parcel.cpp通过JNI对上层提供了接口, <n6/np!  
xUSIck  
UI!EIZ*~  
6b]vHT|p  
n"dT^ g  
)%MB o.NL  
再来看一下Parcel.java层污点传递的具体实现,我从四个函数分析,其他的逻辑是类似的。 [fW:%!Y'  
@l;f';+  
Parcel.marshall是把Parcel序列化为byte[],其实现如下 7XwFO0==  
DD~8:\QD  
=3( ZUV X  
p1|@F^Q  
|faXl3|  
9k *'5(D4S  
通过getTaint获取当前Parcel的污点集合tag,再通过Taint.addTainByteArray把tag传递给序列化后的data对象。
RKBtwZx>f  
M~"K@g=Wr  
Parcel.unmarshall的作用跟Parcel.marshall是相反的,通过byte[]还原Parcel对象,其实现如下:
9JUlu  
=j}00,WH  
SgY>$gP9S  
 Ng-3|N  
&j>`H:  
H7\EvIM=  
先通过Taint.getTainByArray拿到data的tag,然后再同步到还原后的Parcel对象。
z{%G  
@0)bY*njj  
Parcel.writeInt是往Parcel中写入一个32位的整型,其实现如下:
/sYD+*a  
 F-ijGGL#  
Qp< 6qM35  
:|fzGf  
icnp^2P  
\ (X~Z  
先获取被写入的val的tag,然后再通过调用updateTaint把污点数据同步到当前Parcel对象。
43(+3$VM7  
$MP'j9-S?  
Parcel.readInt是执行与Parcel.writeInt相反的动作,从Parcel中读出一个32倍整形,其实现如下所示: k'S/nF A  
,Z52d ggD  
hZyz5aZ)K  
>Ks|yNJ  
eR;cl$  
tt`b+NOH>  
依据当前的pos和len,getTaint返回对应的tag,然后再通过Tain.addTainInt同步到最终结果val2。
T$RZRZo  
gE:qMs;  
+='.uc_  
#5'9T:8  
总结: 7 bpV=  
a|66[  
TaintDroid的IPC污点跟踪粒度是变量粒度的,因此大大提高了污点传播的精准度。下一步继续分析下File & Memory & Socket 级污点传播。 P/0n) Q  
OHH wcJ7N  
/tV)8pEj  
作者:简行、走位@阿里聚安全,更多Android安全类技术文章,请访问阿里聚安全博客
K72U0}$B  
xy[R9_V  
(uRAK  
D[9eu>"'9M  
[ 此帖被移动安全在2016-08-10 11:07重新编辑 ]
发表主题 回复主题
« 返回列表上一主题下一主题

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