華為云計(jì)算 云知識(shí) 移動(dòng)應(yīng)用安全常用組件Soot、Flowdroid簡(jiǎn)介&基本使用
移動(dòng)應(yīng)用安全常用組件Soot、Flowdroid簡(jiǎn)介&基本使用

【摘要】 移動(dòng)應(yīng)用安全檢測(cè),soot、flowdroid分別作為靜態(tài)分析、污點(diǎn)分析主要工具,能我們能夠快速高效的進(jìn)行檢測(cè)分析、本文主要介紹兩個(gè)工具的基本操作及相應(yīng)的使用場(chǎng)景,后續(xù)的文章中會(huì)逐步深入分析移動(dòng)應(yīng)用安全漏洞、隱私合規(guī)、廣告欺詐、惡意行為等常見(jiàn)問(wèn)題的檢測(cè)手段

 

概述

Android作為一個(gè)開(kāi)放的移動(dòng)應(yīng)用平臺(tái),無(wú)論是系統(tǒng)還是APK應(yīng)用面臨嚴(yán)峻的安全問(wèn)題,針對(duì)應(yīng)用安全面臨的威脅,檢測(cè)技術(shù)也在不斷演進(jìn),但是基于靜態(tài)分析的方式始終繞不過(guò)Soot跟FlowDroid,前者是一個(gè)java語(yǔ)言分析工具,同時(shí)也支持APK文件的分析,后者則是污點(diǎn)分析工具,通過(guò)生成Graph追蹤污點(diǎn)傳輸路徑。下面針對(duì)這兩個(gè)進(jìn)行介紹介紹,幫助讀者能快速入門(mén)。

Soot

簡(jiǎn)介

soot是java優(yōu)化框架,提供4種中間代碼來(lái)分析和轉(zhuǎn)換字節(jié)碼。

● Baf:精簡(jiǎn)的字節(jié)碼表示,操作簡(jiǎn)單

● Jimple:適用于優(yōu)化的3-address中間表示

● Shimple:Jimple的SSA變體

● Grimple:適用于反編譯和代碼檢查的Jimple匯總版本。

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

輸出格式有:Java字節(jié)碼、android字節(jié)碼、Jimple、Jasmin、shimple、baf等,這些實(shí)際業(yè)務(wù)中常使用的,當(dāng)然還有其它的格式,這里不再一一列舉。

借助soot對(duì)android的分析能力,我們可以進(jìn)一步分析安卓應(yīng)用的安全漏洞,比如組件暴露、加密算法等存在的安全問(wèn)題。

基本使用

可以GIT下載最新的soot jar包,我下載的是4.1.0版本中的sootclasses-trunk-jar-with-dependencies.jar 包,這個(gè)包應(yīng)該自帶了soot所需要的所有依賴(lài)。下載完成后使用powershell進(jìn)入jar文件所在的文件夾,可以輸入以下命令:

java -cp sootclasses-trunk-jar-with-dependencies.jar soot.Main查看soot相關(guān)的信息

首先我們來(lái)看soot怎么分析java代碼(這里以class文件分析為例):

第一步,配置soot環(huán)境信息

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());

第二步,設(shè)置soot的配置屬性(各屬性說(shuō)明可以參考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);
	// 加載要處理的類(lèi)設(shè)置為應(yīng)用類(lèi),并加載到soot環(huán)境Scene中
	Scene.v().loadClass(clzName, SootClass.BODIES).setApplicationClass();
}
for (SootClass clz : Scene.v().getApplicationClasses()) {
	//遍歷獲取類(lèi)、方法等需要的信息
}

現(xiàn)在,我們?cè)诳纯磗oot怎么分析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等,基于這些進(jìn)行進(jìn)一步分析并應(yīng)用到實(shí)際檢測(cè)業(yè)務(wù)中。

使用場(chǎng)景

使用Soot對(duì)Android應(yīng)用進(jìn)行靜態(tài)分析,目前包括主要的檢測(cè)場(chǎng)景:

● 檢測(cè)應(yīng)用中敏感字符串url和email、IP等

● 檢測(cè)應(yīng)用中風(fēng)險(xiǎn)代碼片段

● 檢測(cè)應(yīng)用可能存在的漏洞,如組件暴露、過(guò)度申請(qǐng)權(quán)限、不安全加密算法等

FlowDroid

簡(jiǎn)介

