亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種面向Trace與漏洞驗(yàn)證的污點(diǎn)分析方法

        2020-05-18 11:07:30楊晨霞
        計(jì)算機(jī)工程 2020年5期
        關(guān)鍵詞:分析信息方法

        秦 彪,郭 帆,楊晨霞

        (1.江西師范大學(xué) 計(jì)算機(jī)信息工程學(xué)院,南昌 330022; 2.豫章師范學(xué)院 計(jì)算機(jī)系,南昌 330105)

        0 概述

        隨著當(dāng)前智能手機(jī)的普及,手機(jī)應(yīng)用的安全性備受關(guān)注。隱私泄露是智能手機(jī)最嚴(yán)重的安全問題之一,其指APP中存在一條從讀取隱私數(shù)據(jù)的Source方法調(diào)用語句到輸出隱私數(shù)據(jù)的Sink方法調(diào)用的執(zhí)行路徑,并且未經(jīng)用戶許可[1]。利用Source方法可以讀取通訊錄、收發(fā)短信等,利用Sink方法可以寫文件、發(fā)短信或發(fā)送網(wǎng)絡(luò)報(bào)文等。研究人員提出了許多方案來檢測(cè)APP中潛在的隱私泄露漏洞,其中污點(diǎn)分析方法是主流檢測(cè)方法之一。污點(diǎn)分析通常從Source開始跟蹤外部引入的數(shù)據(jù)(污點(diǎn)),檢查其是否未經(jīng)驗(yàn)證就直接傳播到Sink位置,如果是則可能存在漏洞。

        污點(diǎn)分析可分為靜態(tài)分析和動(dòng)態(tài)分析。靜態(tài)分析不運(yùn)行代碼,直接掃描代碼或者轉(zhuǎn)換后的中間代碼,提取其中的詞法、語法和語義,結(jié)合控制流分析和數(shù)據(jù)流分析,判定污點(diǎn)是否能從Source傳遞到Sink[2]。動(dòng)態(tài)分析指插樁并監(jiān)控APP運(yùn)行時(shí)行為,動(dòng)態(tài)獲取程序的控制流和數(shù)據(jù)流,實(shí)時(shí)跟蹤污點(diǎn)傳播,在Sink位置檢測(cè)是否有污點(diǎn)信息輸出[2]。相比動(dòng)態(tài)分析,靜態(tài)分析可靠性更高,其可以在程序發(fā)布之前對(duì)APP進(jìn)行檢查,但是存在分析結(jié)果虛警率過高問題。靜態(tài)分析需要耗費(fèi)大量資源并且性能較差,為在實(shí)現(xiàn)精度和效率平衡的同時(shí)保證可靠性,往往會(huì)對(duì)所有分支的數(shù)據(jù)流信息進(jìn)行保守合并,從而產(chǎn)生大量虛警。

        本文提出一種新的污點(diǎn)分析方法,在插樁APK并記錄應(yīng)用在運(yùn)行時(shí)的執(zhí)行路徑信息(Trace)后,對(duì)Trace進(jìn)行上下文敏感和域敏感的污點(diǎn)分析,同時(shí)定義指令級(jí)污點(diǎn)傳播語義和一致性約束,進(jìn)而驗(yàn)證Trace是否存在隱私泄露。

        1 相關(guān)工作

        污點(diǎn)分析本質(zhì)上屬于數(shù)據(jù)流分析技術(shù),其在信息安全領(lǐng)域得到廣泛應(yīng)用,主要用于漏洞分析和惡意代碼檢測(cè)等,研究人員設(shè)計(jì)了許多污點(diǎn)分析工具。Taj[3]是一個(gè)高效的面向Web應(yīng)用的污點(diǎn)分析工具,它分為兩個(gè)階段:一是執(zhí)行指針分析,構(gòu)造應(yīng)用的方法調(diào)用圖;二是將方法調(diào)用圖作為輸入,設(shè)計(jì)一種混合的輕量級(jí)切片算法跟蹤污點(diǎn)信息流。文獻(xiàn)[4]采用與Taj相似的方法,設(shè)計(jì)了一種基于精確指針分析的靜態(tài)分析方法,通過用戶提供的缺陷規(guī)范自動(dòng)生成對(duì)應(yīng)的靜態(tài)分析器,以達(dá)到有針對(duì)性靜態(tài)檢測(cè)程序缺陷的目的。文獻(xiàn)[5]基于類型的污點(diǎn)分析,實(shí)現(xiàn)了一個(gè)上下文敏感的面向安全信息流的類型系統(tǒng)SFlow。FlowDroid[6]是目前較好的一種針對(duì)APP上下文敏感、流敏感、域敏感和對(duì)象敏感的精確污點(diǎn)分析工具,其對(duì)Android的多方法入口以及基于事件和回調(diào)機(jī)制的控制流進(jìn)行了準(zhǔn)確刻畫,但是沒有考慮組件間通信(ICC)。StubDroid[7]以污點(diǎn)數(shù)據(jù)流摘要的形式對(duì)Android框架建模,它基于FlowDroid,應(yīng)用域敏感、對(duì)象敏感及上下文敏感的指針分析,充分考慮了回調(diào)機(jī)制,但是沒有分析ICC通信。文獻(xiàn)[8]聚焦于FlowDroid沒有考慮的包含用戶交互的回調(diào)方法,利用圖可達(dá)性方法盡量識(shí)別可能驅(qū)動(dòng)用戶交互方法的執(zhí)行路徑,是Flowdroid的有效補(bǔ)充。Amandroid[9]采用組件級(jí)的分析,使用Flowdroid對(duì)APP生命周期建模的的方式對(duì)單個(gè)組件進(jìn)行建模,并應(yīng)用字符串分析技術(shù)來識(shí)別ICC通信,主要用于識(shí)別信息泄漏。

        污點(diǎn)分析分為靜態(tài)分析和動(dòng)態(tài)分析。根據(jù)Rice定理[10-11],靜態(tài)分析針對(duì)程序的任何非平凡屬性(例如程序是否存在數(shù)組越界),無法做到既完備又可靠。多數(shù)工具生成的控制流圖存在許多不確定性,如弱類型檢查、未定義的行為以及別名指針等。因此,靜態(tài)分析往往采用近似方法,導(dǎo)致分析結(jié)果存在虛警和漏報(bào)[12]。為了消除靜態(tài)分析結(jié)果的虛警,研究人員提出許多解決方法并設(shè)計(jì)和實(shí)現(xiàn)了多個(gè)靜態(tài)漏洞檢測(cè)工具。文獻(xiàn)[12]認(rèn)為惡意應(yīng)用的多個(gè)Source之間的相關(guān)性與正常應(yīng)用存在差異,提出一種分析結(jié)果中的多個(gè)Source是否綁定觸發(fā)Sink的污點(diǎn)分析技術(shù)MultiFlow,利用這種差異可以降低虛警率。但MultiFlow在處理單源污點(diǎn)的數(shù)據(jù)流傳播問題時(shí)常出現(xiàn)誤判,并且沒有記錄調(diào)用回調(diào)方法時(shí)傳遞的數(shù)據(jù)流事實(shí)。文獻(xiàn)[13]以靜態(tài)分析的結(jié)果作為輸入,逆向搜索可能發(fā)生缺陷的約束條件,使用約束求解判斷缺陷的可滿足性,進(jìn)而驗(yàn)證結(jié)果是否虛警。文獻(xiàn)[14]對(duì)目標(biāo)程序進(jìn)行控制流分析,判斷警報(bào)的可達(dá)性并得到制導(dǎo)信息,再利用混合執(zhí)行測(cè)試的方法,跟蹤程序運(yùn)行時(shí)內(nèi)存狀態(tài)并判斷內(nèi)存是否泄漏,驗(yàn)證漏洞是否虛警。文獻(xiàn)[12-13]的方法都需要通過約束求解判定路徑是否可行,然而在實(shí)際應(yīng)用中,路徑條件復(fù)雜多變,約束求解存在約束表達(dá)困難和無法獲得正確解的問題,導(dǎo)致虛警驗(yàn)證失敗。

        動(dòng)態(tài)分析是指在程序執(zhí)行時(shí)監(jiān)聽程序狀態(tài),或者使用插樁在程序執(zhí)行時(shí)獲得程序的數(shù)據(jù)流和控制流,在Source處給數(shù)據(jù)打上污點(diǎn)標(biāo)簽,然后實(shí)時(shí)跟蹤污點(diǎn)數(shù)據(jù),在Sink處檢測(cè)是否污點(diǎn)數(shù)據(jù)被輸出導(dǎo)致信息泄漏。TaintDroid[15]修改Dalvik虛擬機(jī),將經(jīng)典污點(diǎn)傳播遷移至Android底層,采用指令插樁的方式實(shí)時(shí)監(jiān)控污點(diǎn)數(shù)據(jù)傳播過程,但運(yùn)行時(shí)開銷太大,實(shí)用性不高。CopperDroid[16]修改定制的Android模擬器,記錄APK運(yùn)行時(shí)的系統(tǒng)調(diào)用序列,分析污點(diǎn)數(shù)據(jù)傳播以發(fā)現(xiàn)惡意行為,可以抵抗應(yīng)用層的代碼混淆,不需要修改Android系統(tǒng),部署方便且適應(yīng)性強(qiáng)。VetDroid[17]在TaintDroid基礎(chǔ)上實(shí)現(xiàn)基于權(quán)限的動(dòng)態(tài)污點(diǎn)分析,尋找敏感資源使用的污點(diǎn)傳播,可診斷是否存在違背預(yù)定義策略的行為。Aurasium[18]對(duì)Android系統(tǒng)與Linux內(nèi)核之間的通信進(jìn)行插樁,監(jiān)控APP與底層系統(tǒng)之間的交互,重構(gòu)APP的組件間或進(jìn)程間通信從而發(fā)現(xiàn)違背預(yù)定義安全策略的執(zhí)行路徑。但是Aurasium存在性能瓶頸、Android版本更新較快等問題,很難實(shí)際部署。AppIntent[19]從可疑路徑中抽取事件處理方法集合,形成事件處理方法約束圖,并根據(jù)約束條件產(chǎn)生用戶輸入,驗(yàn)證該路徑是否是用戶許可的路徑,排除虛警。此類方法的通用問題是可靠性不夠,動(dòng)態(tài)驗(yàn)證時(shí)無法覆蓋完整的路徑集合,導(dǎo)致許多漏報(bào)和虛警。

        動(dòng)態(tài)分析普遍存在運(yùn)行效率和檢測(cè)代碼覆蓋率低的問題。本文提出的面向插樁Android應(yīng)用后產(chǎn)生的執(zhí)行Trace的污點(diǎn)分析方法,在指令級(jí)定義污點(diǎn)傳播必須滿足的一致性約束,保證污點(diǎn)分析的語義正確性,驗(yàn)證Trace是否包含真實(shí)漏洞。

        2 整體設(shè)計(jì)

        本文方法的整體流程如圖1所示,具體如下:

        1)對(duì)APK靜態(tài)插樁,生成新的.dex文件,使插樁后的Android應(yīng)用在執(zhí)行時(shí)能夠記錄程序的執(zhí)行路徑信息(Trace)。

        2)將新生成的.dex文件打包成插樁后的APK,并安裝到Android模擬器或真機(jī)中,然后手工執(zhí)行插樁后的應(yīng)用,執(zhí)行完畢后輸出Trace。

        3)對(duì)Trace進(jìn)行別名分析和污點(diǎn)分析,分析程序執(zhí)行過程中的運(yùn)行時(shí)信息,進(jìn)而根據(jù)這些信息驗(yàn)證隱私泄露是否真實(shí)存在。

        圖1 本文方法整體流程

        分析模塊的內(nèi)部層次結(jié)構(gòu)如圖2所示,其中方法調(diào)用現(xiàn)場(chǎng)信息收集子模塊處在最底層,作為整個(gè)分析模塊的基礎(chǔ),在別名分析時(shí)需要查找方法調(diào)用現(xiàn)場(chǎng)信息以確定實(shí)參到形參的別名數(shù)據(jù)流走向,進(jìn)而別名分析又為污點(diǎn)分析提供支撐。

        圖2 分析模塊的層次結(jié)構(gòu)

        手工執(zhí)行插樁的Android應(yīng)用獲得的Trace本質(zhì)上是一條順序的代碼序列,污點(diǎn)分析的目標(biāo)是根據(jù)Trace中的信息分析每條指令位置的全局污點(diǎn)信息。Java變量都以引用形式標(biāo)識(shí)運(yùn)行時(shí)具體的內(nèi)存位置,因此,不同變量可能指向同一塊內(nèi)存空間,即它們互為別名,污點(diǎn)分析需要精確的別名信息。Android應(yīng)用存在大量的方法調(diào)用,特別是回調(diào)方法和注冊(cè)監(jiān)聽組件事件的處理方法,在進(jìn)行別名分析之前需要收集Trace中的方法調(diào)用現(xiàn)場(chǎng)信息,包括發(fā)生方法調(diào)用的位置信息和實(shí)參與形參之間的映射關(guān)系。

        根據(jù)獲得的別名分析結(jié)果,將污點(diǎn)狀態(tài)信息標(biāo)記到別名變量指向的內(nèi)存塊上,以此來跟蹤污點(diǎn)傳播過程。污點(diǎn)分析中傳遞的數(shù)據(jù)流事實(shí)是被污染變量的污染狀態(tài)集合,稱為污點(diǎn)狀態(tài)集合。污點(diǎn)狀態(tài)集合中的每個(gè)元素以二元組的形式定義:(var,taint_level),其中,var表示變量的訪問路徑(Access Path),taint_level表示被污染變量的受污染程度,方法規(guī)定3種污染程度,即部分污染(pa)、完全污染(ta)和可信(trust)。影響污點(diǎn)數(shù)據(jù)流傳播的執(zhí)行語句包括方法調(diào)用語句和賦值語句。

        方法調(diào)用語句分為調(diào)用庫方法和調(diào)用自定義方法。分析庫方法調(diào)用時(shí),以污點(diǎn)傳播摘要的方式對(duì)庫方法執(zhí)行產(chǎn)生的污點(diǎn)信息流建模,根據(jù)具體的摘要調(diào)整并記錄方法執(zhí)行后各相關(guān)內(nèi)存塊的污點(diǎn)狀態(tài)信息。分析自定義方法調(diào)用時(shí)需要進(jìn)一步遞歸分析方法體內(nèi)部每條語句的污點(diǎn)傳播語義來實(shí)現(xiàn)跨方法污點(diǎn)傳播過程。

        在分析賦值語句時(shí),首先按賦值語句右值的不同類型定義污點(diǎn)傳播語義規(guī)則,依照規(guī)則記錄污點(diǎn)傳播過程,然后再按左值的不同類型,調(diào)整相關(guān)變量的污點(diǎn)狀態(tài)信息。對(duì)內(nèi)存塊的污點(diǎn)狀態(tài)信息的修改或調(diào)整都必須滿足污點(diǎn)傳播的一致性約束,避免錯(cuò)誤記錄污點(diǎn)傳播信息。

        2.1 污點(diǎn)傳播一致性約束

        令X是輸入的數(shù)據(jù)流事實(shí),Y是輸出的數(shù)據(jù)流事實(shí),則在污點(diǎn)傳播過程中,污點(diǎn)狀態(tài)變化應(yīng)滿足如下污點(diǎn)傳播一致性約束:

        1.(a,ta)∈X→(a,pa)?X;(a,pa)∈X→(a,ta)?X;

        2.(a,ta)∈X→(a.f,ta)∈X∨(a[i],ta)∈X.(?i,f);

        3.(a,pa)∈X→(a.f,ta)∈X∨(a.f,pa)∈X∨(a.[i],ta)∈X∨((a.f,ta)?X∧(a.f,pa)?X)∨(a[i],ta)?X.(?i,f);

        4.(a,ta)?X∧(a,pa)?X→(a.f,ta)?X∧(a.f,pa)?X∧(a[i],ta)?X∧(a[i],pa)?X.(?i,f);

        5.(a,pa)∈X∨(a,ta)∈X∨(b,pa)∈X∨(b,ta)∈X→(b[a],ta)∈X∨(a[b],ta)∈X;

        6.isMustAlias(a,b)∧(a,ta)∈X→(b,ta)∈X; (?b)

        isMustAlias(a,b)∧(a,pa)∈X→(b,pa)∈X; (?b)

        isMustAlias(a,b)∧(a,ta)?X∧(a,pa)?X→(b,pa)?X∧(b,ta)?X;(?b)

        其中:isMustAlias(a,b)表示a與b一定互為別名;約束1表示在傳遞的數(shù)據(jù)流事實(shí)中,變量a的被污染程度是完全污染(ta)、部分污染(pa)或是污點(diǎn)狀態(tài)集合中不記錄變量a的污點(diǎn)狀態(tài)信息,即a可信(trust),a的污點(diǎn)狀態(tài)只能是這3種情況之一;約束2表示如果變量a是ta,那么a的所有子域?qū)ο笠脖仨毷莟a;約束3表示如果變量a是pa,那么a的子域?qū)ο罂赡苁莟a、pa或可信;約束4表示如果變量a可信,那么a的所有子域?qū)ο笠脖仨毧尚?即污點(diǎn)狀態(tài)集合中不含有a和a的任何子域?qū)ο?約束5表示如果數(shù)組元素a[i]中,有一個(gè)引用變量不可信,即a或i不可信,那么實(shí)例變量a[i]不可信,并且a[i]必須是ta;約束6表示互為別名的變量的污點(diǎn)狀態(tài)信息必須相同。

        2.2 污點(diǎn)傳播語義

        本節(jié)形式化定義和描述不同指令的污點(diǎn)傳播語義,ConstGen和ConstKill分別表示不依賴之前的數(shù)據(jù)流結(jié)果,每次執(zhí)行指令都會(huì)產(chǎn)生或刪除的數(shù)據(jù)流事實(shí),而DepGen和DepKill分別表示需要依賴之前的數(shù)據(jù)流結(jié)果,執(zhí)行指令才會(huì)產(chǎn)生或刪除的數(shù)據(jù)流事實(shí),MustAlias(a)返回a的所有別名集合。

        2.2.1 賦值語句

        圖3中給出2個(gè)示例代碼片段,用于輔助解釋各條規(guī)則的含義。

        圖3 示例代碼片段

        賦值語句描述如下:

        1)形如a=12、a=b、a=b.f、a=b[i]、a=new等。

        (1)a=Constant(常量,基本類型Primary)

        MustAlias(a)=ConstGen=DepGen=DepKill=Ф

        ConstKill={(a,pa),(a,ta),(a.f,pa),(a.f,ta),(a[i],pa),(a[i],ta)}(?i,f)

        圖3(a)的第1條語句導(dǎo)致變量s被污染,第2條語句是賦值語句,將常量“Hello world!”賦值給s,由于常量是可信的,s由原來指向的污點(diǎn)內(nèi)存塊轉(zhuǎn)為指向存放常量“Hello world!”的內(nèi)存塊,s的污點(diǎn)狀態(tài)由不可信變?yōu)榭尚?。假設(shè)s有子域或者s是數(shù)組類型變量,則s的子域或所有數(shù)組元素的污點(diǎn)狀態(tài)都會(huì)被右值變量的污點(diǎn)狀態(tài)覆蓋,即左值的污點(diǎn)狀態(tài)信息必須與右值的污點(diǎn)狀態(tài)信息一致。

        (2)a=b,b.f,class.f,b[i]

        MustAlias(a)=ConstGen=ConstKill=Ф

        If(b,ta),(b.f,ta),(class.f,ta),(b[i],ta)∈X/*?i,f.右值完全污染*/

        DepGen={(a,ta),(a.f,ta),(a[i],ta)}

        DepKill={(a,pa),(a.f,pa),(a[i],pa)}

        If(b,pa),(b.f,pa),(class.f,pa),(b[i],pa)∈X/*?i,f.右值部分污染*/

        DepGen={(a,pa),(a.f,pa),(a[i],pa)}

        DepKill={(a,ta),(a.f,ta),(a[i],ta)}

        If(b,pa),(b,ta),(b.f,pa),(b.f,ta),(class.f,pa),(class.f,ta),(b[i],pa),(b[i],ta)?X/*?i,f.右值可信*/

        DepGen=Ф

        DepKill={(a,pa),(a,ta),(a.f,pa),(a.f,ta),(a[i],pa),(a[i],ta)}

        對(duì)于第2類賦值語句,污點(diǎn)信息是從右值傳播到左值,因此,執(zhí)行此類語句后,左值污點(diǎn)狀態(tài)的改變?nèi)Q于右值原來的污點(diǎn)狀態(tài)。在圖3(a)的第6條語句中,p.name將污點(diǎn)信息通過賦值語句傳遞給s,s的污點(diǎn)狀態(tài)等于p.name記錄的污點(diǎn)信息:如果p.name是ta,那么s為ta;如果p.name是pa,那么s為pa;如果p.name是trust,那么s為trust。

        p.name在執(zhí)行第5條語句時(shí)被完全污染,所以執(zhí)行完第6條語句后,s也被完全污染。

        (3)a=new…

        MustAlias(a)=ConstGen=DepKill=DepGen=Ф

        ConstKill={(a,pa),(a,ta),(a.f,pa),(a.f,ta),(a[i],pa),(a[i],ta)}(?i,f)

        在上述語句中,右值為new表達(dá)式。執(zhí)行該語句時(shí),系統(tǒng)會(huì)分配新的內(nèi)存空間給左值變量,所以污點(diǎn)狀態(tài)集合中與左值相關(guān)的污點(diǎn)信息會(huì)被清除。在圖3(a)的第3條語句中,變量s重新指向一個(gè)新的字符串對(duì)象的內(nèi)存塊,污點(diǎn)傳播語義與第1條常量賦值的語義相同。

        2)形如a.f=b、a[i]=b、class.f=b,其中,f表示對(duì)象域,class.f表示類的靜態(tài)域。

        (1)a.f=b(i指任意下標(biāo))

        MustAlias(a.f)=ConstGen=ConstKill=Ф,MustAlias(a)≠Ф

        If(b,ta)∈X/*右值完全污染*/

        If (a,ta)∈X

        DepGen=DepKill=Ф

        If (a,pa)∈X

        DepGen={(a.f,ta),(a.f.h,ta),(a.f[i],ta)}∪f_gen(a,f,ta);(?i,h)

        DepKill={(a.f,pa),(a.f.h,pa),(a.f[i],pa)}∪f_kill(a,f,ta);(?i,h)

        If (a,pa)?X∧(a,ta)?X

        DepGen={(a,pa),(a.f,ta),(a.f.h,ta),(a.f[i],ta)}∪f_gen(a,f,ta);(?i,h)

        DepKill=f_kill(a,f,ta);

        If(b,pa)∈X/*右值部分污染*/

        If (a,ta)∈X

        DepGen={(a,pa),(a.f,pa),(a.f.h,pa),(a.f[i],pa)}∪f_gen(a,f,pa);(?i,h)

        DepKill={(a,ta),(a.f,ta),(a.f.h,ta),(a.f[i],ta)}∪f_kill(a,f,pa);(?i,h)

        If (a,pa)∈X

        DepGen={(a.f,pa),(a.f.h,pa),(a.f[i],pa)}∪f_gen(a,f,pa);(?i,h)

        DepKill={(a.f,ta),(a.f.h,ta),(a.f[i],ta)}∪f_kill(a,f,pa);(?i,h)

        If (a,pa)?X∧(a,ta)?X

        DepGen={(a,pa),(a.f,pa),(a.f.h,pa),(a.f[i],pa)}∪f_gen(a,f,pa);(?i,h)

        DepKill=f_kill(a,f,pa);(?i,h)

        If(b,pa)?X∧(b,ta)?X/*右值可信*/

        If (a,ta)∈X

        DepGen={(a,pa)}∪f_gen(a,f,trust);

        DepKill={(a,ta),(a.f,ta),(a.f,pa),(a.f.h,ta),(a.f.h,pa),(a.f[i],ta),(a.f[i],pa)}∪f_kill(a,f,trust);(?i,h)

        If (a,pa)∈X

        DepGen=f_gen(a,f,trust);

        DepKill={(a.f,ta),(a.f,pa),(a.f.h,ta),(a.f.h,pa),(a.f[i],ta),(a.f[i],pa)}∪f_kill(a,f,trus);(?i,h)

        If (a,pa)?X∧(a,ta)?X

        DepGen=DepKill=Ф

        f_gen和f_kill函數(shù)定義如圖4所示。

        圖4 f_gen與f_kill函數(shù)定義

        在“a.f=b”形式的賦值語句中,左值的訪問路徑長度為2,因此,在污點(diǎn)信息從右值傳遞到左值后,需要另外調(diào)整與a.f相關(guān)的別名變量的污點(diǎn)信息。例如a.f的污點(diǎn)狀態(tài)由trust變?yōu)閠a,那么a就變?yōu)閜a,如果c.d是a的一個(gè)別名變量,并且c原本是trust,那么需要將c的污點(diǎn)狀態(tài)也調(diào)整為pa。在圖3(b)的第4條語句中,右值t在執(zhí)行第3條語句時(shí)被完全污染,t將污點(diǎn)信息傳遞給p.name,所以p.name的污點(diǎn)狀態(tài)與t一致,也是ta。但是p.name在被t污染之前是可信的,在對(duì)象p中還可能存在其他可信域,因此保守地約定p是pa而不是ta。

        (2)class.f=a(左值是類的靜態(tài)成員)

        MustAlias(class.f)=ConstGen=ConstKill=Ф

        If(a,pa)∈X/*右值部分污染*/

        DepGen={(class.f,pa),(class.f.h,pa),(class.f[i],pa)}(?i,h)

        DepKill={(class.f,ta),(class.f.h,ta),(class.f[i],ta)}(?i,h)

        If(a,ta)∈X/*右值完全污染*/

        DepGen={(class.f,ta),(class.f.h,ta),(class.f[i],ta)}(?i,h)

        DepKill={(class.f,pa),(class.f.h,pa),(class.f[i],pa)}(?i,h)

        If(a,pa)?X∧(a,ta)?X/*右值可信*/

        DepGen={Ф}

        DepKill={(class.f,pa),(class.f,ta),(class.f.h,pa),(class.f.h,ta),(class.f[i],pa),(class.f[i],ta)}(?i,h)

        在圖3(b)的第5條語句中,Person.type被改為ta。由于此前Person.type是trust,并且所有其他Person類型的對(duì)象都是trust,因此當(dāng)Person.type變?yōu)閠a后,因?yàn)閠ype域被所有Person類型對(duì)象共用,所以需要將其他Person類型的對(duì)象修改為pa。

        (3)a[i]=b(i指某一個(gè)數(shù)組下標(biāo),j為任意下標(biāo))

        MustAlias(a[i])=ConstGen=ConstKill=Ф

        If(b,ta)∈X∨(b,pa)∈X

        If(a,ta)∈X

        DepGen={(a[i],ta),(a[i].f,ta),(a[i][j],ta)}∪f_gen(a,a[i],ta);(?j,f)

        DepKill=Ф;

        If(a,pa)?X∧(a,ta)?X

        DepGen={(a,ta),(a[i],ta),(a[i].f,ta),(a[i][j],ta)}∪f_gen(a,a[i],ta);(?j,f)

        DepKill=Ф;

        If(b,ta)?X∧(b,pa)?X

        If (a,ta)∈X

        DepGen={(a[i],ta),(a[i].f,ta),(a[i][j],ta)}∪f_gen(a,a[i],ta);(?j,f)

        DepKill=Ф;

        If(a,pa)?X∧(a,ta)?X

        DepGen=DepKill=Ф

        在圖3(b)執(zhí)行第8條語句之前,數(shù)組對(duì)象array和array[0]、array[1]都是trust,執(zhí)行第8條語句后,由于右值t是ta,因此污點(diǎn)信息首先傳遞給array[1],導(dǎo)致array[1]被修改為ta,根據(jù)2.1節(jié)給出的第5條污點(diǎn)狀態(tài)一致性約束,數(shù)組對(duì)象和元素都為trust或者都為ta。因此,array[0]和array指向的內(nèi)存塊都被改為ta,保證他們的污點(diǎn)狀態(tài)信息與array[1]一致。

        2.2.2 方法調(diào)用語句

        圖5中給出2個(gè)Trace片段,用于輔助解釋各類方法調(diào)用語句。

        圖5 Trace片段

        1)與庫方法調(diào)用相關(guān)的語句

        (1)Trust(a)(調(diào)用定義的驗(yàn)證方法摘要)

        ConstGen=ConstKill=DepGen=Ф

        DepKill={(a,pa),(a,ta),(a.f,pa),(a.f,ta),(a[i],pa),(a[i],ta)}∪{(x,pa),(x,ta)|x∈MustAlias(a)}(?i,f)

        (2)a=TaintSource(污染源source)

        ConstGen=ConstKill=DepKill=Ф

        DepGen={(a,ta),(a.f,ta),(a[i],ta)}(?i,f)

        (3)其他(依據(jù)定義的庫方法摘要)

        圖3(a)的最后一條語句是調(diào)用驗(yàn)證方法secret對(duì)變量s進(jìn)行無害化處理,即執(zhí)行secret后,s由ta變?yōu)閠rust。

        2)與自定義方法調(diào)用相關(guān)語句

        分析與自定義方法調(diào)用相關(guān)語句的污點(diǎn)傳播時(shí),必須關(guān)注參數(shù)傳遞和方法返回;方法體內(nèi)其他語句的污點(diǎn)傳播必須滿足一致性約束。

        (1)方法調(diào)用語句形式為virtualinvokea.f(b)、c=virtualinvokea.f(b)、specialinvokea.f(b)或c=specialInvokea.f(b)。

        ①r0:=@this:Class/*this引用的初始化語句*/

        ConstGen=ConstKill=DepKill=Ф

        If(a,pa)∈X/*方法調(diào)用者部分可信*/

        DepGen={(r0,pa),(r0.f,pa),(r0[i],pa)}(?i,f)

        If(a,ta)∈X/*方法調(diào)用者完全不可信*/

        DepGen={(r0,ta),(r0.f,ta),(r0[i],ta)}(?i,f)

        If(a,pa)?X∧(a,ta)?X/*方法調(diào)用者可信*/

        DepGen=Ф

        ②i0:=@parameter0:type/*實(shí)參傳遞給形參的語句*/

        ConstGen=ConstKill=DepKill=Ф

        If(b,pa)∈X/*實(shí)參部分可信*/

        DepGen={(i0,pa),(i0.f,pa),(i0[i],pa)}(?i,f)

        If(b,ta)∈X/*實(shí)參完全不可信*/

        DepGen={(i0,ta),(i0.f,ta),(i0[i],ta)}(?i,f)

        If(b,pa)?X∧(b,ta)?X/*實(shí)參可信*/

        DepGen=Ф

        ③return

        ConstGen=ConstKill=Ф

        DepKill={(var,taint_state)|方法調(diào)用現(xiàn)場(chǎng)的上下文無法訪問的var}

        If在當(dāng)前語句點(diǎn)的數(shù)據(jù)流事實(shí)中包含有記錄r0、r0.f、r0[i]

        DepGen={將r0、r0.f、r0[i]的污點(diǎn)狀態(tài)傳遞給對(duì)應(yīng)的a、a.f、a[i]}(?i,f)

        If在當(dāng)前語句點(diǎn)的數(shù)據(jù)流事實(shí)中都沒有記錄r0、r0.f、r0[i]的污點(diǎn)狀態(tài)

        DepGen=Ф

        ④return i1;

        ConstGen=ConstKill=Ф

        DepKill={(var,taint_state)|方法調(diào)用站無法訪問var}

        If(i1,pa)∈X(方法返回值部分可信)

        DepGen={(c,pa),(c.f,pa),(c[i],ta)}(?i,f)

        /*如果在當(dāng)前語句點(diǎn)的數(shù)據(jù)流事實(shí)中包含有記錄r0、r0.f、r0[i]的污點(diǎn)狀態(tài),則再并上集合{將r0、r0.f、r0[i]的污點(diǎn)狀態(tài)傳遞給對(duì)應(yīng)的a、a.f、a[i]}*/

        If(i1,ta)∈X/*方法返回值完全不可信*/

        DepGen={(c,ta),(c.f,ta),(c[i],ta)}(?i,f)

        /*如果在當(dāng)前語句點(diǎn)的數(shù)據(jù)流事實(shí)中包含有記錄r0、r0.f、r0[i]的污點(diǎn)狀態(tài),則再并上集合{將r0、r0.f、r0[i]的污點(diǎn)狀態(tài)傳遞給對(duì)應(yīng)的a、a.f、a[i]}*/

        If(i1,pa)?X∧(i1,ta)?X/*方法返回值可信*/

        DepGen=Ф

        /*如果在當(dāng)前語句點(diǎn)的數(shù)據(jù)流事實(shí)中包含有記錄r0、r0.f、r0[i]的污點(diǎn)狀態(tài),則再并上集合{將r0、r0.f、r0[i]的污點(diǎn)狀態(tài)傳遞給對(duì)應(yīng)的a、a.f、a[i]}*/

        方法的參數(shù)傳遞語句中的污點(diǎn)傳播路徑與賦值語句相同,污點(diǎn)信息都是從右值傳播到左值。在參數(shù)傳遞時(shí),左值變量的訪問路徑長度至多為1,因此,無需像賦值語句那樣調(diào)整別名變量的污點(diǎn)狀態(tài)。當(dāng)方法返回時(shí),如果調(diào)用該方法的語句是賦值語句,那么污點(diǎn)信息從返回值傳播到左值。在圖5(a)的第2條語句中,在參數(shù)傳遞時(shí),實(shí)參變量$r1和$r7分別將污點(diǎn)信息傳遞給第3和第4條語句的形參變量$r1和$r0。當(dāng)is_name方法執(zhí)行完畢,第6條返回語句將被污染的返回值$z0賦值給第2條語句的接收變量$z0,它們互為別名,即它們指向同一內(nèi)存塊并且是ta。

        (2)方法調(diào)用形式為staticinvokef(a)或b=staticinvokef(a)。

        ①i0:=@parameter0:type

        ConstGen=ConstKill=DepKill=Ф

        If(a,pa)∈X/*實(shí)參部分可信*/

        DepGen={(i0,pa),(i0.f,pa),(i0[i],pa)}(?i,f)

        If(a,ta)∈X/*實(shí)參完全不可信*/

        DepGen={(i0,ta),(i0.f,ta),(i0[i],ta)}(?i,f)

        If(a,pa)?X∧(a,ta)?X/*實(shí)參可信*/

        DepGen=Ф

        ②return

        ConstGen=ConstKill=DepGen=Ф

        DepKill={(var,taint_state)|方法調(diào)用站無法訪問var}

        ③return i1

        ConstGen=ConstKill=Ф

        DepKill={(var,taint_state)|方法調(diào)用站無法訪問var}

        If(i1,pa)∈X/*方法返回值部分可信*/

        DepGen={(b,pa),(b.f,pa),(b[i],pa)}(?i,f)

        If(i1,ta)∈X/*方法返回值完全不可信*/

        DepGen={(b,ta),(b.f,ta),(b[i],ta)}(?i,f)

        If(i1,pa)?X∧(i1,ta)?X/*方法返回值可信*/

        DepGen=Ф

        在圖5(b)的Trace片段中,變量$r4是污染源,第5條語句是靜態(tài)方法調(diào)用。在參數(shù)傳遞時(shí),實(shí)參$r4將污點(diǎn)信息傳遞給形參$r0,所以第3條語句的變量$r0的污點(diǎn)狀態(tài)信息來自$r4,即$r0與$r4的污點(diǎn)信息相同。在執(zhí)行完第5條語句的靜態(tài)方法時(shí),第9條方法返回語句將$r4賦值給接收變量$r5,即變量$r4和$r5互為別名,它們指向的內(nèi)存塊的污點(diǎn)狀態(tài)信息等于$r4在返回語句位置的污點(diǎn)狀態(tài)。

        2.2.3 其他規(guī)定

        針對(duì)賦值語句的污點(diǎn)傳播,保守定義3條通用傳播語義:

        1)右值是二元操作符表達(dá)式(BinopExpr),如果右邊的兩個(gè)操作數(shù)都是trust,那么左值修改為trust;否則,左值被修改為ta。例如a=b+c,只有當(dāng)b和c都為trust時(shí),a才被改為trust,否則a為ta。

        2)右值是類型判別表達(dá)式(InstanceOf)或一元操作符表達(dá)式(UnopExpr),首先將右值的污點(diǎn)狀態(tài)信息拷貝給到左值,然后調(diào)整與左值相關(guān)的其他變量的污點(diǎn)信息。例如在圖6給出的示例代碼中,a的污點(diǎn)信息與b相同。

        圖6 Jimple代碼示例

        Fig.6 Example of Jimple code

        3)右值是方法調(diào)用表達(dá)式(InvokExpr)時(shí),如果調(diào)用自定義方法,由于已經(jīng)記錄了調(diào)用現(xiàn)場(chǎng)信息,并對(duì)相關(guān)內(nèi)存塊的污點(diǎn)狀態(tài)信息進(jìn)行過跟蹤,所以無需再做額外操作。如果調(diào)用庫方法,就需要判斷該方法是否source方法,是則將該方法當(dāng)做污染源進(jìn)行處理,否則根據(jù)下文定義的庫方法污點(diǎn)傳播摘要和驗(yàn)證方法污點(diǎn)傳播摘要進(jìn)行分析。

        3 原型系統(tǒng)實(shí)現(xiàn)

        原型系統(tǒng)由插樁模塊、別名分析模塊和污點(diǎn)分析模塊組成,其中通過插樁程序記錄程序運(yùn)行時(shí)的執(zhí)行路徑信息(Trace),Trace本質(zhì)上是一條順序執(zhí)行的代碼序列。將Trace作為輸入,分析其中的別名關(guān)系和污點(diǎn)信息。

        3.1 別名分析模塊

        別名分析的基礎(chǔ)是方法調(diào)用現(xiàn)場(chǎng)信息,重點(diǎn)是方法調(diào)用過程中的實(shí)參與形參的映射關(guān)系。定義數(shù)據(jù)結(jié)構(gòu)“Stack>”記錄方法調(diào)用現(xiàn)場(chǎng)信息,其中每個(gè)現(xiàn)場(chǎng)元素以HashMap鍵-值對(duì)的形式存儲(chǔ),包含2種信息:一是“position”,表示方法調(diào)用語句在Trace中的位置信息,直接從Trace中記錄的語句信息獲得;二是“actual_formal_map”,使用“LinkedList>”類型,根據(jù)方法簽名存儲(chǔ)實(shí)參與形參之間的映射關(guān)系,Pair的第1個(gè)元素表示實(shí)參,第2個(gè)元素表示形參;LinkedList中最后1個(gè)元素用于記錄實(shí)例方法的this引用的傳遞信息,如果不是實(shí)例方法調(diào)用語句則不記錄。

        別名分析模塊按Trace中的指令順序模擬實(shí)際運(yùn)行時(shí)動(dòng)態(tài)分配的內(nèi)存空間,在每塊內(nèi)存空間中記錄所有指向該內(nèi)存空間的別名引用,即別名集合。根據(jù)不同語句類型判斷別名信息的傳遞,進(jìn)而跟蹤內(nèi)存空間的別名信息的變化。內(nèi)存空間的數(shù)據(jù)結(jié)構(gòu)定義如下:

        LinkedList>,HashSet>>>

        上述結(jié)構(gòu)以鏈表的形式存儲(chǔ)程序申請(qǐng)的所有內(nèi)存塊,其中每一個(gè)Pair代表一個(gè)內(nèi)存塊,在每個(gè)內(nèi)存塊中記錄了2種信息:別名信息和內(nèi)存塊信息。它們各映射成一個(gè)集合(HashSet),分別是PointsToSet和BlocksSet。PointsToSet記錄所有指向該內(nèi)存塊的變量,集合中的所有變量之間都互為別名。BlocksSet記錄的是內(nèi)存塊集合。集合中的元素類型是HashMap,每個(gè)元素記錄了申請(qǐng)內(nèi)存塊的位置信息、內(nèi)存塊的子空間位置信息和內(nèi)存塊的污點(diǎn)信息,具體字段記錄的內(nèi)容如表1所示。

        表1 內(nèi)存塊記錄的信息

        依照表1的定義,順序遍歷Trace中的語句信息,分析每條指令并跟蹤別名信息的傳遞過程。經(jīng)分析,對(duì)Android應(yīng)用執(zhí)行時(shí)的別名信息造成影響的語句類型共有4種,分別是參數(shù)傳遞語句(IdentityStmt)、賦值語句(AssignStmt)、方法調(diào)用語句(InvokeStmt)和方法返回語句(ReturnStmt)。

        3.2 庫方法污點(diǎn)傳播摘要

        在污點(diǎn)分析過程中,本文方法不對(duì)底層系統(tǒng)調(diào)用庫、JDK和SDK庫方法的內(nèi)部數(shù)據(jù)流進(jìn)行污點(diǎn)分析,而是采用建模的方式定義污點(diǎn)傳播摘要,記錄調(diào)用庫方法前后內(nèi)存中的污點(diǎn)信息變化。同時(shí)對(duì)庫方法中包含的驗(yàn)證方法(Sanitizer)進(jìn)行建模,定義無害化處理的污點(diǎn)傳播摘要。采用白名單結(jié)合正則匹配的策略對(duì)自定義驗(yàn)證方法進(jìn)行識(shí)別,主要基于方法名稱、傳遞參數(shù)類型和返回值類型。例如,對(duì)于名字中包含“validate”“encrypt”或“check”等子串的方法調(diào)用語句,如果參數(shù)類型和返回值類型的簽名滿足預(yù)定義規(guī)則,那么使用預(yù)定義的污點(diǎn)傳播摘要直接生成方法調(diào)用后的內(nèi)存污點(diǎn)信息。

        下面給出典型庫方法的污點(diǎn)傳播摘要示例,按照方法的調(diào)用方式分為靜態(tài)調(diào)用(StaticInvokeExpr)和實(shí)例調(diào)用(InstanceInvokeExpr)2種類型。

        1)靜態(tài)調(diào)用。在默認(rèn)情況下,如果方法調(diào)用現(xiàn)場(chǎng)接收方法的返回值,那么將所有實(shí)參的污點(diǎn)信息直接傳播給接收變量。污點(diǎn)傳播路徑如圖7中箭頭所示。對(duì)一些非典型的靜態(tài)調(diào)用方法如,污點(diǎn)傳播路徑是從其他實(shí)參傳遞到第3個(gè)實(shí)參指向的內(nèi)存塊。

        圖7 靜態(tài)調(diào)用庫方法的默認(rèn)污點(diǎn)傳播路徑

        Fig.7 Default taint propagation path of static invocation library method

        2)實(shí)例調(diào)用。在默認(rèn)情況下,污點(diǎn)信息從所有實(shí)參傳播到this指向的內(nèi)存塊,如果方法調(diào)用現(xiàn)場(chǎng)接收方法的返回值,那么將this的污點(diǎn)信息再傳遞到接收變量。

        圖8給出的全類名中定義的庫方法,如果方法調(diào)用現(xiàn)場(chǎng)處接收方法的返回值,那么污點(diǎn)信息從實(shí)參和this傳播到接收變量,然后再從實(shí)參傳播到this變量所指向的內(nèi)存塊,如果被調(diào)用方法是“read”,那么污點(diǎn)信息還會(huì)從this和其他實(shí)參傳播到第一個(gè)實(shí)參。

        圖8 Java中的全類名

        此外,還有2個(gè)特殊的方法:一是,污點(diǎn)信息還會(huì)從this和其他實(shí)參傳播到第3個(gè)實(shí)參變量;二是,污點(diǎn)信息還會(huì)從this和其他實(shí)參傳播到第2個(gè)實(shí)參。

        3.3 驗(yàn)證方法污點(diǎn)傳播摘要

        同樣,按照調(diào)用方式分為靜態(tài)調(diào)用和實(shí)例調(diào)用。

        1)靜態(tài)調(diào)用。方法簽名類似,那么接收方法返回值的變量經(jīng)過了驗(yàn)證,即接收變量是可信的。如果方法名包含“check”“encode”“secret”“validate”和“sanitize”字符串,那么這些方法被認(rèn)為是驗(yàn)證方法,所有實(shí)參將在方法體內(nèi)做無害化處理,它們的污點(diǎn)狀態(tài)被置為trust。

        2)實(shí)例調(diào)用。同樣,如果實(shí)例調(diào)用方法的方法名包含約定的字符串,那么所有實(shí)參、this變量和接收返回值的變量都會(huì)被無害化處理,它們的污點(diǎn)狀態(tài)被置為trust。對(duì)于圖9給出的驗(yàn)證方法,它們被調(diào)用后,所有實(shí)參和this變量都被無害化處理,污點(diǎn)狀態(tài)為trust。

        圖9 部分驗(yàn)證方法的方法簽名

        4 實(shí)驗(yàn)分析

        原型系統(tǒng)基于Soot-trunk 3.0[20]和FlowDroid 2.0框架實(shí)現(xiàn),使用JDK 1.8開發(fā),總計(jì)5 700余行代碼,其中插樁模塊1 400余行,別名分析模塊和污點(diǎn)分析模塊共4 300余行。實(shí)驗(yàn)環(huán)境為Genymotion搭建的模擬器,運(yùn)行系統(tǒng)版本為Android4.4,操作系統(tǒng)版本是Ubuntu 18.04.1 LTS,處理器i5-3230M,CPU 2.6 GHz,內(nèi)存8 GB。

        實(shí)驗(yàn)測(cè)試選取DroidBench2.0[21]作為測(cè)試數(shù)據(jù)集,它包含了13類共119個(gè)Android應(yīng)用。剔除跨組件通信、應(yīng)用間通信和多線程3類測(cè)試樣本共34個(gè)(原型系統(tǒng)目前還不支持這三類的應(yīng)用程序)。另外,在實(shí)際記錄程序執(zhí)行Trace和分析過程中,有15個(gè)樣本無法獲得有效的Trace,最終得到70個(gè)有效樣本。運(yùn)行FlowDroid對(duì)這70個(gè)樣本進(jìn)行靜態(tài),共發(fā)現(xiàn)64個(gè)泄露,進(jìn)一步采用本文方法對(duì)70個(gè)樣本進(jìn)行分析,實(shí)驗(yàn)結(jié)果如表2所示??梢钥闯?本文方法共獲得72條Trace,共發(fā)現(xiàn)68個(gè)泄露,與FlowDroid的結(jié)果比較,發(fā)現(xiàn)它報(bào)告了4條虛警,并有8條漏報(bào)。

        表2 本文方法與MultiFlow方法的實(shí)驗(yàn)結(jié)果比較

        Table 2 Experimental results comparsion of the proposed method and MultiFlow method

        方法Trace數(shù)泄露數(shù)虛警數(shù)漏報(bào)數(shù)本文方法726848MultiFlow方法—6815

        圖10是一組實(shí)驗(yàn)獲得的Trace片段結(jié)構(gòu)。FlowDroid報(bào)告了2條泄露,分別是從第1行Source執(zhí)行到第3和第5行的Sink1和Sink2。其中從Source到Sink1的隱私泄露,本文方法給出了Source到Sink1的完整污點(diǎn)傳播路徑,因此該漏洞真實(shí)存在。Source到Sink2共存在4條可執(zhí)行路徑,在運(yùn)行程序獲得4條Trace后,對(duì)每條Trace進(jìn)行污點(diǎn)分析,沒有發(fā)現(xiàn)任何的污點(diǎn)傳播路徑,因此報(bào)告該漏洞是虛警。

        圖10 Trace片段結(jié)構(gòu)

        圖11是一組發(fā)現(xiàn)FlowDroid漏報(bào)的Trace片段,污染源Source在圖中第10行語句處,發(fā)現(xiàn)污點(diǎn)變量$r6可以傳播到第26行的$r13變量中,即26行的Sink語句觸發(fā)了污點(diǎn)變量$r13,這里有一條Source到Sink的未經(jīng)驗(yàn)證的路徑,路徑如圖12所示。

        表2中第2行是使用MultiFlow對(duì)相同樣本集進(jìn)行分析的實(shí)驗(yàn)結(jié)果。MultiFlow通過檢測(cè)是否組合綁定的多對(duì)Source能同時(shí)觸發(fā)Sink來降低虛警率,包括2個(gè)分析階段:1)單源分析,檢測(cè)每一個(gè)Source是否傳播到Sink;2)多源分析,以組合的方式檢測(cè)多個(gè)Source能否綁定同時(shí)觸發(fā)Sink。MultiFlow總共報(bào)告68個(gè)泄露,發(fā)現(xiàn)了1個(gè)虛警和5個(gè)漏報(bào)。

        MulfiFlow未能找到潛在的3個(gè)虛警和3個(gè)漏報(bào),其中未發(fā)現(xiàn)的3個(gè)虛警是由于MultiFlow丟失了污點(diǎn)在回調(diào)方法間傳遞的數(shù)據(jù)流信息。在未檢測(cè)到的3個(gè)漏報(bào)中,2個(gè)分別發(fā)生在修改Shared Preference的回調(diào)方法中的和構(gòu)造Fragement的回調(diào)方法中,第3個(gè)是在多源分析階段將其中的2條泄露報(bào)警錯(cuò)誤地合并成一條。實(shí)驗(yàn)結(jié)果表明,相比MultiFlow和FlowDroid,本文方法準(zhǔn)確率更高,能夠有效減少虛警,并降低漏報(bào)率。

        圖11 實(shí)驗(yàn)獲得的Trace片段

        圖12 污點(diǎn)傳播路徑

        5 結(jié)束語

        本文設(shè)計(jì)一種面向Android應(yīng)用的Trace污點(diǎn)分析方法。通過插樁Android應(yīng)用記錄程序運(yùn)行時(shí)的Trace,在此基礎(chǔ)上結(jié)合別名分析與污點(diǎn)分析方法,驗(yàn)證Trace中是否存在隱私泄露。本文方法不支持跨組件、跨應(yīng)用程序之間的數(shù)據(jù)通信過程,其對(duì)Android 庫方法的建模也仍不完備,可能導(dǎo)致污點(diǎn)分析不精確。因此,下一步將研究跨組件污點(diǎn)數(shù)據(jù)流事實(shí)的傳播,同時(shí)對(duì)Android庫方法的污點(diǎn)傳播語義進(jìn)行更完備的建模。

        猜你喜歡
        分析信息方法
        隱蔽失效適航要求符合性驗(yàn)證分析
        電力系統(tǒng)不平衡分析
        電子制作(2018年18期)2018-11-14 01:48:24
        訂閱信息
        中華手工(2017年2期)2017-06-06 23:00:31
        電力系統(tǒng)及其自動(dòng)化發(fā)展趨勢(shì)分析
        可能是方法不對(duì)
        用對(duì)方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        捕魚
        展會(huì)信息
        健康信息
        祝您健康(1987年3期)1987-12-30 09:52:32
        青青草针对华人超碰在线| 俺去俺来也在线www色官网| 午夜精品一区二区三区在线观看| 亚洲av高清在线观看三区| 精品女人一区二区三区| 久久久久久夜精品精品免费啦| 亚洲色婷婷一区二区三区| 老熟妇仑乱一区二区视頻| 日韩在线手机专区av| 亚洲一区二区三区偷拍厕所| 国产精品久线在线观看| 伊伊人成亚洲综合人网7777| 中文字幕亚洲精品人妻| 亚洲av老熟女一区二区三区| 国产精品亚洲а∨天堂2021| 色一情一乱一伦一区二区三欧美| 巨臀精品无码AV在线播放| 国产黄色一区二区在线看| 久久久无码精品亚洲日韩蜜臀浪潮| 韩国三级中文字幕hd久久精品| 国产精品久久久久久久久久影院| 亚洲天堂av在线免费观看| 乱码av麻豆丝袜熟女系列| 免费无码肉片在线观看| 亚洲国产日韩av一区二区| 亚洲一区二区三区四区地址| 国产女主播精品大秀系列| 亚洲熟妇一区无码| 中文字幕亚洲视频三区| 强开小婷嫩苞又嫩又紧视频韩国| 国产亚洲情侣一区二区无 | 欧美xxxxx精品| 亚洲一区二区三区99| 色拍自拍亚洲综合图区| 无码人妻少妇久久中文字幕蜜桃| 精品国产麻豆免费人成网站| 国产精品久久国产精麻豆99网站| 精品国产三级a∨在线观看| 国产成年无码久久久久下载| 漂亮人妻被强了中文字幕| 久久久久国产一区二区|