最近研究了下Android應用測試,找了一些資料,覺得OWASP這篇寫的還是比較系統的,所以翻譯出來給大家分享下。文中的翻譯盡可能保持原文格式,但一些地方為了通順和易于理解也做了一定改動,如有翻譯問題,還請各位大牛指正。本文翻譯時版本是20170911,后續如果有大更新的話同樣會跟進更新。
這份速查表提供了一份進行Android應用測試所需要進行的測試清單。主要根據OWASP十大移動安全問題進行敘述。
一個完整的安卓應用滲透測試包含了幾個不同的領域,如上圖所示。
1.1.1. 應用架構
在這個領域,重點在于理解應用程序邏輯和應用程序到底是做什么的。這包含了一些手動測試項目,我們會進行一些基本操作例如安裝APK到手機上,登錄并且了解APP的功能。
了解應用的架構,并尋找可能的攻擊向量例如:
1.應用程序的類型是什么?(游戲,商業,生產力等等)
2.應用程序是否連接到后臺的Web服務?
3.應用程序是完全自行編寫還是使用了現有框架?
4.應用程序是否在設備上存儲數據?
5.應用程序都使用了設備上的哪些功能?(攝像頭,陀螺儀,通訊錄等等)
1.1.2. 客戶端攻擊
這是滲透測試過程中最具挑戰性和激動人心的部分。安卓APP被打包成APK文件,也被稱為Android Package Kit或Android Application Package。作為滲透測試人員的任務就是確認應用程序在面對已知攻擊向量時,現有的防護機制是否有效。安卓的移動應用通常是通過例如Google Play的平臺進行分發。自從應用完全安裝在客戶端上以后,它就需要承受來自客戶端的任何種類攻擊。
1.1.3. 網絡攻擊
正如我們需要識別客戶端中的漏洞,通過分析流量來確認客戶端和服務器端的通信是否安全也是十分必要的。為達到這個目的,使用代理工具,評估潛在的SSL問題,以及分析Wireshark抓包文件都是進行評估工作的必要組成部分。
1.1.4. 服務端攻擊
最后但重要的是,服務端層面的問題同樣會影響應用程序的安全。一些不安全的實現例如錯誤配置,存在漏洞和問題的API或數據庫層面的問題,同樣會影響到應用的安全性
在設備層面,應用需要以兩種方式進行測試。逆向工程是移動應用測試的必要組成部分。這需要一臺已經ROOT的設備。如果對為什么我們需要對已安裝的APK進行逆向工程比較疑惑,主要原因在于客戶端上。
同樣有兩種方法測試應用程序,我們需要考慮在測試中具體使用哪種方法。
1.安卓設備運行在出廠設備或普通模式下測試
2.安卓設備運行在ROOT模式下測試
在應用層面,應當以兩種方式進行測試
1.應用程序在真實設備中運行(有利于測試觸摸相關特性)
2.應用程序在模擬器中運行(使用臺式或筆記本的大屏有利于進行測試)
對于下面的每個標準,測試人員應遵循多個步驟進行測試
l 檢查AndroidManifest.xml權限配置,某些權限配置可能是危險的。
l 如果應用使用了指紋識別,根據此特性測試不同的漏洞。參考https://www.blackhat.com/docs/us-15/materials/us-15-Zhang-Fingerprints-On-Mobile-Devices-Abusing-And-Leaking-wp.pdf
這部分測試應該在使用應用一段時間以后進行,以便充分測試。這種方式需要給予應用將一些數據存儲在磁盤上所需的時間。這可能需要一個已經ROOT的安卓設備,以便能訪問安卓中的例如’/sdcard’的常見路徑。
data/app_folder
安卓應用程序需要在本地以sqllite或XML結構存儲數據,因此需要執行SQL/XML查詢或監控文件I/O。
由此可能造成2種主要威脅。
1.SQL/XML注入,并且如果讀取目標是公開的,那另一個應用也可能讀取此數據。
2.本地文件讀取可能允許其他應用程序讀取相關應用程序文件,如果它們包含敏感數據,那數據可能通過此途徑泄露。
如果應用程序是一個HTML5的混合應用程序,則還需要考慮跨站腳本(XSS)問題。XSS會將整個應用程序暴露給攻擊者,因為HTML5應用程序能夠調用本機功能,從而控制整個應用(WebView)。
另外,應用程序可以使用“adb backup”的選項來制作應用程序的備份,通過分析備份內容可以識別當與客戶端進行交互的時候,應用程序存儲和泄露了什么。
這里提供對不同層面進行測試的方法。
2.3.1. 服務器側
l 識別所有SSL終端。
l 使用(sslscan)或類似軟件識別SSL加密方式
l 是否禁用SSLv2,SSLv3
l 是否支持TLS1.2和1.1(1.2對于確保盡可能高的安全連接十分重要)
l 是否禁用RC4和基于CBC的加密算法
l DH參數應當>2048位
l SSL證書應當至少使用sha2/sha256簽署
l ECDHE密鑰/密鑰應當支持完全正向保密
l SSL證書應當由受信任的RootCA簽發
l SSL證書不應過期
l 驗證進程間通信實現是否存在問題
2.3.2. 設備側
l 通過瀏覽確認應用是否正常工作
l 在應用程序和遠端服務器間設置代理。如果應用無法加載,應用程序可能進行了證書校驗。注意logcat(譯者注:logcat是Android中一個命令行工具,可以用于得到程序的log信息。)是否有消息輸出
l 將代理使用的RootCA證書添加至設備受信任的RootCA列表。
l 嘗試再次使用應用。如果應用仍然無法連接,應用程序可能使用了證書綁定。
你可以通過攔截或修改Smali代碼來繞過證書綁定
2.3.2.1. 使用Xposed:
l 安裝Xposed Framework以及Just Trust Me模塊(譯者注:用于禁用SSL證書驗證),啟用JustTrustMe然后重啟設備。
l 再試一次如果一切正常那我們就通過使用Xposed模塊成功繞過了證書綁定。
l 目前安卓的安全提供程序(Securityprovider)已經針對SSL漏洞進行了適當更新。
2.3.2.2. 修改SMALI:
l 識別/搜索實現證書綁定的方法(查找關鍵字例如’sha256/’后面跟著證書值類似于”sha256/wl0L/C04Advn5NQ/xefY1aCEHOref7f/Q+sScuDcvbg=”)
l 將證書綁定值改變為你使用的BURP證書所對應的值。
在這個部分的測試中,需要有一些必要的工具以進行評估。
l 代理工具如ZAP,BURP或者Charles
l 用于流量分析的Wireshark
通過分析客戶端和服務器間的流量(HTTP請求/響應),注意檢查以下項目
l 分析會話管理和工作流
l 使用代理分析API認證
l 不安全的WebView
l 檢查憑據是存放在數據存儲還是服務器端
l 濫用或可訪問AccountManager(安卓的用戶管理類)
l Authenticating Callers組件調用
不正確的會話處理通常會和糟糕的身份驗證帶來同樣結果。當你通過認證并給予一個會話信息時,這個會話信息允許你訪問移動應用。這里有很多東西需要注意
l 檢查并驗證后端的會話
l 檢查會話超時保護
l 檢查不正確的Cookie配置
l 不安全的令牌創建
l 不安全的WebView實現
在這個部分,你需要在使用加密的地方進行枚舉以執行一個全面分析。例如:
使用SSL/TLS加密類型
l 使用HTTPS URL或使用一個安全通道例如實現HttpsURLConnection或SSLSocket
l 身份驗證會話令牌
l 在數據存儲中明文存放敏感信息
l 可以訪問加密密鑰或不正確的密鑰管理
l 使用已知的弱加密算法例如Rot13, MD4,MD5, RC2, RC4, SHA1
l 自制或自行設計的加密算法
l 程序代碼內硬編碼密鑰
l 使用自有協議
l 不安全的使用隨機生成器
在對應用程序架構和數據流有所理解后,可以依照以下方法驗證授權機制:
l 憑據處理:應用程序是否使用授權令牌而不是始終詢問憑證?
l 驗證應用程序是否僅允許指定角色訪問。
l 在數據存儲中存儲用戶名密碼,而不是使用AccountManager
這部分有兩種方法:
l 如果你可以訪問源代碼,對客戶端代碼和服務器API進行代碼審計。
l 如果不能訪問源代碼,你可以通過反編譯APK文件來檢查代碼
在這個案例里我們強烈建議進行代碼審計。由于不正確的實現,這里肯定會有很多潛在的漏洞。
這一部分你需要一臺已經root的設備以及逆向工程技術。
l 使用工具例如apktool, dex2jar /enjarify, Bytecodeviewer或商業工具類似JEB反編譯APK文件。
l 使用反編譯器例如JD-GUI或Bytecodeviewer分析代碼。商業版本的工具類似JEB甚至允許你調試已經反編譯的應用,雖然不是所有情況都可以。
l 在分析完代碼后,嘗試繞過各類功能,無論是通過Xposed或Frida框架修改Smali代碼還是劫持方法實現。
l 驗證應用程序是否進行了混淆并且通過搜索指定字符串驗證混淆級別。
l 反編譯APK并更改Smali(利用這個工具,它可以自動反編譯,編譯和簽名應用。https://github.com/voider1/a2scomp)
l 安卓的二進制文件本質上是dex類,如果不加保護,可以直接反編譯出源代碼。
需要進行檢查和驗證是否有以下限制:
l 已越獄,Root后的設備-檢測限制
l 校驗和限制
l 證書綁定限制
l 調試器檢測限制
l Xposed檢測限制
l 動態加載代碼
l 使用安卓NDK中原生代碼
逆向工程在移動應用測試中是一個必要部分。它同樣需要使用一部已經Root的設備。為了這部分測試請確保你已經準備了以下工具:
l 已安裝SDK工具的Android Studio
l 一部已經Rooted的安卓設備或模擬器
l 已經Root的安卓模擬器可以使用已安裝Xposed的CuckoDroid
l 安裝了不同的APK反編譯工具例如apktool,Dex2Jar/enjarify或選擇集成環境的話可以是Bytecodeviewer或JEB
l IDA pro (分析代碼流程)
l Smali反編譯器/編譯器以及簽名程序:https://github.com/voider1/a2scomp
驗證以下問題:
l 應用程序是否進行了混淆?
l 利用工具Bytecodeviewer或JEB查找關鍵字符串以及關鍵詞
l 搜索SSL證書綁定實現,設備Root權限獲取或API連接(查找關鍵字例如’TrustManager’ , ‘SHA256′, X509 ,SHA, SSL ,更多細節請查閱安卓安全概覽https://developer.box.com/docs/android-security-guidelines)
進行這部分的測試需要進行代碼審計或對APK進行逆向工程(如果無法獲得代碼)
原文轉自:http://www.freebuf.com/articles/terminal/161599.html