如何使用FindBugs進(jìn)行安全掃描

前言

隨著移動(dòng)互聯(lián)網(wǎng)的飛速發(fā)展,移動(dòng)端產(chǎn)品滿天飛,深入各行各業(yè),移動(dòng)端安全已經(jīng)變得跟PC端安全同等重要地位。但由于移動(dòng)端自身特性,移動(dòng)端操作系統(tǒng)以及應(yīng)用程序的安全性做的還不是很成熟。因此,我們?cè)陂_發(fā)移動(dòng)端App的時(shí)候,要盡量多地避免安全漏洞問題。本文主要是從預(yù)防的角度出發(fā),介紹一個(gè)靜態(tài)代碼掃描工具,在編譯階段來(lái)提前發(fā)現(xiàn)代碼的安全漏洞。

FindSecurityBugs簡(jiǎn)介

FindSecurityBugs是Java靜態(tài)分析工具FindBugs的插件,通過一系列的規(guī)則發(fā)現(xiàn)代碼中的Java安全漏洞。這個(gè)工具可以集成在很多IDE中,包括Eclipse或IntelliJ。目前這個(gè)項(xiàng)目已經(jīng)在安全社區(qū)中獲得了不少關(guān)注度。該工具的最新版本還增加了專門針對(duì)Android端產(chǎn)品的漏洞類型。因此,它也是一個(gè)不錯(cuò)的移動(dòng)端安全掃描工具。如果你想更詳細(xì)的了解它,可以去訪問FindeSecurityBugs的Github社區(qū)。

FindSecurityBugs用法

由于FindSecurityBugs是FindBugs的一個(gè)插件,因此我們使用它的時(shí)候先要下載FindBugs工具。你可以去FindBugs的官方網(wǎng)站獲取最新的安裝包,這里就不介紹安裝過程了。

一、命令行方式

示例:

./findbugs -textui -low -html -output myreport.html  /Users/darylzhang/Downloads/findbugs-3.0.1/test/

下面是常見參數(shù)說(shuō)明
-home 定義findbugs2軟件存放位置
-low 提交警告及任何級(jí)別以上報(bào)告
-medium 提交中,高級(jí)報(bào)告(默認(rèn))
-high 只提交高級(jí)警告
-xml 警告以 xml輸出
-html 警告以 html輸出
-output 定義輸出的文件名
-onlyAnalyze 只分析指定的 class/package
-exclude 忽略指定的 class/package (必修以 xml定義過濾的命名)
-include 只輸出指定的 class/package (必修以xml定義過濾的命名)

二、集成到Eclipse插件

1. 系統(tǒng)要求

首先要在電腦上安裝Eclipse 3.3以上的版本,且安裝JRE/JDK 1.5以上版本。

2. 安裝FindBugs插件

1)通過Eclipse的站點(diǎn)更新功能可以將FindBugs自動(dòng)下載并安裝到Eclipse插件。


圖1

2)目前提供三個(gè)FindBugs的下載地址:

3)你也可以直接通過以下地址下載:http://prdownloads.sourceforge.net/findbugs/edu.umd.cs.findbugs.plugin.eclipse_3.0.1.20150306.zip?download ,然后解壓到Eclipse的插件目錄
4)下載FindSecurityBugs擴(kuò)展包
下載地址:http://h3xstream.github.io/find-sec-bugs/download.htm
5)安裝FindSecurityBugs擴(kuò)展包

  • 打開Eclipse偏好設(shè)置
  • 進(jìn)入Java->FindBugs選項(xiàng)
  • 找到插件選項(xiàng)卡,導(dǎo)入擴(kuò)展包
圖2

3. 報(bào)告配置

進(jìn)入報(bào)告配置頁(yè)面設(shè)置要掃描的Bug級(jí)別,比如我們這里只關(guān)注安全類型的bug的話,就只勾選Security選項(xiàng)。并設(shè)置報(bào)告級(jí)別為low,這樣就可以盡可能多的報(bào)告所有問題。


圖3

4. 開始掃描

右鍵點(diǎn)擊要掃描的工程,找到Finde Bugs菜單項(xiàng),選擇Find Bugs開始掃描。如下圖所示。


圖4
  1. 查看報(bào)告
    掃描完成后,我們可以進(jìn)入Bug Explorer查看結(jié)果報(bào)告,當(dāng)然如果沒看到這個(gè)窗口,我們可以在Window—>Show view—>others里面調(diào)出來(lái)。
圖5

FindSecurityBugs能掃描的問題

這里簡(jiǎn)單介紹幾種FindSecurityBugs能掃描出來(lái)的Android漏洞類型。

1. 外部文件讀寫權(quán)限漏洞

