開源!iOS 應用安全分析工具 Passionfruit
Github 項目地址 chaitin/passionfruit
前情提要
雖然沒有 Android 平台那麼多的攻擊面和利用姿勢,iOS 應用依然有安全審計的需求。移動平台的安全目前採用的策略基本上都是掃描器加上一部分人工的逆向和動態分析。
針對 iOS 應用攻擊面分析,目前筆者了解或使用過的相關工具如下(除去逆向工程使用的調試器和反彙編工具):
- Snoop-It(已停止維護)
- dmayer/idb idb is a tool to simplify some common tasks for iOS pentesting and research
- mwrlabs/needle The iOS Security Testing Framework
- sensepost/objection ?? objection - runtime mobile exploration
- iSECPartners/Introspy-iOS IntroSpy
在使用中筆者多多少少遇到了一些問題,例如 needle 在設備上需要部署過多依賴包,idb 不兼容 iOS 10,Introspy 雖好但查詢日誌資料庫有一些麻煩……忍不住開始造輪子。
審計工具所需功能大體有如下幾個方面:
- 分析應用是否開啟了必要的編譯器保護
- 分析應用沙盒內的文件內容和許可權
- 分析應用使用到的 framework 和動態鏈接庫
- 分析應用存儲的數據,如 UserDefaults, BinaryCookie 和 KeyChain
- 分析剪貼板的使用
- 動態攔截和分析 Objective C 運行時方法
- 動態攔截和分析本地代碼的參數調用和堆棧追蹤
- 分析 UIView 的層級結構和屬性
- 一些基於 hook 實現的修改功能,如設備特徵偽造、繞過越獄檢測、繞過 SSL Pinning 等
應用目前仍然在開發中,可能會有 bug 或功能缺失。
設計
在實現方案上,筆者選擇了功能極為強大的 hook 框架 frida.re。關於這個框架不需要我再過多介紹,它在 iOS 平台上支持對 native 函數、Objective C 運行時的 hook 和調用,可以滿足多種移動安全運行時分析的自動化需求。
Passionfruit 通過 frida 注入代碼到目標應用實現功能,再通過 node.js 服務端消息代理與瀏覽器通信,用戶通過訪問網頁即可對 App 實現常規的檢測任務。
安裝和使用
請訪問 GitHub 上的項目主頁 chaitin/passionfruit 來獲取最新的版本和更新信息。
Passionfruit 的編譯和安裝依賴如下軟體:
- node.js 用於運行服務端。可根據個人喜好使用 yarn 或默認的 npm 作為包管理
安裝步驟
- 安裝 node.js,版本推薦使用 @8.x
- 通過 git 將代碼倉庫同步到本地
- 在越獄 iOS 設備上安裝 frida
- 在非越獄設備上使用 ipa 重打包注入 fridagadget.dylib
- 第一次使用前,在代碼根目錄運行 npm run build 構建前端代碼
- 運行 npm start 運行服務端,在瀏覽器中訪問 localhost:31337
功能和演示
https://www.zhihu.com/video/902688743067090944
Passionfruit 最大特點就是基於 Web 的圖形界面。因此你甚至可以在 iPad Pro 這樣的移動設備上訪問這個圖形界面……(需要修改服務端監聽的配置)
完全圖形化的界面可以快速地找到需要 hook 的函數。由於 C 函數缺少運行時參數類型信息,因此對於這些庫函數您需要手動設置一下函數原型。Objective C 可以直接根據反射列印出參數和返回值。
其他工具實現的 checksec 是基於 otool 檢查應用的可執行文件,需要在設備上安裝額外的依賴,或將文件從設備中同步到本地執行命令。Passionfruit 直接分析內存中映射的內容,因此要快上很多。在文件查看方面,Passionfruit 直接讀取應用沙盒內的 Plist、SQLite 資料庫,相比先 scp 下載然後查看可以節約一些時間。
Passionfruit 在不少界面都添加了搜索功能,如模塊列表、導出符號、Objective C 類,甚至 Plist 這樣的序列化數據。
在 iOS 10 中有一個非公開 API UIDebuggingInformationOverlay 可用來在設備上分析界面層級,您可以在 Passionfruit 的 UIDump 面板中點擊按鈕來激活這個界面。
如果您有單步、界面分析等更高級的調試需求,建議還是使用 debugserver 等專門的調試工具。
FAQ
需要越獄嗎?
更新:項目發布後收到了 frida 作者本尊貢獻的代碼,現在已經不需要越獄了!
Frida 可以通過對已砸殼的 ipa 添加 fridagadget.dylib,重打包、重簽名後在非越獄設備上試用,具體步驟可參考: iOS App的Patching和Resigning
為什麼不支持 NSLog 查看?
本工具使用的界面是基於瀏覽器的,對於 NSLog 日誌這種快速刷新的內容,實時展示會造成顯著的性能問題。在現有工具(Xcode,macOS 自帶的 Console,libimoviledevice 的 idevicesyslog 命令)足夠強大的情況下,沒有必要再開發一個(更難用的)了。
推薦閱讀:
※如何評價在GitHub 上 3000 fork庫的代碼水平?
※如何正確地使用ios與mac的照片流?
※這次 XcodeGhost 事件影響有多大?App Store 審核是否有漏洞?有沒有不可推卸的責任?
※【獨家觀點】在新iPad Pro登場不久之際,我們如何評價iPad系列的「生產力」? #火箭親測
※Wi-Fi 下進行 iOS 更新,會造成系統不完整、運行不穩定嗎?