Android漏洞匯總

密鑰硬編碼漏洞

危害:"密鑰硬編碼是指在代碼中直接將加密算法的密鑰設(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

  1. 對(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、收藏夾以及歷史記錄等敏感信息,從而造成敏感信息泄露。

image.png

解決方案

  1. 將不必要導(dǎo)出的組件設(shè)置為不導(dǎo)出,并顯式設(shè)置所注冊(cè)組件的
    “android:exported”屬性為 false;
  2. 如果需要導(dǎo)出組件,禁止訪問(wèn)本地File
    WebView.getSettings.setAllowFileAccess(false);
  3. 如果需要使用 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容