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 级污点传播

作者:简行、走位@阿里聚安全,更多Android安全类技术文章,请访问阿里聚安全博客

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

  1. TaintDroid剖析之File & Memiry & Socket级污点传播

    TaintDroid剖析之File & Memiry & Socket级污点传播 作者:简行.走位@阿里聚安全 1.涉及到的代码文件 TaintDroid在File, Memory以及 ...

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

    1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪—— ...

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

    TaintDroid剖析之DVM变量级污点跟踪(下篇)作者:简行.走位@阿里聚安全 ​ 1 回顾 在上一章节中我们详细分析了TaintDroid对DVM方法参数和方法变量的变量级污点跟踪机制,现在我们 ...

  4. TaintDroid深入剖析之启动篇

    ​1 背景知识 1.1   Android平台软件动态分析现状 众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外.而随着软件加固.混淆技术的不 ...

  5. TaintDroid:智能手机监控实时隐私信息流跟踪系统(一)

    1.1     摘要 现今,智能手机操作系统不能有效的提供给用户足够的控制权并且很清楚的了解到第三方的应用程序是如何使用其的隐私数据.我们使用了TaintDroid来阐明这个缺点,其是一个高效的,全系 ...

  6. TaintDroid:智能手机监控实时隐私信息流跟踪系统(三)

    4.3   原生代码标记传播 Native 代码是不受TaintDroid监控的.理想情况下,我们获得了相同的传播语义当使用相同的解释副本时.因此,为了精确的在Java层进行污点监控,我们定义了两个必 ...

  7. TaintDroid简介

    1.Information-Flow tracking,Realtime Privacy Monitoring.信息流动追踪,实时动态监控. 2.TaintDroid是一个全系统动态污点跟踪和分析系统 ...

  8. 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案

    三.JavaScript部分 1.谈谈你对Ajax的理解?(概念.特点.作用) AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是 ...

  9. 什么是JS事件冒泡?

    什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理 程序或者事件返回true,那么 ...

随机推荐

  1. .net学习笔记---tcp/udp/http/socket

    什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信. 使用 ...

  2. SQL谜题(加减符号替代)

    问题:将以下字符串”.1.2.3.4.5.6.7.8.9 = 1“中的符号点(.)更改为符号加(+)或符号(-),有多少种方法?请用SQL解决此问题 计算过程: CREATE TABLE #(VAL ...

  3. MySQL深度巡检

    1. IO层面检查   (1)IO检查   查看%util是否接近100%定位是哪个磁盘IO压力大 #iostat -x 1 10 (2)iotop定位负载来源进程 查看哪个PID占用IO最高 #io ...

  4. JavaScript高级程序设计-(3) 变量、作用域和内存问题

    传递参数 ECMAScript所有函数参数都是按值传递的,即使对象在函数内部修改了参数的值,原始的引用任然不变,局部对象在函数执行完毕后被销毁

  5. BFS_最短路径

    已知若干个城市的地图,求从一个城市到另一个城市的路径,要求路径中经过的城市最少. #include<iostream> #include<cstring> using name ...

  6. 《DSP using MATLAB》示例Example5.20

  7. hypermesh 之 interface操作

  8. LeetCode 344. Reverse String

    Problem: Write a function that takes a string as input and returns the string reversed. Example: Giv ...

  9. javascript常识

    substring和substr的区别 substring() 方法用于提取字符串中介于两个指定下标之间的字符. stringObject.substring(start,stop)例子: <s ...

  10. linux 下使用配置文件

    最近鼓捣双机热备,写了些shell脚本 适用配置文件 以 ifbeat 为例,linux的标准的配置文件中等号两遍不能存在括号, 空格 或特殊符号可以用转衣服 ' \' beat=true prima ...