Native 代碼是不受TaintDroid監(jiān)控的。理想情況下,我們獲得了相同的傳播語義當(dāng)使用相同的解釋副本時(shí)。因此,為了精確的在Java層進(jìn)行污點(diǎn)監(jiān)控,我們定義了兩個(gè)必要的前提條件:1)所有被訪問的外部變量(對(duì)于其他方法的類字段引用)根據(jù)數(shù)據(jù)流都被標(biāo)記上了相應(yīng)的污點(diǎn)。2)根據(jù)成數(shù)據(jù)流所有返回值都被分配了一個(gè)污點(diǎn)標(biāo)記。TaintDroid完成這些的前提條件是通過各種人工方式,推斷,方法概要,取決于環(huán)境要求。
成都創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過多達(dá)10余年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:集裝箱等企業(yè),備受客戶贊許。
內(nèi)部虛擬機(jī)方法:內(nèi)部虛擬機(jī)的方法又叫做直接譯碼法,傳遞一個(gè)指向32位數(shù)組的寄存器參數(shù)和一個(gè)指向返回值的指針。對(duì)于java參數(shù)和返回值堆棧指針增加提供了如圖 4所示的訪問污點(diǎn)標(biāo)記。在不同的版本之間虛擬機(jī)內(nèi)部方法有一個(gè)相對(duì)很小的數(shù)字在頻繁的增加,在污點(diǎn)傳播需要的時(shí)候我們將會(huì)進(jìn)行手動(dòng)檢測(cè)和修補(bǔ)。我們鑒定了185個(gè)內(nèi)部虛擬機(jī)方法在Android的2.1版本;但是,只有5個(gè)要求打補(bǔ)丁的:數(shù)組復(fù)制的本地方法System.arraycopy()。執(zhí)行Java反射的幾個(gè)本地方法。
JNI 方法:調(diào)用JNI方法通過JNI調(diào)用橋。調(diào)用橋解析Java參數(shù)并且使用方法的描述符字符串給返回值賦值。為了提供污點(diǎn)傳播我們對(duì)所有的JNI方法都進(jìn)行了修補(bǔ)。當(dāng)JNI方法返回時(shí),TaintDroid調(diào)用方法概要標(biāo)簽對(duì)污點(diǎn)傳播進(jìn)行更新。一個(gè)方法配置文件是一個(gè)列表(from,to)指示流動(dòng)的變量,這些變量可能是方法參數(shù),類變量或返回值。枚舉出所有的JNI方法的信息里是一個(gè)耗時(shí)的過程,最好的方法就是使用源代碼完成自動(dòng)化分析(這個(gè)也是我們今后要做的工作)。我們目前包括了一個(gè)額外的傳播啟發(fā)式補(bǔ)丁。啟發(fā)式算法是一個(gè)JNI方法中一個(gè)保守的方法只操作原語和字符串和返回值。他分配了方法參數(shù)污點(diǎn)標(biāo)記標(biāo)簽到污點(diǎn)的返回值的集合。對(duì)于調(diào)用方法的對(duì)象啟發(fā)式的算法有假陰性,它涵蓋了許多存在的方法。
我們對(duì)官方Android版本(2.1)的源碼中包含的JNI方法進(jìn)行了一個(gè)調(diào)查來確定特定的屬性。我們發(fā)現(xiàn)了2844個(gè)JNI方法與Java接口和C或者C++的實(shí)現(xiàn)。在這些方法中,913個(gè)方法沒有對(duì)象的引用(作為參數(shù),返回值,或者方法)因此自動(dòng)被我們的啟發(fā)式算法所覆蓋。剩下的方法可能有或者可能沒有信息流而產(chǎn)生假陰性。目前,我們按需要定義了方法概要。例如,在IBM Native Converter 類中的方法在字符類型和字節(jié)類型數(shù)組之間要求傳播的轉(zhuǎn)換。
當(dāng)APP之間在交換數(shù)據(jù)時(shí)污點(diǎn)標(biāo)記必須傳播。跟蹤的粒度直接影響了性能和內(nèi)存開銷。TaintDroid使用信息級(jí)的污染跟蹤。一個(gè)信息的污染標(biāo)簽代表了信息上一次污點(diǎn)標(biāo)記分配給的變量。我們使用了信息水平級(jí)的粒度使得在進(jìn)程間通訊的性能和存儲(chǔ)開銷達(dá)到最小化。
我們選擇在變量水平實(shí)現(xiàn)消息級(jí)別的污點(diǎn)傳播,因?yàn)樵谝粋€(gè)變量級(jí)系統(tǒng),一個(gè)狡猾的接收器可能通過為打包的變量在不同方式的方式下獲取沒有污點(diǎn)傳播的變量而戲弄監(jiān)控。例如,如果一個(gè)IPC包裹的信息包含一系列的標(biāo)量值,這個(gè)接收器可以解包一個(gè)字符串,從而獲得沒有污染傳播標(biāo)簽的值在標(biāo)量值的序列里。因此,為了阻止應(yīng)用程序可以使用這種來移除污點(diǎn)標(biāo)記,目前執(zhí)行污點(diǎn)保護(hù)都是在信息層級(jí)。
對(duì)于IPC之間的污點(diǎn)傳播會(huì)導(dǎo)致假陽性。類似與數(shù)組,所有的數(shù)據(jù)項(xiàng)為一組分享同一個(gè)污點(diǎn)標(biāo)記。例如,第8部分討論了跟蹤IMSI的限制以免部分配置的參數(shù)之在同一個(gè)包里。未來將會(huì)考慮word級(jí)的污點(diǎn)標(biāo)記以及額外的一致性檢查確保解包變量的準(zhǔn)確傳播。然而這種額外的復(fù)雜性將會(huì)對(duì)IPC性能產(chǎn)生負(fù)面的影響。
當(dāng)數(shù)據(jù)被寫入文件的時(shí)候可能會(huì)導(dǎo)致污點(diǎn)的丟失。我們?cè)O(shè)計(jì)了存儲(chǔ)每個(gè)文件的污點(diǎn)標(biāo)記。這個(gè)污點(diǎn)標(biāo)記將會(huì)被更新當(dāng)寫文件或者在讀取文件的時(shí)候傳播數(shù)據(jù)。TaintDroid存儲(chǔ)文件污染標(biāo)簽在文件系統(tǒng)的擴(kuò)展屬性里。為了達(dá)到這個(gè)目的,我們執(zhí)行了支持Android的熱文件系統(tǒng)擴(kuò)展屬性(YAFFS2)并且格式化了可移除的SD卡與ext2文件系統(tǒng)。至于數(shù)組和IPC,存儲(chǔ)每個(gè)文件的污點(diǎn)標(biāo)記將會(huì)導(dǎo)致假陽性并且限制了信息數(shù)據(jù)庫(kù)污點(diǎn)標(biāo)記的粒度(見第5節(jié))。或者,我們可以跟蹤污點(diǎn)標(biāo)記在更細(xì)的粒度通過犧牲更多的內(nèi)存和性能開銷。
污點(diǎn)源和污染池定義的虛擬化環(huán)境污染標(biāo)簽必須進(jìn)行污點(diǎn)交互。我們抽象出污染源和污染池邏輯組成一個(gè)單獨(dú)的污點(diǎn)接口庫(kù)。這個(gè)接口執(zhí)行兩個(gè)功能:1)增加對(duì)變量的污點(diǎn)標(biāo)記;2)從變量檢索污點(diǎn)標(biāo)記。這個(gè)庫(kù)只能提供添加未設(shè)置或者清除污染標(biāo)簽的功能,這些功能將會(huì)被用來對(duì)于可以的Java code 移除污點(diǎn)標(biāo)記。
增加污點(diǎn)標(biāo)記數(shù)組和字符串通過內(nèi)部虛擬機(jī)方式很簡(jiǎn)單,所有的這些都存儲(chǔ)在數(shù)據(jù)對(duì)象當(dāng)中。對(duì)于基本的數(shù)據(jù)類型,一方面,是存儲(chǔ)在解釋器的內(nèi)部棧當(dāng)方法調(diào)用結(jié)束之后會(huì)被銷毀。因此,污點(diǎn)庫(kù)使用該方法的返回值作為一種污染原始變量的手段。開發(fā)人員通過一個(gè)值或者變量添加進(jìn)合適的污點(diǎn)方法中(e.g., addTaintInt())返回的變量值有相同的值只是增加了指定的污點(diǎn)標(biāo)記。注意棧存儲(chǔ)在污點(diǎn)標(biāo)記檢索時(shí)不會(huì)產(chǎn)生并發(fā)。
使用TaintDroid進(jìn)行隱私分析需要確定操作系統(tǒng)內(nèi)敏感隱私數(shù)據(jù)源和檢測(cè)污染源。在以前,動(dòng)態(tài)污點(diǎn)分析系統(tǒng)假設(shè)污點(diǎn)源和污點(diǎn)池的位置是微不足道的。但是,對(duì)于像Android這樣復(fù)雜的操作系統(tǒng)通過各種各樣的方式為應(yīng)用程序提供各種各樣的信息,例如:直接訪問,服務(wù)接口。每一種可能的隱私敏感信息都必須要認(rèn)真研究才能決定定義污染源的最好方式。
污染源只能夠針對(duì)TaintDroid提供的存儲(chǔ)標(biāo)簽的內(nèi)存增加污點(diǎn)標(biāo)記。目前,污點(diǎn)池和污點(diǎn)源的位置都被限定在解釋器代碼,IPC消息,文件的變量中。本節(jié)將討論這些有價(jià)值的污染源和污染池是怎么實(shí)現(xiàn)這些限制的。我們給予信息特征對(duì)污染源進(jìn)行了概括。
低帶寬傳感器:各種各樣的隱私敏感信息是通過低帶寬傳感器獲得的。例如:位置信息和加速器。信息是常常會(huì)改變的并且會(huì)同時(shí)被多個(gè)應(yīng)用程序所使用。因此,于智能手機(jī)操作系統(tǒng)多路訪問低帶寬傳感器使用一個(gè)管理是一個(gè)很常見的現(xiàn)象。一個(gè)傳感器管理者代表了一個(gè)理想的污點(diǎn)HOOK位置。對(duì)我們分析而言,我們將鉤子插入到Android的LocationManager和SensorManager的應(yīng)用程序中。
高帶寬傳感器:隱私信息例如麥克風(fēng)和照相機(jī)是高帶寬的。它需要傳感器頻繁的返回許多的數(shù)據(jù)量并且這些數(shù)據(jù)都只是一個(gè)應(yīng)用程序來使用。因此,智能手機(jī)的操作系統(tǒng)可能通過大數(shù)據(jù)緩存,文件或者兩者共享傳感器的信息。當(dāng)傳感器信息通過文件共享,文件必須使用合適的污點(diǎn)便簽標(biāo)記。由于API的靈活性,我們將會(huì)對(duì)麥克風(fēng)和照相機(jī)信息數(shù)據(jù)緩沖區(qū)和文件污點(diǎn)下鉤子。
信息數(shù)據(jù)庫(kù):共享信息例如通訊錄地址和短信息常常存儲(chǔ)在基于文件類型的數(shù)據(jù)庫(kù)中。這樣的組織形式提供了有用的明確的污點(diǎn)源類似于硬件傳感器。通過添加一個(gè)污點(diǎn)標(biāo)記數(shù)據(jù)庫(kù)文件,所有的信息從文件讀取將會(huì)自動(dòng)受到污染。我們使用這種技術(shù)來跟蹤通訊錄信息。值得注意的是雖然TrainDroid對(duì)于這些變量是文件級(jí)別的粒度值是合適的,但是可能存在一些文件對(duì)于他們來說粒度可能太大了。但是,我們還沒有遇到這樣的數(shù)據(jù)源。
設(shè)備標(biāo)識(shí):信息是唯一的標(biāo)識(shí)電話或者用戶敏感隱私。并不是所有的個(gè)人的可識(shí)別信息都可以很容易的被污染。但是,電話標(biāo)識(shí)了幾個(gè)容易污染的標(biāo)識(shí):電話號(hào)碼,SIM卡標(biāo)識(shí)(IMSI,ICC-ID)以及IMEI都可以通過定義好的API進(jìn)行訪問。我們測(cè)試了電話號(hào)碼的,ICC-ID,IMEI的API。IMSI污染源存在繼承限制我們將在第8節(jié)進(jìn)行討論。
網(wǎng)絡(luò)污點(diǎn)池:我們的隱私分析確定了污染信息傳送的網(wǎng)絡(luò)接口。VM基于解釋器的方法要求污染池被放置在解釋的代碼中。因此,我們?cè)O(shè)置了Java framework層的庫(kù)的HOOK點(diǎn),這些地方將會(huì)被native層的socket庫(kù)所調(diào)用。