Android root 及應用安全評估
Android root
在Android裝置上,獲得超級使用者許可權的過程被稱為root,這個特殊賬號擁有對UNIX系統所有檔案與程式的許可權,可以對作業系統完全控制。
NAND:計算機快閃記憶體裝置,斷電後仍能保持資料。
分割槽:裝置的永續性儲存記憶體中劃分的邏輯儲存單元或者塊。
佈局:對分割槽制定次序,偏移和尺寸。
不同裝置的分割槽佈局通常會不一樣,但是一下幾種都會存在:引導區,系統區,資料區,恢復區,快取區。
確定分割槽佈局:1,檢視/proc檔案系統中partitions條目的內容。2,檢查/dev/block/platform中SoC特定目錄的內容,在by-name目錄下,每個分割槽名都被連結到相應的塊裝置上。3,/etc/vold.fstab檔案,恢復日誌,以及核心日誌。4,mount命令檢視/proc/mounts。
下載模式:引導載入程式都支援將手機設定為下載模式,這種模式下,能夠讓使用者在底層更新手機的永續性儲存,這個過程通常被稱為刷機。通過在啟動時按住特定的組合鍵,啟動下載模式,等待PC通過USB進行連線,PC和引導載入程式之間通過裝置支援的下載協議程序通訊,包括沖刷NAND分割槽,裝置重啟,下載與執行替換核心映像等。
解鎖引導載入程式:在fastboot模式下,使用fastboot oem unlock。
恢復模式:特定的按鍵組合或者通過adb reboot recovery命令。
應用安全評估
普通性安全問題:
應用許可權問題,當前Android許可權模型粒度下,開發者往往會申請比實際應用所需更多的許可權,導致許可權執行與文件描述不一致。許可權申請不足,通常會導致可靠性或功能性問題,嚴重的情況下可能會導致應用崩潰,過度的許可權申請如果被惡意應用所攻擊,則會導致許可權提升的問題。
敏感資料的不安全傳輸,弱機密或者不加密,強加密但缺少安全警告或者證書驗證錯誤處理,在安全協議失效以後使用明文,在不同網路型別的傳輸安全使用上不一致。
不安全的資料儲存,Android為資料儲存提供了很多標準支援,包括共享配置檔案,SQLite資料庫,和原始檔案。最普遍的是對敏感資料明文儲存,未受保護的content provider介面,以及不安全的檔案許可權。
日誌資訊洩露,日誌是資訊洩露的主要途徑,開發者對日誌的濫用,可能會導致日誌記錄下普通的診斷訊息,登入憑證或者其他敏感資訊。
不安全的IPC端點,通常程序間通訊的端點包括,Service,Activity,Broadcast Reciver,Content Provider。content provider在設計上暴露了對結構化資料的訪問,可能會遭遇目錄遍歷或者注入攻擊。Activity,作為面向使用者的元件,可能會被惡意應用進行介面偽裝攻擊。Broadcast Reciver經常用於處理隱式Intent,或者系統範圍事件。Service是應用進行後臺處理的元件,類似於Broadcast Reciver,Activity,與Service的互動是使用Intent完成的,包括,啟動,繫結。停止等動作。繫結後的Service可能會向其他應用暴露出與應用相關的另一層次的功能,可能會導致一個任意命令執行的漏洞。
隱式Intent指那些沒有指明特定目標元件的Intent。
靜態分析
使用apktool工具,apktool d xxx.apk,解碼apk的內容。
使用androguard,androlyze提供了一個IPython shell。AnalyzeAPK方法表示建立APK,資源,與dex程式碼的恰當物件並新增一個使用dad反編譯器的選項。就可以把dex碼轉為java偽碼。
androlyze.py -s
a,d,dx=AnalyzeAPK("/xxx/xxx/xxx.apk",decompiler="dad")
你得到的三個物件是a一個APK物件,d一個DalvikVMFormat 物件陣列和dx一個Analysis 物件
a.permissions 用來檢查許可權。
a.get_permissions() 獲取APK的許可權.。
a.get_activities() 獲取AndroidManifest.xml中定義的所有活動的列表。
a.get_package() 獲取包名稱
a.get_app_name()獲取包應用程式名稱
a.get_app_icon()取包圖示路徑
a.get_androidversion_code() 獲取數字版本
a.get_androidversion_name() 獲取版本字串
a.get_min_sdk_version() 獲取最小SDK版本
a.get_max_sdk_version() 獲取最大SDK版本
a.get_target_sdk_version() 獲取目標SDK版本
a.get_effective_target_sdk_version() 獲取有效的SDK版本
a.get_android_manifest_axml().get_xml() 獲取AndroidManifest.xml的解碼XML
a.get_services()檢查Service
a.get_recivers()檢視應用中Broadcast Reciver
在analyze中呼叫目標方法的show函式,可以對方法進行反彙編以瞭解呼叫該方法會發生什麼,對同一方法呼叫其source函式,可以對方法進行反彙編,獲得一個可讀性更高的版本,將直接回復出Java程式碼。
使用d.create_xref()建立交叉引用,然後呼叫方法的show_xref()函式,檢視方法的交叉引用(xref)。
詳見androguard使用。
動態分析
動態分析需要執行應用,通常會在插裝或者監控的方式下進行,以獲取關於應用的具體行為資訊。
Andbug,連線到Java除錯連線協議端點上,可以在應用的manifest檔案中顯示的標註,android:debuggable=true,讓應用開放Android除錯橋(adb)端點。
攻擊
見Drozer使用。