FlowDroid(github鏈接https://github.com/secure-software-engineering/FlowDroid )是目前對(duì)Android app進(jìn)行污點(diǎn)分析效果最好的工具之一。 污點(diǎn)分析的目的其實(shí)很簡(jiǎn)單,就是為了檢查是否應(yīng)用中是否存在從污點(diǎn)源到泄漏點(diǎn)的數(shù)據(jù)流。 但是它的優(yōu)點(diǎn)在于它構(gòu)建的數(shù)據(jù)流精度很高,可以對(duì)上下文,流,對(duì)象和字段敏感,從而使得分析結(jié)果非常精確。

它實(shí)現(xiàn)精準(zhǔn)分析的原因有幾點(diǎn):

● 1. 它對(duì)Android聲明周期進(jìn)行了比較完整的構(gòu)建,例如Activity中的OnCreate,OnResume等。通過(guò)抽象一個(gè)dummyMain作為分析的入口來(lái)支持Android應(yīng)用的分析;

● 2. 它實(shí)現(xiàn)了精準(zhǔn)的數(shù)據(jù)流分析,其中包含前向污點(diǎn)分析和后向別名分析。他們的實(shí)現(xiàn)其實(shí)都是基于heros的數(shù)據(jù)流分析框架來(lái)實(shí)現(xiàn)的。這里面的算法比較復(fù)雜,我的理解是這兩種分析都是滿足上下文敏感和流敏感的,后向分析的算法提供了對(duì)象敏感和字段敏感的支持;

● 3. 它支持簡(jiǎn)單的native code的污點(diǎn)分析

當(dāng)然,它也存在一些不足之處,包括:

● 1. 不能對(duì)組件間(Intent)的污點(diǎn)傳播進(jìn)行分析

● 2. 隱式流問(wèn)題

● 3. native code不能完美支持

盡管存在一些不足之處,在各大會(huì)議上也已經(jīng)提出了數(shù)十種新的靜態(tài)污點(diǎn)分析算法,相比FlowDroid在一些 數(shù)據(jù)集 或是DroidBench上有著更快的運(yùn)行速度以及更優(yōu)的精準(zhǔn)度。但FlowDroid仍然是公共資源中可獲取的靜態(tài)污點(diǎn)分析工具的唯一選擇,因?yàn)楹芏鄍aper提供的源代碼幾乎沒(méi)有注釋與文檔,導(dǎo)致使用極其困難;另外科研人員往往僅在有限的測(cè)試集上進(jìn)行了運(yùn)行,所以去使用這樣的程序不可避免的會(huì)遇到Bug。相比之下,F(xiàn)lowDroid作為被持續(xù)維護(hù)的一款框架,其穩(wěn)定性上具備了一定的保證,同時(shí)其底層的Soot框架強(qiáng)大的功能與較為完善的文檔,使得FlowDroid上手難度相對(duì)較低。

基本使用

環(huán)境配置

FlowDroid的配置方法有兩種,可以直接下載相關(guān)jar包,也可以使用maven配置依賴(lài)。jar包可以去FlowDroid的GitHub上進(jìn)行下載,僅需soot-infoflow-android-classes.jar和soot-infoflow-classes.jar兩個(gè)文件即可,另外去Soot的倉(cāng)庫(kù) 下載包含了heros與jasmin的sootclasses-trunk-jar-with-dependencies.jar,將上述三個(gè)包加入項(xiàng)目依賴(lài)便完成了FlowDroid的配置

運(yùn)行

整個(gè)FlowDroid最頂層的類(lèi)便是soot.jimple.infoflow.android.SetupApplication,大部分的設(shè)置與運(yùn)行都可以通過(guò)操作這個(gè)類(lèi)的實(shí)例進(jìn)行。SetupApplication既可以在調(diào)用runInfoflow()時(shí)傳入配置參數(shù),也可以在初始化SetupApplication時(shí)或初始化后傳入配置參數(shù)。SetupApplication的初始化函數(shù)以及runInfoflow函數(shù)有多種不同參數(shù)類(lèi)型的實(shí)現(xiàn),可以查閱源碼后根據(jù)情況選擇,這里僅提供我自己使用的一種方式:

關(guān)于Source、Sink

污點(diǎn)分析中的source點(diǎn)表示污點(diǎn)分析的起始點(diǎn),而sink點(diǎn)表示污點(diǎn)分析的結(jié)束點(diǎn)。換言之,F(xiàn)lowDroid在“掃描”這個(gè)apk后,會(huì)從source點(diǎn)開(kāi)始分析數(shù)據(jù)流,當(dāng)數(shù)據(jù)流“流到”sink點(diǎn)時(shí)將其標(biāo)注。FlowDroid中的source與sink均為類(lèi)方法,在soot-infoflow-android下有提供一份SourcesAndSinks.txt的文件,是FlowDroid當(dāng)時(shí)使用的一些可能涉及到訪問(wèn)隱私數(shù)據(jù)的api,從里面很容易看出聲明文件的格式:

每一行作為獨(dú)立的聲明,%開(kāi)頭的表示注釋?zhuān)梢愿鶕?jù)應(yīng)用需求自行添加刪減Source與Sink的聲明。

使用場(chǎng)景

Flowdroid本身輸出結(jié)果只是數(shù)據(jù)流信息,需要結(jié)合我們定制source、sink信息產(chǎn)生業(yè)務(wù)價(jià)值,一般有以下使用場(chǎng)景:

● 隱私數(shù)據(jù)泄露檢測(cè)

● 污點(diǎn)傳播類(lèi)問(wèn)題檢測(cè)

● Android組件間數(shù)據(jù)傳遞風(fēng)險(xiǎn)檢測(cè)

文末福利:華為云 漏洞掃描服務(wù) VSS 基礎(chǔ)版限時(shí) 免費(fèi)體驗(yàn) >>>