移動應用安全常用元件Soot、Flowdroid簡介&基本使用

科技怪授發表於2022-10-12


Soot

簡介

soot是java最佳化框架,提供4種中間程式碼來分析和轉換位元組碼。

Baf:精簡的位元組碼錶示,操作簡單

Jimple:適用於最佳化的3-address中間表示

Shimple:Jimple的SSA變體

Grimple:適用於反編譯和程式碼檢查的Jimple彙總版本。

soot提供的輸入格式有:java、android、class等

輸出格式有:Java位元組碼、android位元組碼、Jimple、Jasmin、shimple、baf等,這些實際業務中常使用的,當然還有其它的格式,這裡不再一一列舉。

藉助soot對android的分析能力,我們可以進一步分析安卓應用的安全漏洞,比如元件暴露、加密演算法等存在的安全問題。

基本使用

可以GIT下載最新的soot jar包,我下載的是4.1.0版本中的sootclasses-trunk-jar-with-dependencies.jar   包,這個包應該自帶了soot所需要的所有依賴。下載完成後使用powershell進入jar檔案所在的資料夾,可以輸入以 下命令:

java -cp sootclasses-trunk-jar-with-dependencies.jar soot.Main檢視soot相關的資訊

首先我們來看soot怎麼分析java程式碼(這裡以class檔案分析為例):

第一步,配置soot環境資訊

StringBuffer  cp =   new   StringBuffer ();

cp . append ( "." );

cp . append ( File . pathSeparator +  apiPath );

cp . append ( File . pathSeparator +   "C:\\Program Files\\Java\\jre1.8.0_171\\lib\\rt.jar"   +   File . pathSeparator

                   +   "C:\\Program Files\\Java\\jre1.8.0_171\\lib\\jce.jar" ); System . setProperty ( "soot.class.path" ,  cp . toString ());

第二步,設定soot的配置屬性(各屬性說明可以參考GIT上官方文件資訊)

 

第三步,拿到程式碼資訊

 

現在,我們在看看soot怎麼分析android apk

 

同樣,我們可以得到apk的程式碼資訊,包括class、method、attribute等,基於這些進行進一步分析並應用到實際檢測業務中。

使用場景

使用Soot對Android應用進行靜態分析,目前包括主要的檢測場景:

檢測應用中敏感字串url和email、IP等

檢測應用中風險程式碼片段

檢測應用可能存在的漏洞,如元件暴露、過度申請許可權、不安全加密演算法等

FlowDroid

簡介

FlowDroid( github 連結 ) 是目前對Android app進行汙點分析效果最好的工具之一。   汙點分析的目的其實很簡單,就是為了檢查是否應用中是否存在從汙點源到洩漏點的資料流。   但是它的優點在於它構建的資料流精度很高,可以對上下文,流,物件和欄位敏感,從而使得分析結果非常精確。

 

它實現精準分析的原因有幾點:

1.   它對Android宣告週期進行了比較完整的構建,例如Activity中的OnCreate,OnResume等。透過抽象一個dummyMain作為分析的入口來支援Android應用的分析;

2.   它實現了精準的資料流分析,其中包含前向汙點分析和後向別名分析。他們的實現其實都是基於heros的資料流分析框架來實現的。這裡面的演算法比較複雜,我的理解是這兩種分析都是滿足上下文敏感和流敏感的,後向分析的演算法提供了物件敏感和欄位敏感的支援;

3.   它支援簡單的native code的汙點分析

當然,它也存在一些不足之處,包括:

1.   不能對元件間(Intent)的汙點傳播進行分析

2.   隱式流問題

3. native code不能完美支援

儘管存在一些不足之處,在各大會議上也已經提出了數十種新的靜態汙點分析演算法,相比FlowDroid在一些資料集或是DroidBench上有著更快的執行速度以及更優的精準度。但FlowDroid仍然是公共資源中可獲取的靜態汙點分析工具的唯一選擇,因為很多paper提供的原始碼幾乎沒有註釋與文件,導致使用極其困難;另外科研人員往往僅在有限的測試集上進行了執行,所以去使用這樣的程式不可避免的會遇到Bug。相比之下,FlowDroid作為被持續維護的一款框架,其穩定性上具備了一定的保證,同時其底層的Soot框架強大的功能與較為完善的文件,使得FlowDroid上手難度相對較低。

基本使用

環境配置

FlowDroid的配置方法有兩種,可以直接下載相關jar包,也可以使用maven配置依賴。jar包可以去FlowDroid的GitHub上進行下載,僅需soot-infoflow-android-classes.jar和soot-infoflow-classes.jar兩個檔案即可,另外去Soot的 倉庫   下載包含了heros與jasmin的sootclasses-trunk-jar-with-dependencies.jar,將上述三個包加入專案依賴便完成了FlowDroid的配置

執行

整個FlowDroid最頂層的類便是soot.jimple.infoflow.android.SetupApplication,大部分的設定與執行都可以透過操作這個類的例項進行。SetupApplication既可以在呼叫runInfoflow()時傳入配置引數,也可以在初始化SetupApplication時或初始化後傳入配置引數。SetupApplication的初始化函式以及runInfoflow函式有多種不同引數型別的實現,可以查閱原始碼後根據情況選擇,這裡僅提供我自己使用的一種方式:

 

關於Source、Sink

汙點分析中的source點表示汙點分析的起始點,而sink點表示汙點分析的結束點。換言之,FlowDroid在“掃描”這個apk後,會從source點開始分析資料流,當資料流“流到”sink點時將其標註。FlowDroid中的source與sink均為類方法,在soot-infoflow-android下有提供一份SourcesAndSinks.txt的檔案,是FlowDroid當時使用的一些可能涉及到訪問隱私資料的api,從裡面很容易看出宣告檔案的格式:

 

每一行作為獨立的宣告,%開頭的表示註釋,可以根據應用需求自行新增刪減Source與Sink的宣告。

使用場景

Flowdroid本身輸出結果只是資料流資訊,需要結合我們定製source、sink資訊產生業務價值,一般有以下使用場景:

  隱私資料洩露檢測

  汙點傳播類問題檢測

  Android元件間資料傳遞風險檢測

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70022614/viewspace-2918103/,如需轉載,請註明出處,否則將追究法律責任。

相關文章