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