第三章 Android 應(yīng)用的逆向和審計(jì)
作者:Aditya Gupta
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
在本章中,我們將查看 Android 應(yīng)用程序或.apk
文件,并了解其不同的組件。 我們還將使用工具(如 Apktool,dex2jar 和 jd-gui)來逆向應(yīng)用程序。 我們將進(jìn)一步學(xué)習(xí)如何通過逆向和分析源代碼來尋找 Android 應(yīng)用程序中的各種漏洞。 我們還將使用一些靜態(tài)分析工具和腳本來查找漏洞并利用它們。
3.1 Android 應(yīng)用程序拆解
Android 應(yīng)用程序是在開發(fā)應(yīng)用程序時(shí)創(chuàng)建的數(shù)據(jù)和資源文件的歸檔文件。 Android 應(yīng)用程序的擴(kuò)展名是.apk
,意思是應(yīng)用程序包,在大多數(shù)情況下包括以下文件和文件夾:
-
Classes.dex
(文件) -
AndroidManifest.xml
(文件) -
META-INF
(文件夾) -
resources.arsc
(文件) -
res
(文件夾) -
assets
(文件夾) -
lib
(文件夾)
為了驗(yàn)證這一點(diǎn),我們可以使用任何歸檔管理器應(yīng)用程序(如 7zip,WinRAR 或任何首選應(yīng)用程序)簡(jiǎn)單地解壓縮應(yīng)用程序。 在 Linux 或 Mac 上,我們可以簡(jiǎn)單地使用unzip
命令來展示壓縮包的內(nèi)容,如下面的截圖所示:
這里,我們使用-l
(list)標(biāo)志,以便簡(jiǎn)單地展示壓縮包的內(nèi)容,而不是解壓它。 我們還可以使用file
命令來查看它是否是一個(gè)有效的壓縮包。
Android 應(yīng)用程序由各種組件組成,它們一起創(chuàng)建可工作的應(yīng)用程序。 這些組件是活動(dòng),服務(wù),廣播接收器,內(nèi)容供應(yīng)器和共享首選項(xiàng)。 在繼續(xù)之前,讓我們快速瀏覽一下這些不同的組件:
- 活動(dòng)(Activity):這些是用戶可以與之交互的可視界面。這些可以包括按鈕,圖像,
TextView
或任何其他可視組件。 - 服務(wù)(Service):這些 Android 組件在后臺(tái)運(yùn)行,并執(zhí)行開發(fā)人員指定的特定任務(wù)。這些任務(wù)可以包括從 HTTP 下載文件到在后臺(tái)播放音樂的任何內(nèi)容。
- 廣播接收器(Broadcast Receiver):這些是 Android 應(yīng)用程序中的接收器,通過 Android 系統(tǒng)或設(shè)備中存在的其他應(yīng)用程序,監(jiān)聽傳入的廣播消息。一旦它們接收到廣播消息,就可以根據(jù)預(yù)定義的條件觸發(fā)特定動(dòng)作。條件可以為收到 SMS,來電呼叫,電量改變等等。
- 共享首選項(xiàng)(Shared Preference):應(yīng)用程序使用這些首選項(xiàng),以便為應(yīng)用程序保存小型數(shù)據(jù)集。此數(shù)據(jù)存儲(chǔ)在名為
shared_prefs
的文件夾中。這些小數(shù)據(jù)集可以包括名值對(duì),例如游戲中的用戶得分和登錄憑證。不建議在共享首選項(xiàng)中存儲(chǔ)敏感信息,因?yàn)樗鼈兛赡芤资軘?shù)據(jù)竊取和泄漏的影響。 - 意圖(Intent):這些組件用于將兩個(gè)或多個(gè)不同的 Android 組件綁定在一起。意圖可以用于執(zhí)行各種任務(wù),例如啟動(dòng)動(dòng)作,切換活動(dòng)和啟動(dòng)服務(wù)。
- 內(nèi)容供應(yīng)器(Content Provider):這些組件用于訪問應(yīng)用程序使用的結(jié)構(gòu)化數(shù)據(jù)集。應(yīng)用程序可以使用內(nèi)容供應(yīng)器訪問和查詢自己的數(shù)據(jù)或存儲(chǔ)在手機(jī)中的數(shù)據(jù)。
現(xiàn)在我們知道了 Android 應(yīng)用程序內(nèi)部結(jié)構(gòu),以及應(yīng)用程序的組成方式,我們可以繼續(xù)逆向 Android 應(yīng)用程序。 當(dāng)我們只有.apk
文件時(shí),這是獲得可讀的源代碼和其他數(shù)據(jù)源的方式。
3.2 逆向 Android 應(yīng)用
正如我們前面討論的,Android應(yīng)用程序只是一個(gè)數(shù)據(jù)和資源的歸檔文件。 即使這樣,我們不能簡(jiǎn)單地解壓縮歸檔包(.apk
)來獲得可讀的源代碼。 對(duì)于這些情況,我們必須依賴于將字節(jié)代碼(如在classes.dex
中)轉(zhuǎn)換為可讀源代碼的工具。
將字節(jié)碼轉(zhuǎn)換為可讀文件的一種方法,是使用一個(gè)名為 dex2jar 的工具。 .dex
文件是由 Java 字節(jié)碼轉(zhuǎn)換的 Dalvik 字節(jié)碼,使其對(duì)移動(dòng)平臺(tái)優(yōu)化和高效。 這個(gè)免費(fèi)的工具只是將 Android 應(yīng)用程序中存在的.dex
文件轉(zhuǎn)換為相應(yīng)的.jar
文件。 請(qǐng)遵循以下步驟:
從
https://code.google.com/p/dex2jar/
下載 dex2jar 工具。現(xiàn)在我們可以使用它來運(yùn)行我們的應(yīng)用程序的
.dex
文件,并轉(zhuǎn)換為.jar
格式。-
現(xiàn)在,我們需要做的是,轉(zhuǎn)到命令提示符并訪問 dex2jar 所在的文件夾。 接下來,我們需要運(yùn)行
d2j-dex2jar.bat
文件(在 Windows 上)或d2j-dex2jar.sh
文件(在 Linux / Mac 上),并提供應(yīng)用程序名稱和路徑作為參數(shù)。 這里的參數(shù)中,我們可以簡(jiǎn)單地使用.apk
文件,或者我們甚至可以解壓縮.apk
文件,然后傳遞classes.dex
文件,如下面的截圖所示:正如我們?cè)谏厦娼貓D中看到的,dex2jar 已經(jīng)成功地將應(yīng)用程序的
.dex
文件轉(zhuǎn)換為名為helloworld-dex2jar.jar
的.jar
文件。 現(xiàn)在,我們可以在任何 Java 圖形查看器(如 JD-GUI)中打開此.jar
文件,JD-GUI 可以從其官方網(wǎng)站http://jd.benow.ca/
下載。 -
一旦我們下載并安裝 JD-GUI,我們現(xiàn)在可以繼續(xù)打開它。 它看起來像下面的截圖所示:
-
在這里,我們現(xiàn)在可以打開之前步驟中轉(zhuǎn)換的
.jar
文件,并查看 JD-GUI 中的所有 Java 源代碼。 為了打開.jar
文件,我們可以簡(jiǎn)單地訪問File | Open
。
在右側(cè)窗格中,我們可以看到 Java 應(yīng)用程序的 Java 源代碼和所有方法。 請(qǐng)注意,重新編譯過程會(huì)為你提供原始 Java 源代碼的近似版本。 這在大多數(shù)情況下無關(guān)緊要; 但是,在某些情況下,你可能會(huì)看到轉(zhuǎn)換的.jar
文件中缺少某些代碼。 此外,如果應(yīng)用程序開發(fā)人員使用一些防止反編譯的保護(hù),如 proguard 和 dex2jar,當(dāng)我們使用 dex2jar 或 Apktool 反編譯應(yīng)用程序時(shí),我們不會(huì)看到準(zhǔn)確的源代碼; 相反,我們將看到一堆不同的源文件,這不是原始源代碼的準(zhǔn)確表示。
3.3 使用 Apktool 逆向 Android 應(yīng)用
另一種逆向 Android應(yīng)用程序的方法是將.dex
文件轉(zhuǎn)換為 smali 文件。 smali 是一種文件格式,其語(yǔ)法與稱為 Jasmine 的語(yǔ)言類似。我們現(xiàn)在不會(huì)深入了解 smali 文件格式。有關(guān)更多信息,請(qǐng)參閱在線 wikihttps://code.google.com/p/smali/wiki/
,以便深入了解 smali。
一旦我們下載 Apktool 并配置它,按照前面的章節(jié)的指示,我們都做好了進(jìn)一步的準(zhǔn)備。 與 JD-GUI 相比,Apktool 的主要優(yōu)點(diǎn)是它是雙向的。這意味著如果你反編譯一個(gè)應(yīng)用程序并修改它,然后使用 Apktool 重新編譯它,它能跟完美重新編譯,并生成一個(gè)新的.apk
文件。然而,dex2jar 和 JD-GUI 不能做類似功能,因?yàn)樗峁┙拼a,而不是準(zhǔn)確的代碼。
因此,為了使用 Apktool 反編譯應(yīng)用程序,我們所需要做的是,將.apk
文件與 Apktool 二進(jìn)制文件一起傳遞給命令行。一旦反編譯完成,Apktool 將使用應(yīng)用程序名稱創(chuàng)建一個(gè)新的文件夾,其中會(huì)存儲(chǔ)所有的文件。為了反編譯,我們只需調(diào)用apktool d [app-name].apk
。這里,-d
標(biāo)志表示反編譯。
在以下屏幕截圖中,我們可以看到使用 Apktool 進(jìn)行反編譯的應(yīng)用程序:
現(xiàn)在,如果我們進(jìn)入 smali 文件夾,我們將看到一堆不同的 smali 文件,它們包含開發(fā)應(yīng)用程序時(shí)編寫的 Java 類的代碼。在這里,我們還可以打開一個(gè)文件,更改一些值,并使用 Apktool 再次構(gòu)建它。為了從 smali 構(gòu)建一個(gè)改動(dòng)的應(yīng)用程序,我們將使用 Apktool 中的b
(build)標(biāo)志。
apktool b [decompiled folder name] [target-app-name].apk
但是,為了反編譯,修改和重新編譯應(yīng)用程序,我個(gè)人建議使用另一個(gè)名為 Virtuous Ten Studio(VTS)的工具。這個(gè)工具提供與 Apktool 類似的功能,唯一的區(qū)別是 VTS 提供了一個(gè)漂亮的圖形界面,使其相對(duì)容易使用。此工具的唯一限制是,它只在 Windows 環(huán)境中運(yùn)行。我們可以從官方下載鏈接http://www.virtuous-ten-studio.com/
下載 VTS。以下是反編譯同一項(xiàng)目的應(yīng)用程序的屏幕截圖:
3.4 審計(jì) Android 應(yīng)用
Android 應(yīng)用程序通常包含許多安全漏洞,大多數(shù)時(shí)候是由于開發(fā)人員的錯(cuò)誤和安全編碼實(shí)踐的無視。 在本節(jié)中,我們將討論基于 Android 應(yīng)用程序的漏洞,以及如何識(shí)別和利用它們。
內(nèi)容供應(yīng)器泄露
許多應(yīng)用程序使用內(nèi)容供應(yīng)器來存儲(chǔ)和查詢應(yīng)用程序中的數(shù)據(jù)或來自電話的數(shù)據(jù)。 除非已經(jīng)定義了內(nèi)容提供者可以使用權(quán)限來訪問,否則任何其他應(yīng)用都可以使用應(yīng)用所定義的內(nèi)容供應(yīng)器,來訪問應(yīng)用的數(shù)據(jù)。 所有內(nèi)容供應(yīng)器具有唯一的統(tǒng)一資源標(biāo)識(shí)符(URI)以便被識(shí)別和查詢。 內(nèi)容提供者的 URI 的命名標(biāo)準(zhǔn)慣例是以content://
開始。
如果 Android API 版本低于 17,則內(nèi)容供應(yīng)器的默認(rèn)屬性是始終導(dǎo)出。 這意味著除非開發(fā)人員指定權(quán)限,否則任何應(yīng)用程序都可以使用應(yīng)用程序的內(nèi)容供應(yīng)器,來訪問和查詢數(shù)據(jù)。 所有內(nèi)容供應(yīng)器都需要在AndroidManifest.xml
中注冊(cè)。 因此,我們可以對(duì)應(yīng)用程序使用 Apktool,并通過查看AndroidManifest.xml
文件檢查內(nèi)容供應(yīng)器。
定義內(nèi)容供應(yīng)器的一般方法如下所示:
<provider
android:name="com.test.example.DataProvider"
android:authorities ="com.test.example.DataProvider">
</provider>
所以現(xiàn)在,我們將舉一個(gè)漏洞應(yīng)用程序的例子,并嘗試?yán)脙?nèi)容供應(yīng)器泄漏漏洞:
為了反編譯應(yīng)用程序,我們將使用 Apktool 來使用
apktool d [appname].apk
反編譯應(yīng)用程序。-
為了找到內(nèi)容供應(yīng)器,我們可以簡(jiǎn)單地查看定義它們的
AndroidManifest.xml
文件,或者我們可以使用一個(gè)簡(jiǎn)單的grep
命令,從應(yīng)用程序代碼中獲取內(nèi)容供應(yīng)器,如下所示: -
我們可以使用
grep
命令來查找內(nèi)容提供者,使用grep –R 'content://'
。 此命令將在每個(gè)子文件夾和文件中查找內(nèi)容供應(yīng)器,并將其返回給我們。 -
現(xiàn)在,我們?cè)谀M器中安裝應(yīng)用程序。 為了查詢內(nèi)容供應(yīng)器并確認(rèn)漏洞是可利用的,我們需要在 Android 設(shè)備或模擬器中安裝該應(yīng)用程序。 使用以下代碼,我們將在設(shè)備上安裝易受攻擊的
app.apk
文件:$ adb install vulnerable-app.apk 1869 KB/s (603050 bytes in 0.315s) pkg: /data/local/tmp/vulnerable-app.apk Success
-
我們可以通過創(chuàng)建另一個(gè)沒有任何權(quán)限的應(yīng)用程序來查詢內(nèi)容供應(yīng)器,然后查詢漏洞應(yīng)用程序的內(nèi)容供應(yīng)器。 為了快速獲得信息,我們還可以使用
adb
查詢內(nèi)容供應(yīng)器,我們可以在以下命令中看到:adb shell content query - - uri [URI of the content provider]
以下是在漏洞應(yīng)用程序上運(yùn)行的命令,輸出展示了存儲(chǔ)在應(yīng)用程序中的注釋:
在這里,我們還可以使用 MWR 實(shí)驗(yàn)室的另一個(gè)名為 Drozer 的工具,以便在 Android 應(yīng)用程序中找到泄漏的內(nèi)容供應(yīng)器漏洞。 我們可以從官方網(wǎng)站
https://labs.mwrinfosecurity.com/tools/drozer/
下載并安裝 Drozer。 -
一旦我們安裝了它,我們需要將代理組件
agent.apk
安裝到我們的模擬器,它位于下載的.zip
文件內(nèi)。 該代理是系統(tǒng)和設(shè)備相互交互所需的。 我們還需要在每次啟動(dòng)模擬器時(shí)轉(zhuǎn)發(fā)一個(gè)特定的端口(31415
),以便建立連接。 要在 Mac 和其他類似平臺(tái)上安裝設(shè)備,我們可以按照https://www.mwrinfosecurity.com/system/assets/559/original/mwri_drozer-users-guide_2013-09-11.pdf
上提供的在線指南。 -
一旦完成,我們可以啟動(dòng)應(yīng)用程序,并單擊"Embedded Server(嵌入式服務(wù)器)"文本。 從那里,我們需要回到設(shè)備,啟動(dòng) Drozer 應(yīng)用程序,并通過單擊名為 Disabled 的左上角切換按鈕啟用服務(wù)器。
-
此后,我們需要訪問終端并啟動(dòng) Drozer,并將其連接到模擬器/設(shè)備。 為此,我們需要輸入
drozer console connect
,如下面的截圖所示: -
在這里,我們可以運(yùn)行
app.provider.finduri
模塊來查找所有內(nèi)容供應(yīng)器,如下所示:dz> run app.provider.finduri com.threebanana.notes Scanning com.threebanana.notes… content://com.threebanana.notes.provider.NotePad/notes content://com.threebanana.notes.provider.NotePadPending/notes/ content://com.threebanana.notes.provider.NotePad/media content://com.threebanana.notes.provider.NotePad/topnotes/ content://com.threebanana.notes.provider.NotePad/media_with_owner/ content://com.threebanana.notes.provider.NotePad/add_media_for_note content://com.threebanana.notes.provider.NotePad/notes_show_deleted content://com.threebanana.notes.provider.NotePad/notes_with_images/
-
一旦我們有了 URI,我們現(xiàn)在可以使用 Drozer 應(yīng)用程序查詢它。 為了查詢它,我們需要運(yùn)行
app.provider.query
模塊并指定內(nèi)容供應(yīng)器的 URI,如下面的截圖所示:如果 Drozer 能夠查詢和顯示來自內(nèi)容供應(yīng)器的數(shù)據(jù),這意味著內(nèi)容供應(yīng)器泄漏數(shù)據(jù)并且存在漏洞,因?yàn)?Drozer 沒有被明確地授予使用數(shù)據(jù)集的任何權(quán)限。
為了修復(fù)此漏洞,開發(fā)人員需要做的是,在創(chuàng)建內(nèi)容供應(yīng)器時(shí)指定參數(shù)
android:exported = false
,或者創(chuàng)建一些新的權(quán)限,另一個(gè)應(yīng)用程序在訪問供應(yīng)器之前必須請(qǐng)求它。
3.5 不安全的文件存儲(chǔ)
通常,開發(fā)人員為應(yīng)用程序存儲(chǔ)數(shù)據(jù)時(shí),未指定文件的正確文件權(quán)限。 這些文件有時(shí)被標(biāo)記為全局可讀,并且可以由任何其它應(yīng)用程序訪問而不需要請(qǐng)求權(quán)限。
為了檢查這個(gè)漏洞,我們所需要做的是訪問adb shell
,之后使用cd
進(jìn)入/data/data/[package name of the app]
。
如果我們?cè)谶@里執(zhí)行一個(gè)簡(jiǎn)單的ls -l
,就可以看到文件和文件夾的文件權(quán)限:
# ls -l /data/data/com.aditya.example/files/userinfo.xml
-rw-rw-rw- app_200 app_200 22034 2013-11-07 00:01 userinfo.xml
這里我們可以使用find
來搜索權(quán)限。
find /data/data/ -perm [permissions value]
如果我們執(zhí)行cat userinfo.xml
,它儲(chǔ)存了應(yīng)用的用戶的用戶名和密碼。
#grep 'password' /data/data/com.aditya.example/files/userinfo.xml
<password>mysecretpassword</password>
這意味著任何其他應(yīng)用程序也可以查看和竊取用戶的機(jī)密登錄憑據(jù)。 可以通過在開發(fā)應(yīng)用程序時(shí)指定正確的文件權(quán)限,以及一起計(jì)算密碼與鹽的散列來避免此漏洞。
目錄遍歷或本地文件包含漏洞
顧名思義,應(yīng)用程序中的路徑遍歷漏洞允許攻擊者使用漏洞應(yīng)用程序的供應(yīng)器讀取其他系統(tǒng)文件。
此漏洞也可以使用我們之前討論的工具 Drozer 進(jìn)行檢查。 在這里,我們用例子來說明由 Seafastian Guerrero 發(fā)現(xiàn)的 Adobe Reader Android 應(yīng)用程序漏洞(http://blog.seguesec.com/2012/09/path-traversal-vulnerability-on-adobe-reader-android-application
)。 此漏洞存在于 Adobe Reader 10.3.1 中,并在以后的版本中進(jìn)行了修補(bǔ)。 你可以從http://androiddrawer.com
下載各種 Android 應(yīng)用程序的舊版本。
我們將啟動(dòng) Drozer,并運(yùn)行app.provider.finduri
模塊來查找內(nèi)容供應(yīng)器 URI。
dz> run app.provider.finduri com.adobe.reader
Scanning com.adobe.reader...
content://com.adobe.reader.fileprovider/
content://com.adobe.reader.fileprov
一旦我們找到了 URI,我們現(xiàn)在可以使用app.provider.read
搜索并利用本地文件包含漏洞。 在這里,我嘗試從系統(tǒng)中讀取一些文件,如/etc/hosts
和/proc/cpuinfo
,它們默認(rèn)存在于所有的 Android 實(shí)例中,因?yàn)樗腔?Linux 的文件系統(tǒng)。
dz> run app.provider.read content://com.adobe.reader.fileprovider/../../../../etc/hosts
127.0.0.1 localhost
正如我們?cè)谙旅娴钠聊唤貓D中看到的,我們已經(jīng)成功地使用 Adobe Reader 漏洞內(nèi)容供應(yīng)器讀取了 Android 文件系統(tǒng)中的文件。
客戶端注入攻擊
客戶端攻擊通常發(fā)生在應(yīng)用程序未檢查用戶輸入的時(shí)候。 例如,在對(duì) SQLite 數(shù)據(jù)庫(kù)的查詢期間,應(yīng)用程序正在解析用戶輸入,因?yàn)樗挥诓樵冋Z(yǔ)句中。
讓我們舉一個(gè)應(yīng)用程序的示例,它檢查本地 SQLite 數(shù)據(jù)庫(kù),來根據(jù)登錄憑據(jù)驗(yàn)證用戶。 因此,當(dāng)用戶提供用戶名和密碼時(shí),正在運(yùn)行的查詢將如下所示:
SELECT * FROM 'users' where username='user-input-username' and password='user-input-password'
現(xiàn)在,在正常情況下,這將正常工作,用戶輸入其真正的登錄憑據(jù),并且查詢?nèi)Q于條件將返回true
或false
。
SELECT * FROM 'users' where username='aditya' and password='mysecretpass
但是,如果攻擊者輸入 SQL 語(yǔ)句而不是正常的用戶名怎么辦? 請(qǐng)參考以下代碼:
SELECT * FROM 'users' where username='1' or '1' = '1' - - and password='mysecretpassword
因此,在這種情況下,即使用戶不知道用戶名和密碼,他們可以通過使用1'or'1'='1
查詢來輕松繞過它,這在所有情況下都返回true
。 因此,應(yīng)用程序開發(fā)人員必須在應(yīng)用程序中進(jìn)行適當(dāng)?shù)臋z查,來檢查用戶輸入。
我們還可以使用 Drozer 的app.provider.query
來利用 SQL 注入漏洞。 其語(yǔ)法看起來像:
run app.provider.query [Content Provider URI] --projection "* FROM SQLITE_MASTER WHERE type='table';- -"
現(xiàn)在,這將返回 SQLite 數(shù)據(jù)庫(kù)中整個(gè)表的列表,它的信息存儲(chǔ)在SQLITE_MASTER
中。 您還可以繼續(xù)并執(zhí)行更多的 SQL 查詢,來從應(yīng)用程序提取更多的信息。 為了使用 Drozer 實(shí)戰(zhàn)漏洞利用,你可以從https://www.mwrinfosecurity.com/products/drozer/community-edition/
下載他們的漏洞應(yīng)用程序。
3.6 OWASP 移動(dòng) Top10
Web 應(yīng)用程序開放安全項(xiàng)目(OWASP)是涉及安全和漏洞搜索的標(biāo)準(zhǔn)之一。 它還發(fā)布了前 10 名漏洞的列表,其中包括在各種平臺(tái)中最常見和重要的漏洞。
可以在https://www.owasp.org/index.php/Projects/OWASP_Mobile_Security_Project_-_Top_Ten_Mobile_Risks
上找到 OWASP 移動(dòng)版的前 10 個(gè)指南。 如果我們查看 OWASP 移動(dòng)項(xiàng)目,以下是它涵蓋的移動(dòng)應(yīng)用程序的 10 個(gè)安全問題:
- 服務(wù)端弱控制
- 不安全的數(shù)據(jù)存儲(chǔ)
- 傳輸層保護(hù)不足
- 意外的數(shù)據(jù)泄漏
- 缺少授權(quán)和認(rèn)證
- 無效的加密
- 客戶端注入
- 通過不可信輸入的安全決策
- 不正確的會(huì)話處理
- 缺乏二進(jìn)制保護(hù)
讓我們逐一介紹它們,并快速了解它們?cè)谝苿?dòng)應(yīng)用程序中的關(guān)系,以及我們?nèi)绾螜z測(cè)它們:
服務(wù)端弱控制
第一個(gè) OWASP 漏洞是服務(wù)端弱控制,顧名思義,服務(wù)端不以安全的方式將數(shù)據(jù)從移動(dòng)應(yīng)用程序發(fā)送到服務(wù)端,或者在發(fā)送數(shù)據(jù)時(shí)暴露一些敏感的 API。 例如,考慮一個(gè) Android 應(yīng)用程序發(fā)送登錄憑據(jù)到服務(wù)器進(jìn)行身份驗(yàn)證,而不驗(yàn)證輸入。 攻擊者可以以這樣的方式修改憑證,以便訪問服務(wù)器的敏感或未授權(quán)區(qū)域。 此漏洞可視為移動(dòng)應(yīng)用程序和 Web 應(yīng)用程序中的一個(gè)漏洞。
不安全的數(shù)據(jù)存儲(chǔ)
這僅僅意味著,應(yīng)用相關(guān)信息以用戶可訪問的方式在設(shè)備上存儲(chǔ)。 許多 Android 應(yīng)用程序在共享首選項(xiàng),SQLite(純文本格式)或外部存儲(chǔ)器中,存儲(chǔ)與用戶相關(guān)的私密信息或應(yīng)用程序信息。 開發(fā)人員應(yīng)該始終記住,即使應(yīng)用程序在數(shù)據(jù)文件夾(/data/data/package-name
)中存儲(chǔ)敏感信息,只要手機(jī)已 root,惡意應(yīng)用程序/攻擊者就可以訪問它。
傳輸層保護(hù)不足
許多 Android 開發(fā)人員依賴于通過不安全模式的網(wǎng)絡(luò)來發(fā)送數(shù)據(jù),例如 HTTP 或沒有正確實(shí)現(xiàn) SSL 的形式。 這使得應(yīng)用程序易受到網(wǎng)絡(luò)上發(fā)生的所有不同類型的攻擊,例如流量攔截,從應(yīng)用程序向服務(wù)器發(fā)送數(shù)據(jù)時(shí)操縱參數(shù),以及修改響應(yīng)來訪問應(yīng)用程序的鎖定區(qū)域。
意外的數(shù)據(jù)泄漏
當(dāng)應(yīng)用程序?qū)?shù)據(jù)存儲(chǔ)在本身易受攻擊的位置時(shí),會(huì)出現(xiàn)此漏洞。 這些可能包括剪貼板,URL 緩存,瀏覽器 Cookie,HTML5DataStorage
,統(tǒng)計(jì)數(shù)據(jù)等。 一個(gè)例子是用戶登錄到他們的銀行應(yīng)用程序,他們的密碼已經(jīng)復(fù)制到剪貼板。 現(xiàn)在,即使是惡意應(yīng)用程序也可以訪問用戶剪貼板中的數(shù)據(jù)。
缺少授權(quán)和認(rèn)證
如果 Android 應(yīng)用程序或一般的移動(dòng)應(yīng)用程序在沒有適當(dāng)安全措施的情況下,嘗試基于客戶端檢查來驗(yàn)證或授權(quán)用戶,則這些應(yīng)用程序最容易受到攻擊。 應(yīng)該注意的是,一旦手機(jī)已 root,大多數(shù)客戶端保護(hù)可以被攻擊者繞過。 因此,建議應(yīng)用程序開發(fā)人員使用服務(wù)器端身份驗(yàn)證和授權(quán)進(jìn)行適當(dāng)?shù)臋z查,一旦驗(yàn)證成功,請(qǐng)使用隨機(jī)生成的令牌,以便在移動(dòng)設(shè)備上驗(yàn)證用戶。
無效的加密
這僅僅表示使用不安全的密碼函數(shù)來加密數(shù)據(jù)部分。 這可能包括一些已知存在漏洞的算法,如 MD5,SHA1,RC2,甚至是沒有適當(dāng)?shù)陌踩胧┑亩ㄖ扑惴ā?/p>
客戶端注入
這在Android應(yīng)用程序中是可行的,主要成因是使用 SQLite 進(jìn)行數(shù)據(jù)存儲(chǔ)。 我們將在本書的各章中執(zhí)行注入攻擊。
通過不可信輸入的安全決策
在移動(dòng)應(yīng)用程序中,開發(fā)人員應(yīng)始終過濾和驗(yàn)證用戶提供的輸入或其他相關(guān)輸入,并且不應(yīng)該像在應(yīng)用程序中那樣使用它們。 不受信任的輸入通常會(huì)導(dǎo)致應(yīng)用程序中的其他安全風(fēng)險(xiǎn),如客戶端注入。
不正確的會(huì)話處理
在為移動(dòng)應(yīng)用程序執(zhí)行會(huì)話處理時(shí),開發(fā)人員需要處理很多因素,例如認(rèn)證 cookie 的正常過期,安全令牌創(chuàng)建,cookie 生成和輪換,以及無法使后端的會(huì)話無效。 必須在 Web 應(yīng)用程序和 Android 應(yīng)用程序之間維護(hù)正確的安全同步。
缺乏二進(jìn)制保護(hù)
這意味著不能正確地防止應(yīng)用程序被逆向或反編譯。 諸如 Apktool 和 dex2jar 之類的工具可用于逆向 Android 應(yīng)用程序,如果沒有遵循正確的開發(fā)實(shí)踐,它會(huì)暴露應(yīng)用程序的各種安全風(fēng)險(xiǎn)。 為了防止通過逆向攻擊來分析應(yīng)用程序,開發(fā)人員可以使用 ProGuard 和 DashO 等工具。
總結(jié)
在本章中,我們學(xué)習(xí)了使用各種方法來逆轉(zhuǎn) Android 應(yīng)用程序并分析源代碼。 我們還學(xué)習(xí)了如何修改源代碼,然后重新編譯應(yīng)用程序,來繞過某些保護(hù)。 此外,我們還看到了如何使用 Drozer 等工具尋找 Android 應(yīng)用程序中的漏洞。 你還可以通過http://labs.securitycompass.com/exploit-me/
親自嘗試 Exploit-Me 實(shí)驗(yàn)室中的各種漏洞,它由 Security Compass 開發(fā)。
在下一章中,我們將進(jìn)一步嘗試 Android 應(yīng)用程序的流量攔截,并在我們的滲透測(cè)試中使用它。