TaintDroid剖析之IPC级污点传播

简介:

TaintDroid剖析之IPC级污点传播

 

 

 

前言

在前三篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪、Native方法级跟踪。本篇文章我们来分析下IPC级污点传播


TaintDroid深入剖析系列目录:

TaintDroid深入剖析之启动篇

TaintDroid剖析之DVM变量级污点跟踪(下篇)

TaintDroid剖析之Native方法级污点跟踪分析


具体实现

这里我以情景为上下进行跟进,每个情景会涉及多个源文件,它们之间的逻辑是互相完整和独立的。

Java层Taint的传播是通过类Taint(libcore/dalvik/src/main/java/dalvik/Taint.java)实现的。


情景——IPC传递

代码:

frameworks/base/cmds/servicemanager/binder.c
frameworks/native/libs/binder/Parcel.h
frameworks/native/libs/binder/Parcel.cpp
framework/base/core/java/android/os/Parcel.java
framework/base/core/jni/android_os_Parcel.cpp


分析:
为了实现IPC的污点跟踪,taintdroid给每个Parcel单独维护了一个taint_info的结构体,其定义在Parcel.h,如下所示:

struct taint_in_parcel
{
uint32_t pos; //污点始址
uint32_t len; //污点长度
uint32_t taint; //污点标记
};
struct taint_info
{
uint32_t mTaintSize; // 当前污点项长度
uint32_t mCurPos; // 当前项索引
uint32_t mCurAllocatedSize; // 当前可用项长度
struct taint_in_parcel * parcelArray; //污点项数组
void* mOwnerCookie; //作用未知
};


然后提供了两个方法对这个结构进行操作,分别是Parcel::updateTaint和Parcel::getTaint。
updateTaint的功能是动态添加污点到当前Parcel,其实现如下:



而getTaint的功能是根据指定的范围获取对应的tag值(因为Parcel的数据是线性存储的),其实现如下所示:


为了可以方便上层接口调用,在android_os_Parcel.cpp通过JNI对上层提供了接口,



再来看一下Parcel.java层污点传递的具体实现,我从四个函数分析,其他的逻辑是类似的。


Parcel.marshall是把Parcel序列化为byte[],其实现如下



通过getTaint获取当前Parcel的污点集合tag,再通过Taint.addTainByteArray把tag传递给序列化后的data对象。


Parcel.unmarshall的作用跟Parcel.marshall是相反的,通过byte[]还原Parcel对象,其实现如下:



先通过Taint.getTainByArray拿到data的tag,然后再同步到还原后的Parcel对象。


Parcel.writeInt是往Parcel中写入一个32位的整型,其实现如下:



先获取被写入的val的tag,然后再通过调用updateTaint把污点数据同步到当前Parcel对象。


Parcel.readInt是执行与Parcel.writeInt相反的动作,从Parcel中读出一个32倍整形,其实现如下所示:



依据当前的pos和len,getTaint返回对应的tag,然后再通过Tain.addTainInt同步到最终结果val2。



总结:

TaintDroid的IPC污点跟踪粒度是变量粒度的,因此大大提高了污点传播的精准度。下一步继续分析下File & Memory & Socket 级污点传播

 

 

本文来自合作伙伴“阿里聚安全”,发表于2016年08月10日 09:29.           

相关文章
|
消息中间件 监控 算法
深入理解Linux进程管理与优化:原理、调度和资源控制详解
深入理解Linux进程管理与优化:原理、调度和资源控制详解
289 0
|
4月前
|
存储 Kubernetes Docker
Kubernetes节点资源耗尽状态的处理
Kubernetes节点资源耗尽状态的处理
|
4月前
|
Kubernetes 调度 Perl
在K8S中,节点故障驱逐pod过程时间怎么定义?
在K8S中,节点故障驱逐pod过程时间怎么定义?
|
2月前
|
Kubernetes 网络协议 网络安全
Pod之间的通信问题
【10月更文挑战第6天】
84 4
|
4月前
|
存储 Kubernetes 调度
在K8S中,影响Pod调度策略的有哪些?
在K8S中,影响Pod调度策略的有哪些?
|
4月前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
4月前
|
Kubernetes Linux 调度
在k8S中,Pod如何实现对节点的资源控制?
在k8S中,Pod如何实现对节点的资源控制?
|
4月前
|
存储 Kubernetes 调度
在K8S中,影响pod调度的因素有哪些?
在K8S中,影响pod调度的因素有哪些?
|
4月前
|
运维 Kubernetes Perl
在K8S中,节点故障pod驱逐pod过程,时间怎么定义的?
在K8S中,节点故障pod驱逐pod过程,时间怎么定义的?
|
7月前
|
Linux 消息中间件 存储
Linux进程间通信模式
【1月更文挑战第13天】