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.           

时间: 2025-01-19 18:05:50

TaintDroid剖析之IPC级污点传播的相关文章

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/

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

TaintDroid剖析之Native方法级污点跟踪分析 简行.走位@阿里聚安全 1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪--Native方法级跟踪. 回顾前文,我们知道Native方法执行在Native栈帧中,且Native栈帧由dvmPushJNIFrame函数分配栈空间,再由dvmCallMethodV/A或者dvmInvokeMeth

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

TaintDroid剖析之DVM变量级污点跟踪(下篇) 简行.走位@阿里聚安全 1 回顾 在上一章节中我们详细分析了TaintDroid对DVM方法参数和方法变量的变量级污点跟踪机制,现在我们将继续分析TaintDroid对类的静态域.实例域以及数组的污点跟踪. 2 了解DVM中类的数据结构 由于DVM师从JVM,所以DVM中所有类的祖先也是Object类,该类定义在dalvik/vm/oo/Object.h中.其实不仅仅是Object类,DVM所有的基本类都定义在Object.h文件中. 众所

TaintDroid深入剖析之启动篇

TaintDroid深入剖析之启动篇 简行.走位@阿里聚安全 1 背景知识 1.1   Android平台软件动态分析现状 众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外.而随着软件加固.混淆技术的不断改进,静态分析越来越难以满足安全人员的分析要求,因此天生对软件加固.混淆免疫的动态分析技术应运而生.虽然动态分析技术本身有很多局限性,诸如:代码覆盖率低,执行效率低下等等,但是瑕不掩瑜,个人认为熟悉各种动态分析技术的核心原理也应当是安全从

Js冒泡事件详解及阻止示例

 如果某元素定义了事件A,如click事件,如果触发了事件之后,没有阻止冒泡事件,那么事件将向父级元素传播 Js冒泡机制是指如果某元素定义了事件A,如click事件,如果触发了事件之后,没有阻止冒泡事件,那么事件将向父级元素传播,触发父类的click函数.  如下例所示:   代码如下: <html>  <script type="text/javascript" src="jquery-1.7.1.js"></script> 

Angularjs中的事件广播 —全面解析$broadcast,$emit,$on_AngularJS

Angularjs中不同作用域之间可以通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信 介绍: $broadcast的作用是将事件从父级作用域传播至子级作用域,包括自己.格式如下:$broadcast(eventName,args) $emit的作用是将事件从子级作用域传播至父级作用域,包括自己,直至根作用域.格式如下:$emit(eventName,args) $on用于在作用域中监控从子级或父级作用域中传播的事件以及相应的数据.格式如下:$on(event,dat

《微信小程序:开发入门及案例详解》—— 2.4 框架页面文件

2.4 框架页面文件 小程序中一个框架页面包含4个文件,同一框架页面的这4个文件必须具有相同的路径与文件名,进入小程序时或页面跳转时,小程序会根据app.json配置的路径找到对应的资源进行渲染. ◇ .js文件:页面逻辑文件,必要项. ◇ .wxml文件:页面结构文件,必要项. ◇ .wxss文件:页面样式文件. ◇ .json文件:页面配置文件. 与框架主体文件相比框架页面文件多了一种页面结构文件,其余3个文件和框架主体文件的功能类同,下面我们一一讲解每个文件作用. 2.4.1 页面配置文件

使用javascript实现的一些功能

原文:使用javascript实现的一些功能                  今天学习了javascript中的事件,已经接近尾声,可以说明天跨入jquery的学习啦,学习了一周的javascript,感觉还没有掌握其中学习的微妙之处,javascript使用起来是比较灵活的,而且很多浏览器的兼容性还是不一样的,嘿嘿,或许这就是原因的所在吧,在事件的处理上面还是很容易理解的,前面学习了那么多的语法知识以及对DOM的操作,想必在事件的学习上还是很容易接受的,就来总结一下吧.          一

《AngularJS实战》——3.4 作用域的层级和事件

3.4 作用域的层级和事件 与页面中DOM模型相似,作用域在绑定页面元素后,便依据元素的层次关系形成了自身的层级关系,而在这些层级关系中,它们还可以通过事件的传播进行数据的通信,只是这种通过事件的数据通信应用的场景非常有限,仅限于父和子级之间的作用域,接下来我们逐一进行分析. 3.4.1 作用域的层级 与DOM树状结构类似,作用域也拥有自己的层级,并且与DOM的树状结构相辅相成,它的顶级作用域只有一个,而下面的子级作用域可以创建多个,子级作用域可以继承父级作用域中的全部属性和方法,但同级别子级作