国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

TaintDroid剖析之IPC級(jí)污點(diǎn)傳播

baishancloud / 3422人閱讀

摘要:前言在前三篇文章中我們?cè)敿?xì)分析了對(duì)棧幀的修改,以及它是如何在修改之后的棧幀中實(shí)現(xiàn)變量級(jí)污點(diǎn)跟蹤方法級(jí)跟蹤。總結(jié)的污點(diǎn)跟蹤粒度是變量粒度的,因此大大提高了污點(diǎn)傳播的精準(zhǔn)度。下一步繼續(xù)分析下級(jí)污點(diǎn)傳播。

前言

在前三篇文章中我們?cè)敿?xì)分析了TaintDroid對(duì)DVM棧幀的修改,以及它是如何在修改之后的棧幀中實(shí)現(xiàn)DVM變量級(jí)污點(diǎn)跟蹤、Native方法級(jí)跟蹤。本篇文章我們來分析下IPC級(jí)污點(diǎn)傳播。

TaintDroid深入剖析系列目錄:

TaintDroid深入剖析之啟動(dòng)篇

TaintDroid剖析之DVM變量級(jí)污點(diǎn)跟蹤(下篇)

TaintDroid剖析之Native方法級(jí)污點(diǎn)跟蹤分析

具體實(shí)現(xiàn)

這里我以情景為上下進(jìn)行跟進(jìn),每個(gè)情景會(huì)涉及多個(gè)源文件,它們之間的邏輯是互相完整和獨(dú)立的。

Java層Taint的傳播是通過類Taint(libcore/dalvik/src/main/java/dalvik/Taint.java)實(shí)現(xiàn)的。

情景——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

分析:

為了實(shí)現(xiàn)IPC的污點(diǎn)跟蹤,taintdroid給每個(gè)Parcel多帶帶維護(hù)了一個(gè)taint_info的結(jié)構(gòu)體,其定義在Parcel.h,如下所示:

struct taint_in_parcel
{
uint32_t pos; //污點(diǎn)始址
uint32_t len; //污點(diǎn)長(zhǎng)度
uint32_t taint; //污點(diǎn)標(biāo)記
};
struct taint_info
{
uint32_t mTaintSize; // 當(dāng)前污點(diǎn)項(xiàng)長(zhǎng)度
uint32_t mCurPos; // 當(dāng)前項(xiàng)索引
uint32_t mCurAllocatedSize; // 當(dāng)前可用項(xiàng)長(zhǎng)度
struct taint_in_parcel * parcelArray; //污點(diǎn)項(xiàng)數(shù)組
void* mOwnerCookie; //作用未知
};

然后提供了兩個(gè)方法對(duì)這個(gè)結(jié)構(gòu)進(jìn)行操作,分別是Parcel::updateTaint和Parcel::getTaint。

updateTaint的功能是動(dòng)態(tài)添加污點(diǎn)到當(dāng)前Parcel,其實(shí)現(xiàn)如下:

而getTaint的功能是根據(jù)指定的范圍獲取對(duì)應(yīng)的tag值(因?yàn)镻arcel的數(shù)據(jù)是線性存儲(chǔ)的),其實(shí)現(xiàn)如下所示:

為了可以方便上層接口調(diào)用,在android_os_Parcel.cpp通過JNI對(duì)上層提供了接口。

再來看一下Parcel.java層污點(diǎn)傳遞的具體實(shí)現(xiàn),我從四個(gè)函數(shù)分析,其他的邏輯是類似的。

Parcel.marshall是把Parcel序列化為byte[],其實(shí)現(xiàn)如下

通過getTaint獲取當(dāng)前Parcel的污點(diǎn)集合tag,再通過Taint.addTainByteArray把tag傳遞給序列化后的data對(duì)象。

Parcel.unmarshall的作用跟Parcel.marshall是相反的,通過byte[]還原Parcel對(duì)象,其實(shí)現(xiàn)如下:

先通過Taint.getTainByArray拿到data的tag,然后再同步到還原后的Parcel對(duì)象。

Parcel.writeInt是往Parcel中寫入一個(gè)32位的整型,其實(shí)現(xiàn)如下:

先獲取被寫入的val的tag,然后再通過調(diào)用updateTaint把污點(diǎn)數(shù)據(jù)同步到當(dāng)前Parcel對(duì)象。

Parcel.readInt是執(zhí)行與Parcel.writeInt相反的動(dòng)作,從Parcel中讀出一個(gè)32倍整形,其實(shí)現(xiàn)如下所示:

依據(jù)當(dāng)前的pos和len,getTaint返回對(duì)應(yīng)的tag,然后再通過Tain.addTainInt同步到最終結(jié)果val2。

總結(jié):

TaintDroid的IPC污點(diǎn)跟蹤粒度是變量粒度的,因此大大提高了污點(diǎn)傳播的精準(zhǔn)度。下一步繼續(xù)分析下File & Memory & Socket 級(jí)污點(diǎn)傳播。

作者:簡(jiǎn)行、走位@阿里聚安全,更多Android安全類技術(shù)文章,請(qǐng)?jiān)L問阿里聚安全博客

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65038.html

相關(guān)文章

  • TaintDroid 剖析 DVM 變量級(jí)污點(diǎn)跟蹤(下篇)

    摘要:回顧在上一章節(jié)中我們?cè)敿?xì)分析了對(duì)方法參數(shù)和方法變量的變量級(jí)污點(diǎn)跟蹤機(jī)制,現(xiàn)在我們將繼續(xù)分析對(duì)類的靜態(tài)域?qū)嵗蛞约皵?shù)組的污點(diǎn)跟蹤。充分理解這一點(diǎn),對(duì)我們后續(xù)分析復(fù)雜污點(diǎn)傳播邏輯很有幫助。對(duì)數(shù)組對(duì)象的修改在成員之后添加成員。 1 回顧 在上一章節(jié)中我們?cè)敿?xì)分析了TaintDroid對(duì)DVM方法參數(shù)和方法變量的變量級(jí)污點(diǎn)跟蹤機(jī)制,現(xiàn)在我們將繼續(xù)分析TaintDroid對(duì)類的靜態(tài)域、實(shí)例域以及...

    JeOam 評(píng)論0 收藏0
  • 淺入淺出FlowDroid(一): 簡(jiǎn)介&基本使用

    摘要:后文將圍繞做一些介紹。盡管如此,的使用對(duì)新手而言仍然充滿了困難。本系列文章基本為個(gè)人見解,難免有錯(cuò)誤與誤解,如有客觀錯(cuò)誤歡迎提出。 前言 說到Android的污點(diǎn)分析框架,網(wǎng)上的搜索結(jié)果大多指向靜態(tài)的FlowDroid與動(dòng)態(tài)的TaintDroid。盡管由于加固、混淆等技術(shù)使得針對(duì)Android的靜態(tài)分析越來越困難,但靜態(tài)分析的無先驗(yàn)分析能力無法被動(dòng)態(tài)分析取代,使得靜態(tài)分析仍有發(fā)揮空間。...

    wqj97 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<