天天看點

一文了解如何使用移動應用安全元件Soot和Flowdroid

摘要:移動應用安全檢測,soot、flowdroid分别作為靜态分析、污點分析主要工具,能我們能夠快速高效的進行檢測分析、本文主要介紹兩個工具的基本操作及相應的使用場景

本文分享自華為雲社群《移動應用安全常用元件Soot、Flowdroid簡介&基本使用》,作者:舞陽河畔程式猿 。

概述

Android作為一個開放的移動應用平台,無論是系統還是APK應用面臨嚴峻的安全問題,針對應用安全面臨的威脅,檢測技術也在不斷演進,但是基于靜态分析的方式始終繞不過Soot跟FlowDroid,前者是一個java語言分析工具,同時也支援APK檔案的分析,後者則是污點分析工具,通過生成Graph追蹤污點傳輸路徑。下面針對這兩個進行介紹介紹,幫助讀者能快速入門。

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和Flowdroid

首先我們來看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.options.Options.v().set_keep_line_number(true);     soot.options.Options.v().set_whole_program(true);     soot.options.Options.v().setPhaseOption("jb", "use-original-names:true");     soot.options.Options.v().setPhaseOption("cg", "verbose:false");     soot.options.Options.v().setPhaseOption("cg", "trim-clinit:true");     soot.options.Options.v().set_src_prec(Options.src_prec_class);     soot.options.Options.v().set_prepend_classpath(true);     soot.options.Options.v().setPhaseOption("wjop", "enabled:false");      

第三步,拿到代碼資訊

for (String clzName : SourceLocator.v().getClassesUnder("class檔案所在路徑")) {         System.out.printf("api class: %s\n", clzName);         // 加載要處理的類設定為應用類,并加載到soot環境Scene中         Scene.v().loadClass(clzName, SootClass.BODIES).setApplicationClass();     }     for (SootClass clz : Scene.v().getApplicationClasses()) {         //周遊擷取類、方法等需要的資訊     }      

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

Options.v().set_src_prec(Options.src_prec_apk);     Options.v().set_output_format(Options.output_format_jimple);     Options.v().set_process_dir("待處理檔案所在路徑");     // 安卓JDK所在目錄,隻需要指定官方SDK包platforms-new目錄下jar所在路徑即可     Options.v().set_android_jars("jdk path");     Options.v().set_keep_line_number(true);     Options.v().set_allow_phantom_refs(true);     Options.v().set_process_multiple_dex(true);     Options.v().set_whole_program(true);     Scene.v().loadNecessaryClasses();     new CallGraphBuilder().build();      

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

使用場景

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

  • 檢測應用中敏感字元串url和email、IP等
  • 檢測應用中風險代碼片段
  • 檢測應用可能存在的漏洞,如元件暴露、過度申請權限、不安全加密算法等

FlowDroid

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

一文了解如何使用移動應用安全元件Soot和Flowdroid

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

  • 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函數有多種不同參數類型的實作,可以查閱源碼後根據情況選擇,這裡僅提供我自己使用的一種方式:

一文了解如何使用移動應用安全元件Soot和Flowdroid

關于Source、Sink

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

一文了解如何使用移動應用安全元件Soot和Flowdroid

每一行作為獨立的聲明,%開頭的表示注釋,可以根據應用需求自行添加删減Source與Sink的聲明。

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

  • 隐私資料洩露檢測
  • 污點傳播類問題檢測
  • Android元件間資料傳遞風險檢測

文末福利:華為雲漏洞掃描服務VSS 基礎版限時免費體驗>>>

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