應(yīng)用程序具有寫入外部存儲(chǔ)(一般是SD卡)的權(quán)限。開通了這個(gè)權(quán)限會(huì)導(dǎo)致多個(gè)安全隱患。比如,應(yīng)用程序可以通過READ_EXTERNAL_STORAGE權(quán)限來(lái)獲取存儲(chǔ)在本地SD卡的文件,如果這些數(shù)據(jù)包含用戶敏感信息,而且沒有加密的話,那將會(huì)造成用戶隱私的泄密。
存在風(fēng)險(xiǎn)的代碼片段:

file file = new File(getExternalFilesDir(TARGET_TYPE), filename);
fos = new FileOutputStream(file);
fos.write(confidentialData.getBytes());
fos.flush();

修復(fù)建議:

fos = openFileOutput(filename, Context.MODE_PRIVATE);
fos.write(string.getBytes());

2. 廣播

Broadcast intents可以被任何擁有相關(guān)權(quán)限的應(yīng)用程序截獲,從而獲得敏感信息。
存在風(fēng)險(xiǎn)的代碼片段:

Intent i = new Intent();
i.setAction("com.insecure.action.UserConnected");
i.putExtra("username", user);
i.putExtra("email", email);
i.putExtra("session", newSessionId);

this.sendBroadcast(v1);

修復(fù)建議:

Intent i = new Intent();
i.setAction("com.secure.action.UserConnected");

sendBroadcast(v1);

3. 寫文件權(quán)限

我們通過寫權(quán)限MODE_WORLD_READABLE來(lái)寫文件的時(shí)候,有可能會(huì)把文件的內(nèi)容暴露出來(lái),如下代碼片段:

fos = openFileOutput(filename, MODE_WORLD_READABLE);
fos.write(userInfo.getBytes());

解決方案:

fos = openFileOutput(filename, MODE_PRIVATE);

4. Webview的Javascript執(zhí)行權(quán)限

開通Webview的Javascript執(zhí)行權(quán)限意味著為XSS開通了后門,頁(yè)面的渲染有可能會(huì)被反射XSS,存儲(chǔ)XSS和DOM XSS所劫持。如下代碼片段開通了Javascript權(quán)限:

WebView myWebView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

這樣,惡意代碼可以通過如下的方式攻擊你:

function updateDescription(newDescription) {
    $("#userDescription").html("<p>"+newDescription+"</p>");
}

5. Webview暴露Javascript接口

在Android代碼中使用JavaScript接口,將會(huì)暴露本地的API。只要加一個(gè)XSS觸發(fā)器,JavaScript代碼就可以調(diào)用你的Java類。如下代碼片段:

WebView myWebView = (WebView) findViewById(R.id.webView);

myWebView.addJavascriptInterface(new FileWriteUtil(this), "fileWriteUtil");

WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

[...]
class FileWriteUtil {
    Context mContext;

    FileOpenUtil(Context c) {
        mContext = c;
    }

    public void writeToFile(String data, String filename, String tag) {
        [...]
    }
}

總結(jié)

代碼掃描只是一種手段,畢竟規(guī)則有限,我們不能過分依賴。正在的移動(dòng)安全還是需要我們的移動(dòng)開發(fā)者增強(qiáng)安全意識(shí),提高自己的代碼防范能力,從而從代碼源頭避免安全漏洞。作為測(cè)試人員,也應(yīng)該積極了解移動(dòng)安全的常見漏洞,這樣可以及早發(fā)現(xiàn)App的安全風(fēng)險(xiǎn),保證產(chǎn)品的安全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • FindBugs簡(jiǎn)介 為什么使用靜態(tài)分析工具 FindBugs的使用 FindBugs常見的兩種使用時(shí)機(jī)(1)開發(fā)...
    greensure閱讀 569評(píng)論 0 1
  • 靜態(tài)掃描操作手冊(cè) 前言 靜態(tài)源代碼掃描是近年被人提及較多的軟件應(yīng)用安全解決方案之一。它是指在軟件工程中,程序員在寫...
    MrGago閱讀 646評(píng)論 0 0
  • 源代碼是構(gòu)成信息系統(tǒng)的基石。對(duì)源代碼進(jìn)行安全審計(jì),可以在系統(tǒng)實(shí)現(xiàn)階段就發(fā)現(xiàn)大量的安全漏洞和潛在威脅隱患,可節(jié)省5%...
    得奕閱讀 593評(píng)論 0 0
  • 等母親回家 文:我是素顏 我家門口有一棵棗樹,一個(gè)人張開胳膊是抱不過來(lái)的,它的年齡比兩個(gè)爺爺加起來(lái)的年齡都老。 夢(mèng)...
    我是素顏閱讀 246評(píng)論 0 0
  • 似水流年,沖淡了許多記憶和往事,帶走了許多歡笑和淚水,惟有真情和摯愛永駐,歷久彌新。 昨晚到超市備足做葉貼材料。 ...
    月色黃昏閱讀 639評(píng)論 8 10