前言
隨著移動(dòng)互聯(lián)網(wǎng)的飛速發(fā)展车遂,移動(dòng)端產(chǎn)品滿(mǎn)天飛盾剩,深入各行各業(yè),移動(dòng)端安全已經(jīng)變得跟PC端安全同等重要地位璧疗。但由于移動(dòng)端自身特性姨裸,移動(dòng)端操作系統(tǒng)以及應(yīng)用程序的安全性做的還不是很成熟秧倾。因此,我們?cè)陂_(kāi)發(fā)移動(dòng)端App的時(shí)候傀缩,要盡量多地避免安全漏洞問(wèn)題那先。本文主要是從預(yù)防的角度出發(fā),介紹一個(gè)靜態(tài)代碼掃描工具赡艰,在編譯階段來(lái)提前發(fā)現(xiàn)代碼的安全漏洞售淡。
FindSecurityBugs簡(jiǎn)介
FindSecurityBugs是Java靜態(tài)分析工具FindBugs的插件,通過(guò)一系列的規(guī)則發(fā)現(xiàn)代碼中的Java安全漏洞瞄摊。這個(gè)工具可以集成在很多IDE中勋又,包括Eclipse或IntelliJ。目前這個(gè)項(xiàng)目已經(jīng)在安全社區(qū)中獲得了不少關(guān)注度换帜。該工具的最新版本還增加了專(zhuān)門(mén)針對(duì)Android端產(chǎn)品的漏洞類(lèi)型楔壤。因此,它也是一個(gè)不錯(cuò)的移動(dòng)端安全掃描工具惯驼。如果你想更詳細(xì)的了解它蹲嚣,可以去訪(fǎng)問(wèn)FindeSecurityBugs的Github社區(qū)。
FindSecurityBugs用法
由于FindSecurityBugs是FindBugs的一個(gè)插件祟牲,因此我們使用它的時(shí)候先要下載FindBugs工具隙畜。你可以去FindBugs的官方網(wǎng)站獲取最新的安裝包,這里就不介紹安裝過(guò)程了说贝。
一议惰、命令行方式
示例:
./findbugs -textui -low -html -output myreport.html /Users/darylzhang/Downloads/findbugs-3.0.1/test/
下面是常見(jiàn)參數(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定義過(guò)濾的命名)
-include 只輸出指定的 class/package (必修以xml定義過(guò)濾的命名)
二乡恕、集成到Eclipse插件
1. 系統(tǒng)要求
首先要在電腦上安裝Eclipse 3.3以上的版本言询,且安裝JRE/JDK 1.5以上版本俯萎。
2. 安裝FindBugs插件
1)通過(guò)Eclipse的站點(diǎn)更新功能可以將FindBugs自動(dòng)下載并安裝到Eclipse插件。
2)目前提供三個(gè)FindBugs的下載地址:
- http://findbugs.cs.umd.edu/eclipse/ :這個(gè)地址只提供官方Release版本
- http://findbugs.cs.umd.edu/eclipse-candidate/ :提供最新的預(yù)發(fā)布版本
- http://findbugs.cs.umd.edu/eclipse-daily/ :提供最新的每日構(gòu)建版本
3)你也可以直接通過(guò)以下地址下載: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ò)展包
- 打開(kāi)Eclipse偏好設(shè)置
- 進(jìn)入Java->FindBugs選項(xiàng)
- 找到插件選項(xiàng)卡夫啊,導(dǎo)入擴(kuò)展包
3. 報(bào)告配置
進(jìn)入報(bào)告配置頁(yè)面設(shè)置要掃描的Bug級(jí)別,比如我們這里只關(guān)注安全類(lèi)型的bug的話(huà)辆憔,就只勾選Security選項(xiàng)撇眯。并設(shè)置報(bào)告級(jí)別為low,這樣就可以盡可能多的報(bào)告所有問(wèn)題虱咧。
4. 開(kāi)始掃描
右鍵點(diǎn)擊要掃描的工程熊榛,找到Finde Bugs菜單項(xiàng),選擇Find Bugs開(kāi)始掃描彤钟。如下圖所示来候。
- 查看報(bào)告
掃描完成后,我們可以進(jìn)入Bug Explorer查看結(jié)果報(bào)告逸雹,當(dāng)然如果沒(méi)看到這個(gè)窗口,我們可以在Window—>Show view—>others里面調(diào)出來(lái)云挟。
FindSecurityBugs能掃描的問(wèn)題
這里簡(jiǎn)單介紹幾種FindSecurityBugs能掃描出來(lái)的Android漏洞類(lèi)型梆砸。
1. 外部文件讀寫(xiě)權(quán)限漏洞
應(yīng)用程序具有寫(xiě)入外部存儲(chǔ)(一般是SD卡)的權(quán)限。開(kāi)通了這個(gè)權(quán)限會(huì)導(dǎo)致多個(gè)安全隱患园欣。比如帖世,應(yīng)用程序可以通過(guò)READ_EXTERNAL_STORAGE權(quán)限來(lái)獲取存儲(chǔ)在本地SD卡的文件,如果這些數(shù)據(jù)包含用戶(hù)敏感信息沸枯,而且沒(méi)有加密的話(huà)日矫,那將會(huì)造成用戶(hù)隱私的泄密。
存在風(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. 寫(xiě)文件權(quán)限
我們通過(guò)寫(xiě)權(quán)限MODE_WORLD_READABLE來(lái)寫(xiě)文件的時(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)限
開(kāi)通Webview的Javascript執(zhí)行權(quán)限意味著為XSS開(kāi)通了后門(mén)窃诉,頁(yè)面的渲染有可能會(huì)被反射XSS,存儲(chǔ)XSS和DOM XSS所劫持赤套。如下代碼片段開(kāi)通了Javascript權(quán)限:
WebView myWebView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
這樣飘痛,惡意代碼可以通過(guò)如下的方式攻擊你:
function updateDescription(newDescription) {
$("#userDescription").html("<p>"+newDescription+"</p>");
}
5. Webview暴露Javascript接口
在Android代碼中使用JavaScript接口,將會(huì)暴露本地的API容握。只要加一個(gè)XSS觸發(fā)器宣脉,JavaScript代碼就可以調(diào)用你的Java類(lèi)。如下代碼片段:
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ī)則有限塑猖,我們不能過(guò)分依賴(lài)堪遂。正在的移動(dòng)安全還是需要我們的移動(dòng)開(kāi)發(fā)者增強(qiáng)安全意識(shí),提高自己的代碼防范能力萌庆,從而從代碼源頭避免安全漏洞溶褪。作為測(cè)試人員,也應(yīng)該積極了解移動(dòng)安全的常見(jiàn)漏洞践险,這樣可以及早發(fā)現(xiàn)App的安全風(fēng)險(xiǎn)猿妈,保證產(chǎn)品的安全。