身為安卓手機的鐵桿粉絲,如果你的手機突然掉線,你的第一反應是不是「天啊!」或是您在 Google Pay 或 Paypal 中的資金不安全?如果最新下載的應用程式不僅彈出各種無聊的廣告,還彈出意想不到的通知,您是否會認為這可能是釣魚嘗試並立即卸載該應用程式?
如何確保我們的應用程式為對 Android 安全漏洞認識不足的使用者提供安全的體驗? Android生態係有哪些安全漏洞?我們可以在哪裡探索新的 Android 安全測試技術?我們如何簡化安全測試流程?
首先,Android作業系統的開源開發優勢也掩蓋了其開發中固有的安全性問題,例如Android系統的沙箱系統(即虛擬機器)。然而,底層存在一個又一個漏洞,允許惡意程式(或工具)獲得root存取權限並突破沙箱的限制。就像PC時代一樣,不存在絕對安全的PC作業系統;在行動互聯網時代,也沒有絕對安全的行動作業系統。 Android開源生態的安全風險就像是血淋淋的警鐘,敲響了每個Android開發者的心。
其次,Android APP/SDK開發過程中的安全風險就像是未知的黑洞。我們永遠不知道安全對抗的終點在哪裡,攻擊者是誰,終結者是誰,以及如何防禦。
最後,在使用者層面,有哪些常見且可辨識的安全行為漏洞?
Android App 和 SDK 都存在一定程度的安全漏洞。也許有一天,您的應用程式可能會受到上述安全漏洞之一的影響。無獨有偶,最近在測試Android SDK時,我們發現了一個與Android應用程式元件相關的安全漏洞。基於這個例子,總結了Android SDK安全測試的方法、技巧和流程。
漏洞原因概述
應用程式(以下簡稱應用程式)Android SDK的一個可選組件在本地打開了一個隨機端口,用於監聽Java層服務是否存活。但Java層與元件通訊時,並沒有嚴格檢查輸入參數,導致呼叫Linux系統的「system()」函數時,有可能被填滿攻擊程式碼,遭受惡意攻擊。
如下截圖所示,模擬埠被攻擊後,應用元件Intent在通訊過程中修改URL內容,Webview顯示亂碼:
Android APP 的四大應用元件:Activity、Receiver、Service、Content Provider,以及應用元件透過 Intent 進行 IPC 通訊的安全角色,這裡不再詳細討論。利用上例中組件相關的漏洞,終端APP側相關的攻擊維度如下圖所示:
由於Android APP的本地應用環境,網路socket先天缺乏細粒度的認證和授權機制。因此,如果使用Android用戶端作為服務端,透過反向程式碼搜尋應用程式本地隨機連接埠號,主動向該連接埠發送攻擊,則會潛伏以下安全隱患:
本地命令執行:當嵌入式應用程式的Package名稱指定為應用程式本身,Component名稱指定為應用程式的Activity時,應用程式的任何Activity都可以啟動,包括受保護的非出口活動,從而造成安全隱患。例如,透過 HTTP 請求一一啟動多個未匯出的 Activity,即可發現拒絕服務漏洞。
修改應用程式權限的命令控制:透過開放的socket連接埠傳入啟動Android應用程式元件的意圖,然後以該元件的權限執行啟動activity、發送廣播等操作被攻擊的應用程式。由於透過socket傳入的intent無法對發送者的身分和權限進行細粒度的檢查,繞過Android對應用程式元件提供的權限保護,並且可以啟動未匯出且受權限保護的應用程式元件,存在安全隱患
敏感資訊外洩、手機控制:本地服務開啟UDP埠監聽,收到特定指令字後,可以回手機的敏感資訊。例如百度手機管家可以遠端管理手機的secretKey,然後未經授權的攻擊者就可以透過網路全面管理手機。
Android 安全強化版本最佳化
在 Native 層和 Java 層添加對系統命令的檢查和特殊字元過濾。
加密 JNI Watchdog 守護程式的套接字通訊。
在本機通知功能中新增對 URL、意圖和活動的功能驗證,以防止點擊通知時重定向到惡意連結。
更改套件名稱在應用程式本機儲存中的儲存位置。
新增線上設定功能。
這些是本次安全強化最佳化的重要要求。
如果按照常規的系統測試或效能測試,則只需根據需求的變化進行前向測試即可。但對於安全測試來說,確保SDK安全的穩健性需要逆向專案測試,模擬各種安全攻擊方式,針對修改點發散測試案例。
隱私資料:外部儲存安全和內部儲存安全;檢查使用者名稱、密碼、聊天記錄、設定資訊等隱私資訊是否在本地保存並加密;使用前請驗證資訊的完整性。
權限攻擊:檢查應用程式的目錄並確保其權限不允許其他群組成員讀取或寫入;檢查系統權限是否受到攻擊。
Android元件權限保護:防止app內部元件被第三方程式任意調用:防止Activity被第三方程式調用,防止Activity劫持;確保廣播接收和傳輸安全,僅接收應用發出的廣播,防止第三方接收傳輸內容;防止惡意啟動或停止服務;檢查Content Provider操作權限;如果需要外部呼叫元件,請驗證呼叫者是否已套用簽章限制。
升級:檢查升級包的完整性和合法性,避免被劫持。
第三方函式庫:如果使用第三方函式庫,請跟進其更新並檢查其安全性。
ROM安全:使用官方ROM或權威團隊提供的ROM,避免添加植入廣告、木馬等
反破解對策:對抗反編譯,導致無法使用反編譯工具反編譯或反編譯後無法取得正確的反組譯程式碼;透過使用程式碼混淆和加密來抵消靜態分析;透過添加程式碼來檢測偵錯器和模擬器來抵消動態偵錯;透過檢查簽章和驗證編譯後的dex 檔案的雜湊值來防止重新編譯。
完成安全專案測試和常規流程測試後,對應用現有功能、新舊版本相容性、不同Android作業系統版本的相容性進行滾動回歸測試。
與普通的效能和系統功能測試案例相比,安全測試案例需要對Android生態系統有更全面的了解,例如:涵蓋使用者安全外觀等級、應用系統本地和遠端攻擊等級、作業系統漏洞等級等,更注重設計逆向攻擊思維測試案例。
如果說開發的起點是安全防禦,那麼測驗的起點就是駭客攻擊思維。針對攻擊場景設計測試案例並實施攻擊測試技術決定了SDK安全性的穩健性。
為了確保您的應用程式具有最高等級的安全性,請考慮使用 WeTest 應用程式安全性測試。該服務對應用程式中的安全問題進行全面評估,及時發現程式漏洞,並提供程式碼修復範例,協助漏洞修復。
相信 WeTest 能夠保護您的應用程式免受潛在威脅並保持安全的用戶體驗。
以上是如何進行 Android 應用程式安全測試:開發人員和測試人員指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!