密鑰硬編碼漏洞
危害:"密鑰硬編碼是指在代碼中直接將加密算法的密鑰設(shè)置為一個(gè)固定值。通常加密算法本身都是公開(kāi)的,而加密內(nèi)容的保密則主要是依賴(lài)于加密密鑰。如果密鑰泄露,根據(jù)加密算法和加密后的密文,很容易得到加密前的明文。而密鑰硬編碼在代碼中,通過(guò)反編譯攻擊者可以直接查看密鑰內(nèi)容,整個(gè)加密算法將形同虛設(shè)。密鑰硬編碼,可直接造成加密數(shù)據(jù)被破解,客戶(hù)端與服務(wù)器之間的通信內(nèi)容被破解,導(dǎo)致應(yīng)用內(nèi)的加密文件被破解,或是用戶(hù)的敏感信
息泄露。"
解決方案: 密鑰加密存儲(chǔ)或者經(jīng)過(guò)變形處理后用于加解密運(yùn)算,切勿硬編碼到代碼中。
首先密鑰存在本地很定不是絕對(duì)安全的,能做的是提高密鑰獲取的門(mén)檻,在android中主要有以下幾個(gè)做法:
1、密鑰直接明文存在sharedprefs文件中,這是最不安全的。
2、密鑰直接硬編碼在Java代碼中,這很不安全,dex文件很容易被逆向成java代碼。
3、將密鑰分成不同的幾段,有的存儲(chǔ)在文件中、有的存儲(chǔ)在代碼中,最后將他們拼接起來(lái),可以將整個(gè)操作寫(xiě)的很復(fù)雜,這因?yàn)檫€是在java層,逆向者只要花點(diǎn)時(shí)間,也很容易被逆向。
4、用ndk開(kāi)發(fā),將密鑰放在so文件,加密解密操作都在so文件里,這從一定程度上提高了的安全性,擋住了一些逆向者,但是有經(jīng)驗(yàn)的逆向者還是會(huì)使用IDA破解的。
5、在so文件中不存儲(chǔ)密鑰,so文件中對(duì)密鑰進(jìn)行加解密操作,將密鑰加密后的密鑰命名為其他普通文件,存放在assets目錄下或者其他目錄下,接著在so文件里面添加無(wú)關(guān)代碼(花指令),雖然可以增加靜態(tài)分析難度,但是可以使用動(dòng)態(tài)調(diào)式的方法,追蹤加密解密函數(shù),也可以查找到密鑰內(nèi)容。
如果要想更高級(jí)別的密鑰安全,那可以考慮使用密鑰交換算法,比如DH算法,公鑰加密密鑰等。
Webview 明文存儲(chǔ)密碼風(fēng)險(xiǎn)
危害:Android 的 Webview 組件中默認(rèn)打開(kāi)了提示用戶(hù)是否保存密碼的功能,如果用戶(hù)選擇保存,用戶(hù)名和密碼將被明文存儲(chǔ)到該應(yīng)用目錄databases/webview.db 中。而本地明文存儲(chǔ)的用戶(hù)名和密碼,不僅會(huì)被該應(yīng)用隨意瀏覽,其他惡意程序也可能通過(guò)提權(quán)或者 root 的方式訪問(wèn)該應(yīng)用的webview 數(shù)據(jù)庫(kù),從而竊取用戶(hù)登錄過(guò)的用戶(hù)名信息以及密碼。
解決方案:mWebView.settings.savePassword = false
WebView 安全之 addJavascriptInterface
危害:為了與Web頁(yè)面實(shí)現(xiàn)動(dòng)態(tài)交互,Android應(yīng)用程序允許WebView通過(guò)WebView.addJavascriptInterface接口向Web頁(yè)面注入Java對(duì)象,頁(yè)面Javascript腳本可直接引用該對(duì)象并調(diào)用該對(duì)象的方法。
在Android <=4.1.2 (API 16),WebView使用WebKit瀏覽器引擎,并未正確限制addJavascriptInterface的使用方法,在應(yīng)用權(quán)限范圍內(nèi),攻擊者可以通過(guò)Java反射機(jī)制實(shí)現(xiàn)任意命令執(zhí)行。
在Android >=4.2 (API 17),WebView使用Chromium瀏覽器引擎,并且限制了Javascript對(duì)Java對(duì)象方法的調(diào)用權(quán)限,只有聲明了@JavascriptInterace注解的方法才能被Web頁(yè)面調(diào)用。
如:
<script>
function execute(cmdArgs) {
// jsobj是通過(guò)addJavascriptInterface添加到j(luò)s中的java對(duì)象
return jsobj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
execute(someCmd);
</script>
解決方案:android 4.2以上使用@Javascriptinterface注解標(biāo)記js需要調(diào)用的原生方法
android 4.2以下建議不要使用,可以通過(guò)
public WebResourceResponse shouldInterceptRequest(WebView view, final String url) 攔截來(lái)實(shí)現(xiàn)js調(diào)native。
“應(yīng)用克隆”漏洞攻擊風(fēng)險(xiǎn)
危害:當(dāng) Android 應(yīng)用中存在包含webview 的可被導(dǎo)出 Activity 組件時(shí),setAllowFileAccess=true,setAllowFileAccessFromFileURLs=true,即允許通過(guò) file url 對(duì)文件進(jìn)行訪問(wèn),并且未對(duì)訪問(wèn)的路徑進(jìn)行嚴(yán)格校驗(yàn),則可能導(dǎo)致“應(yīng)用克隆”漏洞攻擊。
攻擊者利用該漏洞,可遠(yuǎn)程獲取用戶(hù)隱私信息(包括手機(jī)應(yīng)用數(shù)據(jù)、照片、文檔等敏感信息)導(dǎo)致數(shù)據(jù)泄露,可遠(yuǎn)程打開(kāi)并加載惡意HTML 文件,甚至獲取 App 中包括用戶(hù)登錄憑證在內(nèi)的所有本地敏感數(shù)據(jù)。
攻擊流程:
setp1: 構(gòu)造一個(gè)網(wǎng)頁(yè),網(wǎng)頁(yè)代碼要包含:1.啟動(dòng)支付寶的Webview 2.下載攻擊腳本到本地SD卡的download目錄 3.利用file協(xié)議加載本地攻擊腳本
setp2: 利用支付寶應(yīng)用定義的URL Scheme,使支付寶Webview加載自己的頁(yè)面;
setp3: 下載到本地的攻擊腳本,利用file協(xié)議打開(kāi)執(zhí)行攻擊腳本,攻擊腳本再一次利用file協(xié)議讀取支付寶的個(gè)人數(shù)據(jù),并上傳到攻擊者的服務(wù)器或者設(shè)備中
解決方案:
1.嚴(yán)格限制包含 WebView 調(diào)用的 Activity 組件的導(dǎo)出權(quán)限,關(guān)閉導(dǎo)出權(quán)限
或者限制導(dǎo)出組件的發(fā)起者。
2.對(duì)于功能要求必須導(dǎo)出的 Activity 組件,手動(dòng)設(shè)置
setAllowFileAccessFromFileURLs(false)或
setAllowUniversalAccessFromFileURLs(false)
或者設(shè)置 minSDK 不小于 16,因?yàn)榇藭r(shí)這兩處 API 默認(rèn)為 false
- 對(duì)于必須使用 file URL 對(duì) http 域進(jìn)行訪問(wèn)時(shí),可對(duì)傳入的 URL 路徑范圍
嚴(yán)格控制,例如建立 URL 白名單,設(shè)置允許訪問(wèn)的 URL 列表(不要遺漏路
徑中可能出現(xiàn)的特殊情況如“../../”等,避免限制被繞過(guò))。舉個(gè)栗子
:
/構(gòu)建 webview/
WebView webView = new WebView(this);
webview.setWebViewClient(new WebViewClient{
public boolean shouldOverrideUrlLoading(WebView view, String
url){
/白名單/
String[] allowUrlArr = {
""a.html"",
""b.html"",
""c.js"",
}
/禁止 url 中出現(xiàn)../避免白名單被繞過(guò)/
if(-1 != url.indexOf(""../"")){
return true;
}
/應(yīng)用自己的 HTML 文件放在/data/data/(app)目錄下,避免被第三方
替換或修改/
if(url.startsWith(""/data/data/(app)"")){
/檢測(cè)重定向的 url 是否在白名單中/
for(String s : allowUrlArr){
if(url.endsWith(s)){
return false;
} }}
return true;})
當(dāng)返回值為 true 時(shí),應(yīng)該拒絕此 URL 路徑下的訪問(wèn)。"
Webview File 同源策略繞過(guò)漏洞
危害:Android 應(yīng)用中存在包含webview 的可被導(dǎo)出 Activity 組件時(shí),WebView setAllowFileAccess = true,setAllowFileAccessFromFileURLs= false,雖然不允許file url訪問(wèn)本地文件,但利用JavaScript 的延時(shí)執(zhí)行能夠繞過(guò) file 協(xié)議的同源檢查,并能夠訪問(wèn)受害應(yīng)用的所有私有文件,即通過(guò) WebView 對(duì) Javascript 的延時(shí)執(zhí)行和將當(dāng)前 Html文件刪除掉并軟連接指向其他文件就可以讀取到被符號(hào)鏈接所指的文件,然后通過(guò) JavaScript 再次讀取 HTML 文件,即可獲取到被符號(hào)鏈接所指的文件。大多數(shù)使用 WebView 的應(yīng)用都會(huì)受到該漏洞的影響,惡意應(yīng)用通過(guò)該漏洞,可在無(wú)特殊權(quán)限下盜取應(yīng)用的任意私有文件,尤其是瀏覽器,可通過(guò)利用該漏洞,獲取到瀏覽器所保存的密碼、Cookie、收藏夾以及歷史記錄等敏感信息,從而造成敏感信息泄露。

解決方案:
- 將不必要導(dǎo)出的組件設(shè)置為不導(dǎo)出,并顯式設(shè)置所注冊(cè)組件的
“android:exported”屬性為 false; - 如果需要導(dǎo)出組件,禁止訪問(wèn)本地File
WebView.getSettings.setAllowFileAccess(false); - 如果需要使用 File 協(xié)議,禁止調(diào)用 JavaScript:
WebView.getSettings.setJavaScrip"
allowBackup程序任意備份漏洞
危害說(shuō)明:Android API Level 8 及其以上 Android 系統(tǒng)提供了為應(yīng)用程序數(shù)據(jù)的備份和恢復(fù)功能,此功能的開(kāi)關(guān)決定于該應(yīng)用程序中 AndroidManifest.xml 文件中的 allowBackup 屬性值,其屬性值默認(rèn)是 True。當(dāng) allowBackup 標(biāo)志為 true 時(shí),用戶(hù)即可通過(guò) adb backup 和 adb restore 來(lái)進(jìn)行對(duì)應(yīng)用數(shù)據(jù)的備份和恢復(fù),這可能會(huì)帶來(lái)一定的安全風(fēng)險(xiǎn)。
Android 屬性 allowBackup 安全風(fēng)險(xiǎn)源于 adb backup 容許任何一個(gè)能夠打開(kāi) USB 調(diào)試開(kāi)關(guān)的人從Android 手機(jī)中復(fù)制應(yīng)用數(shù)據(jù)到外設(shè),一旦應(yīng)用數(shù)據(jù)被備份之后,所有應(yīng)用數(shù)據(jù)都可被用戶(hù)讀??;adb restore 容許用戶(hù)指定一個(gè)恢復(fù)的數(shù)據(jù)來(lái)源(即備份的應(yīng)用數(shù)據(jù))來(lái)恢復(fù)應(yīng)用程序數(shù)據(jù)的創(chuàng)建。因此,當(dāng)一個(gè)應(yīng)用數(shù)據(jù)被備份之后,用戶(hù)即可在其他 Android 手機(jī)或模擬器上安裝同一個(gè)應(yīng)用,以及通過(guò)恢復(fù)該備份的應(yīng)用數(shù)據(jù)到該設(shè)備上,在該設(shè)備上打開(kāi)該應(yīng)用即可恢復(fù)到被備份的應(yīng)用程序的狀態(tài)。
尤其是通訊錄應(yīng)用,一旦應(yīng)用程序支持備份和恢復(fù)功能,攻擊者即可通過(guò) adb backup 和 adb restore 進(jìn)行恢復(fù)新安裝的同一個(gè)應(yīng)用來(lái)查看聊天記錄等信息;對(duì)于支付金融類(lèi)應(yīng)用,攻擊者可通過(guò)此來(lái)進(jìn)行惡意支付、盜取存款等;因此為了安全起見(jiàn),開(kāi)發(fā)者務(wù)必將 allowBackup 標(biāo)志值設(shè)置為 false 來(lái)關(guān)閉應(yīng)用程序的備份和恢復(fù)功能,以免造成信息泄露和財(cái)產(chǎn)損失。
解決方案:應(yīng)用程序中 AndroidManifest.xml 文件中的 allowBackup 屬性設(shè)備為false。