【優(yōu)分享】Android開發(fā)常見風(fēng)險(xiǎn)及解決方案
?
*版權(quán)聲明:本文作者 優(yōu)測(cè)團(tuán)隊(duì)測(cè)試專家 李忠丞。
Android作為一個(gè)普及度、成熟度極高的平臺(tái),每天都有大量新APP涌現(xiàn)。開發(fā)一款A(yù)ndroid應(yīng)用,除了要有新穎的創(chuàng)意和高效的性能,保證安全性也是不容忽視的問題。俗話說打鐵還需自身硬。接下來,我們會(huì)陸續(xù)與大家分享一些常見、不常見的代碼風(fēng)險(xiǎn)問題,希望對(duì)您的Android開發(fā)工作有一定的啟發(fā)和助益。
?
一、調(diào)試日志函數(shù)調(diào)用風(fēng)險(xiǎn)
調(diào)試日志函數(shù)可能輸出重要的日志文件,其中包含的信息可能導(dǎo)致客戶端用戶信息泄露,暴露客戶端代碼邏輯等,為發(fā)起攻擊提供便利。例如:Activity的組件名,是Activity劫持需要的信息;通信交互的日志,會(huì)成為發(fā)動(dòng)服務(wù)器攻擊的依據(jù);跟蹤的變量值,可能泄露一些敏感數(shù)據(jù),輸入的賬號(hào)、密碼等。
這是一個(gè)極其常見的問題,雖然正常情況下我們的日志輸出應(yīng)該通過工具統(tǒng)一接管,正式發(fā)版時(shí)通過編譯參數(shù)自動(dòng)關(guān)閉日志輸出。但是在日常調(diào)試的過程中,難免有時(shí)會(huì)隨意輸出。關(guān)閉調(diào)試日志函數(shù)調(diào)用,或者確保日志的輸出使用了正確的級(jí)別,涉及敏感數(shù)據(jù)的日志信息在發(fā)布版本中被關(guān)閉,這些基本的檢查還是不能省去的。
?
二、密鑰硬編碼漏洞
密鑰硬編碼是指在代碼中直接將加密算法的密鑰設(shè)置為一個(gè)固定值。通常加密算法本身都是公開的,而加密內(nèi)容的保密則主要是依賴于加密密鑰。如果密鑰泄露,根據(jù)加密算法和加密后的密文,很容易得到加密前的明文。而密鑰硬編碼在代碼中,通過反編譯攻擊者可以直接查看密鑰內(nèi)容,整個(gè)加密算法將形同虛設(shè)。密鑰硬編碼,可直接造成加密數(shù)據(jù)被破解,客戶端與服務(wù)器之間的通信內(nèi)容被破解,導(dǎo)致應(yīng)用內(nèi)的加密文件被破解,或是用戶的敏感信息泄露。
若條件允許,最好使用專業(yè)的加固方案或者密鑰白盒來保護(hù)加密算法源代碼,防止被逆向獲取到;或者參考下面的代碼,動(dòng)態(tài)生成密鑰:
?
public String DemoEncrypt(String paramString){
??????????? Key keySpec = new SecretKeySpec(paramString.getBytes(), "AES");
??????????? Cipher cipher = Cipher.getIntance("AES/CBC/PKCS5Padding");
??????????? cipher.init(Cipher.ENCRYPT_MODE,keySpec);
??????????? }
?
三、Fragment注入攻擊漏洞
Activity可包含多個(gè)Fragment來展示界面,PreferenceActivity是支持Fragment的基類activity,其根據(jù)傳入的參數(shù)EXTRA_SHOW_FRAGMENT,(‘:android:show_fragment’)動(dòng)態(tài)創(chuàng)建fragment實(shí)現(xiàn)界面展示。
當(dāng)PreferenceActivity的activity是屬性為export,PreferenceActivity不檢查傳入的參數(shù)直接根據(jù)其構(gòu)建對(duì)象時(shí),可以構(gòu)造intent中的extra數(shù)據(jù),調(diào)用應(yīng)用內(nèi)部的任意fragment。fragment注入攻擊可導(dǎo)致應(yīng)用的敏感信息泄露、遠(yuǎn)程代碼執(zhí)行或者應(yīng)用崩潰。
當(dāng)targetSdk大于等于19時(shí),強(qiáng)制實(shí)現(xiàn)了isValidFragment方法;小于19時(shí),在PreferenceActivity的子類中都要加入isValidFragment,兩種情況下在isValidFragment方法中進(jìn)行fragment名的合法性校驗(yàn)。
?
四、Intent Scheme URL攻擊漏洞
利用intent scheme URLs(意圖協(xié)議URL),可以通過web頁(yè)面發(fā)送intent來啟動(dòng)App應(yīng)用。攻擊者可構(gòu)造特殊格式的URL直接向系統(tǒng)發(fā)送意圖,啟動(dòng)App應(yīng)用的Activity組件或者發(fā)送異常數(shù)據(jù),導(dǎo)致應(yīng)用的敏感信息泄露或者應(yīng)用崩潰。
避免這個(gè)漏洞,我們需要為需要啟用瀏覽器調(diào)用功能的activity組件配置category filter, 使用 " android. intent. category. BROWSABLE "限制調(diào)用的發(fā)起者。以下代碼供參考:
Intent intent = Intent.parseUri(uri);?
intent.addCategory("android.intent.category.BROWSABLE");?
intent.setComponent(null);?
intent.setSelector(null);?
context.startActivityIfNeeded(intent, -1);
?
五、Webview File同源策略繞過漏洞
JavaScript的延時(shí)執(zhí)行能夠繞過file協(xié)議的同源檢查,并能夠訪問受害應(yīng)用的所有私有文件,即通過WebView對(duì)Javascript的延時(shí)執(zhí)行和將當(dāng)前Html文件刪除掉并軟連接指向其他文件就可以讀取到被符號(hào)鏈接所指的文件,然后通過JavaScript再次讀取Html文件,即可獲取到被符號(hào)鏈接所指的文件。大多數(shù)使用WebView的應(yīng)用都會(huì)受到該漏洞的影響。惡意應(yīng)用通過該漏洞,可在無特殊權(quán)限下盜取應(yīng)用的任意私有文件。尤其是瀏覽器,可利用該漏洞,獲取到瀏覽器所保存的密碼、Cookie、收藏夾以及歷史記錄等敏感信息,從而造成敏感信息泄露。
所以我們需要自查代碼,重點(diǎn)在以下幾個(gè)方面:
1、將不必要導(dǎo)出的組件設(shè)置為不導(dǎo)出,并顯式設(shè)置所注冊(cè)組件的“android:exported”屬性為false;
2、如果需要導(dǎo)出組件,禁止使用File域WebView.getSettings.setAllowFileAccess(false);
3、如果需要使用File協(xié)議,禁止File協(xié)議調(diào)用JavaScript:WebView.getSettings.setJavaScriptEnabled(false)
?
六、Webview遠(yuǎn)程代碼執(zhí)行漏洞
Webview是Android用于瀏覽網(wǎng)頁(yè)的組件。其包含的接口函數(shù)addJavascriptInterface可以將Java類或方法導(dǎo)出以供JavaScript調(diào)用,實(shí)現(xiàn)網(wǎng)頁(yè)JS與本地JAVA的交互。由于系統(tǒng)沒有限制已注冊(cè)JAVA類的方法調(diào)用,因此未注冊(cè)的其它任何JAVA類也可以被反射機(jī)制調(diào)用,這樣可能導(dǎo)致被篡改的URL中存在的惡意代碼被執(zhí)行,用戶手機(jī)被安裝木馬程序,發(fā)送扣費(fèi)短信,通信錄或者短信被竊取,甚至手機(jī)被遠(yuǎn)程控制。
避免入坑需要從以下幾個(gè)方面考慮:
1、Android系統(tǒng)在4.2以上(包含4.2):Android在4.2版本之后,要求允許被調(diào)用的函數(shù)需要使用@JavascriptInterface對(duì)被調(diào)用函數(shù)進(jìn)行進(jìn)行注解;
2、Android系統(tǒng)在4.2以下:建議不要使用addJavascriptInterface方法,一定要使用該接口的情況下,可使用下面方式降低風(fēng)險(xiǎn):
a)使用HTTPS加載頁(yè)面時(shí),利用證書校驗(yàn)機(jī)制防止訪問的頁(yè)面被替換或者被掛馬。
b)使用HTTP加載頁(yè)面時(shí),應(yīng)該對(duì)頁(yè)面進(jìn)行完整性校驗(yàn)等方式,確認(rèn)頁(yè)面未被更改或替換。
c)加載本地頁(yè)面時(shí),在程序中也應(yīng)對(duì)頁(yè)面進(jìn)行完整性校驗(yàn)。
3、移除webkit中默認(rèn)內(nèi)置接口,除了addJavascriptInterface接口,還有webkit默認(rèn)的內(nèi)置接口會(huì)導(dǎo)致同樣的問題。故開發(fā)者在使用webview時(shí),需要移除以下三個(gè)默認(rèn)接口:
removeJavascriptInterface("searchBoxJavaBridge_")
removeJavascriptInterface("accessibilityTraversal")
removeJavascriptInterface("accessibility")
?
七、InnerHTML的XSS攻擊漏洞
H5在Android的開發(fā)中也是非常常見的技術(shù)方案。DOM型XSS漏洞是基于文檔對(duì)象模型(Document Object Model)的一種漏洞。它的攻擊代碼不需要服務(wù)器解析響應(yīng),而是通過瀏覽器端的DOM解析觸發(fā)XSS??蛻舳松系腏avaScript腳本可以訪問瀏覽器的DOM,并修改頁(yè)面的內(nèi)容,不依賴服務(wù)器的數(shù)據(jù),直接從瀏覽器端獲取數(shù)據(jù)并執(zhí)行。 在JavaScript中給DOM的innerHTML屬性賦值一個(gè)script標(biāo)簽,是一個(gè)非常普遍的xss注入點(diǎn)。如果攻擊者利用該漏洞進(jìn)行攻擊,可能會(huì)導(dǎo)致賬號(hào)或Cookie信息被竊取,從而冒充管理者登錄后臺(tái)進(jìn)行數(shù)據(jù)篡改等惡意操作。
防止此類漏洞有兩條原則:過濾輸入和轉(zhuǎn)義輸出。
輸入:過濾雙引號(hào),單引號(hào),分號(hào)。
輸出:對(duì)上述字符進(jìn)行HTML實(shí)體編碼即可。
?
本文分享了一些經(jīng)典的代碼風(fēng)險(xiǎn)問題。有些問題官方升級(jí)已經(jīng)修正,但仍有探討的價(jià)值。在開發(fā)的漫漫長(zhǎng)河中,不斷地發(fā)現(xiàn)和解決問題是永恒的話題,我們的警惕心理不能懈怠。今后,我們會(huì)持續(xù)地針對(duì)這一話題與大家進(jìn)行分享,敬請(qǐng)期待!
?
?
?
*版權(quán)聲明:本文作者 優(yōu)測(cè)團(tuán)隊(duì)測(cè)試專家 李忠丞。
?
?
?
?