一、 安卓應用攻擊概覽
1. 安卓應用簡介
根據開發方式的不同,安卓應用大致分為三種。Web應用、原生應用、混合應用
Web應用
Web應用是通過使用JavaScript、HTML5等Web技術來實現交互、導航以及個性化功能的。Web應用可以在移動設備的Web瀏覽器中運行,並通過向后台服務器請求Web頁面來進 行渲染。一個應用可以有瀏覽器渲染的版本,也可以有作為獨立應用的版本,這種現象很常見, 因為這樣可以避免重復開發。
原生應用
不同於Web應用,原生應用具有優良的性能和高度的可靠性。原生應用不需要從服務器獲取 支持,而且還能利用安卓系統提供的高速本地支持,所以原生應用的響應速度很快。另外,用戶 不連接網絡也能使用某些應用。但是,使用原生技術開發的應用不能夠跨平台,只能使用某一特 定平台進行開發。所以,一些企業開始尋求能夠避免重復工作的跨平台移動應用開發解決方案。
混合應用
混合應用嘗試綜合利用原生應用和Web應用的優點,使用Web技術(HTML5、CSS和 JavaScript)編寫,像原生應用一樣在設備上運行。混合應用在原生容器中運行,利用設備的瀏覽 器引擎(不是瀏覽器)在本地渲染HTML,並處理JavaScript。混合應用能夠通過一個從Web應用 到原生應用的抽象層訪問設備上的接口,如加速器、攝像頭以及本地存儲等,而Web應用則不能 訪問這些接口。混合應用通常使用PhoneGap、React Native等框架進行開發。
2. 理解應用攻擊面
移動應用架構
社交類、銀行類、娛樂類等移動應用具有很多需要使用網絡通信的功能,所以,如今的大部 分移動應用都采用常見的客戶端——服務器架構。想要了解這類應用的攻擊面,需要 充分考慮應用的各個方面,包括客戶端、后端API、服務器漏洞以及數據庫等。這些地方的任何 一個入口都有可能對整個應用或應用數據造成威脅。
在開發軟件時,建議遵循安全軟件開發生命周期(SDLC)流程。很多企業都采用安全軟 件開發生命周期,從而保證軟件開發生命周期中每一個階段的安全性。
客戶端存在的威脅
靜態應用數據
隨着移動應用的出現,在客戶端存儲數據的概念被廣泛采用。很多移動 應用在設備上存儲未經加密的敏感數據,這是移動應用存在的主要問題之一。這些數據 可能是敏感的、機密的或者私人的。有多種方法可以利用設備上的數據,擁有設備物理 訪問權限的攻擊者幾乎可以輕而易舉地竊取這些數據。如果設備已經ROOT過了或者越獄 了,那么惡意應用就可能竊取這些數據。所以,我們必須要確保應用不在設備上存儲用 戶名、密碼、認證標記、信用卡號碼等敏感數據。如果不得不存儲這些數據,就必須將 其加密,謹防被攻擊者竊取。
傳輸中的應用數據
需要與后台進行通信的移動應用極易受到攻擊,攻擊者想要竊取傳 輸中的數據。終端用戶經常連接咖啡店和機場的公用網絡,而此時攻擊者就可能使用burp 代理、 MITM代理、SSL MitM代理等工具竊取數據。
代碼漏洞
不具有安全措施的移動應用在遭受各種攻擊時會變得脆弱不堪。應用中的編 碼錯誤會導致嚴重的漏洞,進而影響用戶數據和應用數據安全。包括導出的內容提供程序、導出的activity、客戶端注入,等等。攻擊場景包括擁有設備物理訪問權限的攻擊者可能竊取另一個用戶的會話,設備中的惡意應用可以讀取其他應用中由於編碼錯誤而暴露的數據,能訪問應用二進制數據的攻擊者可能會對應用進行反編譯,從而查看源代碼中硬編碼的證書。
應用數據泄漏
幾乎所有平台的移動應用都存在這一個問題。應用可能會無意間將敏感數據泄漏給攻擊者,開發者需要格外注意這一點。開發人員需要移除在開發階段中用於打印日志的代碼,還必須保證沒有容易泄漏的數據。這是因為應用沙盒不適用於這一類型中的某些攻擊。譬如,用戶從應用中復制了像安全問題答案之類的敏感數據,這些數據就會被存放在設備的剪貼板上,而剪貼板並不在沙盒中。設備上的其他應用不需要知道之前的應用,就可以讀取這些數據。
平台問題
為移動應用設計威脅模型時,考慮針對該應用運行平台的威脅很重要。以安卓平台為例,面向安卓平台開發的原生應用很容易被反編譯,而且很容易查看Java源代碼。 這樣,攻擊者就能查看應用的源代碼以及代碼中被硬編碼的敏感數據。此外,攻擊者還能修改應用代碼,然后重新編譯,並把應用發布到第三方應用市場上。如果應用是敏感應用或者付費應用,那么就必須對應用進行完整性檢查。雖然上述問題對iOS這樣的系統影響相對較小,但如果設備越獄了,那么也會存在系統方面的問題。
后端存在的威脅
身份驗證與授權
在后端API開發中,開發人員經常創建自定義身份驗證。在身份驗證與授權中可能存在與之相關的漏洞。
會話管理
移動平台通常使用身份驗證令牌來管理會話。用戶首次登錄后,會得到一個身份驗證令牌,這個令牌在接下來的會話中都會用到。如果身份驗證令牌在銷毀前沒有得到妥善保護,這就有可能導致一次攻擊。只在客戶端結束會話,而服務器沒有結束回話,這是移動應用另一個常見的問題。
輸入驗證
輸入驗證是應用中已知的常見問題。如果不進行輸入驗證,可能會存在SQL 注入、命令注入以及跨站腳本攻擊等風險。
錯誤處理不當
應用錯誤對攻擊者很有吸引力。如果錯誤處理不當,而API針對特定的請求拋出數據庫異常或服務器異常,那么攻擊者就可能利用這些錯誤進行巧妙的攻擊。
脆弱的加密方法
加密是開發者在開發過程中另一個經常犯錯的地方。雖然各個平台都支持通過加密的方法來保證數據安全,但密鑰管理是客戶端存在的主要問題。同樣,也需要安全地存儲后台數據。
數據庫攻擊
攻擊者有可能在未經授權的情況下直接訪問數據庫。例如,如果沒有強認證保護,攻擊者有可能在未經授權情況下訪問phpMyAdmin等工具數據庫控制台, 另一個例子就是訪問未授權的MongoDB控制台,因為MongoDB默認不需要任何認證就能訪問它的控制台。
3. 移動應用測試與安全指南
OWASP移動應用十大風險
服務端弱控制
第一個 OWASP 漏洞是服務端弱控制,顧名思義,服務端不以安全的方式將數據從移動應用程序發送到服務端,或者在發送數據時暴露一些敏感的 API,常見的攻擊向量包括找出暴露的API入口,查找各種漏洞,利用配置錯誤的服務器等。 例如,考慮一個 Android 應用程序發送登錄憑據到服務器進行身份驗證,而不驗證輸入。攻擊者可以以這樣的方式修改憑證,以便訪問服務器的敏感或未授權區域。此漏洞可視為移動應用程序和 Web 應用程序中的一個漏洞。
不安全的數據存儲
這僅僅意味着,應用相關信息以用戶可訪問的方式在設備上存儲。 許多 Android 應用程序在共享首選項,SQLite(純文本格式)或外部存儲器中,存儲與用戶相關的私密信息或應用程序信息。 開發人員應該始終記住,即使應用程序在數據文件夾(/data/data/package-name
)中存儲敏感信息,只要手機已 root,惡意應用程序/攻擊者就可以訪問它。
傳輸層保護不足
許多 Android 開發人員依賴於通過不安全模式的網絡來發送數據,例如 HTTP 或沒有正確實現 SSL 的形式。 這使得應用程序易受到網絡上發生的所有不同類型的攻擊,例如流量攔截,從應用程序向服務器發送數據時操縱參數,以及修改響應來訪問應用程序的鎖定區域。
意外的數據泄漏
當應用程序將數據存儲在本身易受攻擊的位置時,會出現此漏洞。 這些可能包括剪貼板,URL 緩存,瀏覽器 Cookie,HTML5DataStorage
,統計數據等。 一個例子是用戶登錄到他們的銀行應用程序,他們的密碼已經復制到剪貼板。 現在,即使是惡意應用程序也可以訪問用戶剪貼板中的數據。
缺少授權和認證
如果 Android 應用程序或一般的移動應用程序在沒有適當安全措施的情況下,嘗試基於客戶端檢查來驗證或授權用戶,則這些應用程序最容易受到攻擊。 應該注意的是,一旦手機已 root,大多數客戶端保護可以被攻擊者繞過。 因此,建議應用程序開發人員使用服務器端身份驗證和授權進行適當的檢查,一旦驗證成功,請使用隨機生成的令牌,以便在移動設備上驗證用戶。
無效的加密
這僅僅表示使用不安全的密碼函數來加密數據部分。 這可能包括一些已知存在漏洞的算法,如 MD5,SHA1,RC2,甚至是沒有適當的安全措施的定制算法。
客戶端注入
這在Android應用程序中是可行的,主要成因是使用 SQLite 進行數據存儲。客戶端注入的結果是,可以通過應用在移動設備上執行惡意代碼。通常,惡意代碼通過不同的方式借助威脅代理輸入到移動應用中。
下面是安卓應用中客戶端注入攻擊的一些例子:
WebView注入;
通過原始SQL語句對SQLite數據庫進行傳統的SQL注入;
內容提供程序SQL注入;
內容提供程序路徑遍歷。
通過不可信輸入的安全決策
開發者應該假設未授權的用戶可以通過不正確的輸入過度使用應用的敏感功能。特別是安卓 平台,攻擊者可以攔截調用(進程間通信或Web服務調用),並篡改其中的敏感參數。不能實現 這類功能就會導致應用產生錯誤,甚至讓攻擊者獲得更高的權限。使用不正確的Intent調用敏感 的activity 就是例子之一。
不正確的會話處理
移動應用使用諸如SOAP或REST一類的協議來連接服務器。它們都是無狀態協議,當移動客 戶端應用使用這些協議時,客戶端會在身份驗證完成后從服務器獲得一個令牌。用戶在會話期間將會使用這個令牌,OWASP的“會話處理不當”就是指攻擊和保護這些會話。這個令牌在客戶端失效后,卻沒有服務器上失效,這是移動應用的一個常見問題。通常,應用收到的這個令牌會通 過共享首選項或SQLite數據庫存放在客戶端的文件系統中。一旦惡意用戶獲得了這個令牌,而服務器沒有及時讓這個令牌失效,那么他就可以隨時使用這個令牌。其他可能出現的情況包括會話 超時、弱令牌創建以及過期令牌等
缺乏二進制保護
這意味着不能正確地防止應用程序被逆向或反編譯。 諸如 Apktool 和 dex2jar 之類的工具可用於逆向 Android 應用程序,如果沒有遵循正確的開發實踐,它會暴露應用程序的各種安全風險。 為了防止通過逆向攻擊來分析應用程序,開發人員可以使用 ProGuard 和 DashO 等工具。
自動化工具
Drozer 和Quark是兩款可能會在安卓應用評估中使用到的工具。
Drozer工具
Drozer是一個由MWR實驗室開發的安卓安全評估框架。,Drozer是用於安卓安 全評估的最佳工具。根據Drozer的官方文檔介紹,“Drozer可以把你當作一款安卓應用,通過安卓 的進程間通信機制和操作系統與其他應用進行交互。
Drozer是交互式的。用戶使用Drozer進 行安全評估時,需要在工作站控制台運行命令,然后Drozer把這些命令發送給設備的代理,進而執行相關任務。
Drozer相關命令
模塊 作用
auxiliary.webcontentresolver 開啟web服務來獲取content providers
exploit.jdwp.check 針對@jdwp-control漏洞
exploit.pilfer.general.apnprovider 獲取APN信息
exploit.pilfer.general.settingsprovider 查看系統設置
information.datetime 查看設備時間
information.deviceinfo 獲取設備詳細信息
information.permissions 列出所有手機應用使用過的權限信息
scanner.activity.browsable 獲取可以從瀏覽器查看的activity
scanner.misc.native 列出包含native的包
scanner.misc.readablefiles 查找可被其應用讀取的文件
scanner.misc.secretcodes 查找手機暗碼
scanner.misc.writablefiles 查找能被其他應用寫數據權限的文件
scanner.provider.finduris 查找content providers URI鏈接
scanner.provider.injection 查找content providers SQL注入
scanner.provider.sqltables 通過SQL注入查找表名
scanner.provider.traversal 查找目錄遍歷漏洞
shell.exec 執行單條shell命令
shell.send 發送ASH shell到遠程監聽器
shell.start 進入shell模式
tools.file.download 下載手機上的文件
tools.file.md5sum 獲取文件的md5
tools.file.size 獲取文件大小
tools.file.upload 從PC上傳文件到設備
tools.setup.busybox 安裝Busybox
tools.setup.minimalsu 安裝minimal-su
4. 識別攻擊界面
Sieve是測試APP。
如上圖所示,sieve應用有三個導出的activity。現在,我們需要找出這三個activity的名字, 並確認它們是否屬於敏感的activity。我們可以使用現有的Drozer模塊來進行進一步查找它。這個應用是可以調試的,這意味着我們可以把這個進程連接到調試器上,逐一地調試每一條指令,甚至可以在這個進程上運行任意的代碼。
使用 Drozer識別並利用安卓應用漏洞
為了識別當前軟件包中activity的名稱,我們可以使用下面的命令。
dz> run app.activity.info -a [包名]
在前面的圖中,我們可以查看目標應用中的activity列表。
使用Drozer來嘗試啟動它。
dz> run app.activity.start --component [包名] [組件名]
在模擬器可以看到sieve主界面。
很明顯,我們繞過了用於登錄應用的身份驗證。
二、 數據存儲與安全
1. 什么是數據存儲
安卓使用了類似Unix中的文件系統來進行本地數據存儲,用到的文件系統有十幾種,如 FAT32、EXT等。
事實上,安卓系統中的一切都是文件。因此,我們可以使用下面的命令從/proc/filesystems文件中查看文件系統詳情。
C:\> adb shell cat /proc/filesystems
典型的文件系統根目錄如下圖:
安卓在filesystems這個文件中存儲了許多詳細信息,比如內置應用、通過谷歌Play商店安裝 的應用等。任何擁有物理訪問權限的人都能輕易從中獲得許多敏感信息,如照片、密碼、GPS位 置信息、瀏覽歷史或者公司數據等。
重要目錄
/data:存儲應用數據。/data/data目錄用於存儲與應用相關的私人數據,如共享首選項、緩 存、第三方庫等
/proc:存儲與進程、文件系統、設備等相關的數據。
/sdcard:SD卡用於增加存儲容量。在三星設備上,/sdcard通常對應內置SD卡,而/extsdcard 則對應外置SD卡。SD卡可以存儲視頻等大文件。
安卓本地數據存儲技術
安卓為開發人員提供了下列幾種存儲應用數據的方法。
共享首選項、SQLite數據庫、內部存儲、外部存儲
除了外部存儲方式,其他存儲方式都將數據存放在/data/data目錄下的文件夾中,其中包含緩存、數據庫、文件以及共享首選項這四個文件夾。每個文件夾分別用於存放與應用相關的特定類 型的數據:
shared_prefs:使用XML格式存放應用的偏好設置;
lib:存放應用需要的或導入的庫文件;
databases:包含SQLite數據庫文件;
files:用於存放與應用相關的文件;
cache:用於存放緩存文件
共享首選項
共享首選項是一些XML文件,它們以鍵值對的形式存儲應用的非敏感設置信息。所存儲的 數據類型通常是boolean、float、int、long和string等
SQLite數據庫
SQLite數據庫是基於文件的輕量級數據庫,通常用於移動環境。安卓系統同樣支持SQLite框 架,因此你經常會發現許多使用SQLite數據庫存儲數據的應用。由於安卓系統在安全性方面的限 制,應用存儲在SQLite數據庫中的數據默認不能被其他應用訪問。
內部存儲
內部存儲也被稱為設備的內部存儲,可以將文件存儲到內部存儲空間。由於能被直接訪問,
因此它能快速響應內存訪問請求,與應用相關的全部數據幾乎都在這里被使用。從邏輯上來說, 它是手機的硬盤。在安裝過程中,每個應用都在/data/data/<應用包名>/下創建了各自的文件目錄, 這些目錄對每個應用都是私有的,其他應用沒有訪問權限。當用戶卸載應用后,這些目錄中的文件將會被刪除。
內部存儲空間的有限意味着應物盡其用,用來保存比較重要的數據,例如用戶信息資料,口令密碼等不需要與其他應用程序共享的數據。
外部存儲
外部存儲是安卓系統中一種用於存儲文件的全局可讀寫的存儲機制。任何應用都能訪問外部 存儲區域並讀寫文件,由於這一特性,敏感文件不應該存儲在這里。開發人員需要在 AndroidManifest.xml中聲明合適的權限才能進行這些操作。
2. 用戶字典緩存
用戶字典是大多數移動設備所具有的一個非常方便的功能,能夠讓鍵盤記住用戶經常輸入的 詞組。當我們使用鍵盤輸入特定的詞組時,它能自動提供一些補全建議。安卓系統同樣具有這一功能,它將常用詞組存放在一個名為user_dict.db的文件中。因此,應用開發人員需要小心。如果允許緩存輸入安卓應用的敏感信息,那么任何人都可以通過瀏覽user_dict.db文件或使用其內容提 供程序的URI訪問這些數據。
由於任何應用都可以通過用戶字典的內容提供程序訪問其內容,因此攻擊者可以輕易讀取和 搜集其中的有用信息
3. 不安全的數據存儲—NoSQL數據庫
目前,NoSQL數據庫使用廣泛。企業普遍使用了諸如MongoDB、CouchDB等NoSQL數據庫。這些數據庫同樣適用於移動應用。與其他本地存儲技術類似,如果NoSQL數據庫通過不安全的方式存儲數據,就可能會被利用。
4. 備份技術
使用備份功能在未ROOT的設備上查看應用的內部存儲。利用特定應用或設 備的備份文件,可以檢查其安全問題。
按照下面的步驟使用安卓系統備份技術來查找安全問題。
(1) 使用adb backup命令備份應用的數據;
(2) 使用Android Backup Extractor將.ab格式轉換為.tar格式;
(3) 使用pax或star工具解壓TAR文件;
(4) 分析上一步解壓后的內容,查找存在的安全問題。
5. 確保數據安全
敏感信息不應該以明文存儲,想要安全地存儲數據需要花費很大的精力。
盡量不要將敏感信息存儲到設備上,而應該將它放到服務器上。如果必須選擇前者,就應該 在存儲數據的時候使用加密算法。有很多工具庫可以幫助你對保存到設備上的數據進行加密。
Secure Preferences就是一個這樣的庫,它能幫你對保存到共享首選項的數據進行加密。可以 通過https://github.com/ scottyab/secure-preferences找到它。
如果想要對SQLite數據庫進行加密,可以選擇SQLCipher。它的下載地址是:https://www. zetetic.net/sqlcipher/sqlcipher-forandroid/。
注意,當使用類似AES等對稱加密算法時,密鑰管理是一個問題。在這種情況下,可以使用 基於密碼加密(PBE)的方法。這樣,密鑰就會基於用戶輸入的密碼生成。
如果你考慮使用散列來加密,那就選擇一個強的散列算法並對其加鹽。