此前有人統計過2015年漏洞最多的產品,蘋果的OSX與iOS系統分別占據第一二名,雖有人懷疑統計數據可能存在重復的不准確情況,但相信大趨勢是不會變的。而今年國內一家機構發布的手機安全報告指出,32.3%的用戶明確表示自己曾經在手機上遭受過風險危害,而遭遇安全威脅的iPhone用戶比例達23.9%。iOS的安全形勢不容樂觀,因此對iOS應用進行安全審計也變得更為迫切。
本文旨在提供iOS應用程序安全審核方法的概述,並介紹一些可用於執行分析的工具。首先是iOS沙盒介紹:
iOS沙盒
iOS沙盒機制示意圖
iOS沙盒機制簡述起來就是,iOS應用程序只能在為該程序創建的文件系統中讀取文件,不可以去其他地方訪問,此區域稱為沙盒,所有的非代碼文件都要保存在此,如圖像、圖標、聲音、映像以及文本文件等。歸納起來就是以下3點:
每個應用程序都有自己的存儲空間;
應用程序不能翻過自己的圍牆去訪問別的存儲空間的內容;
應用程序請求的數據都要通過權限檢測,假如不符合條件的話,不會被放行。
當然,越獄的iOS設備不受此約束。所有在iOS程序都是在沙箱環境中運行,這種隔離是由操作系統維護,並基於其他四個不同的關鍵組件,四個組件分別是:Entitlements、Container、Powerbox和XPC 服務。
Entitlements
Entitlements是包括應用簽名在內的一系列屬性配置的列表。為了啟動其他功能,如icloud、推送通知或Apple Pay,我們需要給應用程序指定相應的權限。換句話說,應用程序啟動的越多,則沙盒裡面的內容就越多。
Containers(容器)
我們知道,在iOS中,每個程序都在自己的容器中運行。啟動應用程序時,會為應用程序的進程設置兩個環境變量:HOME和CFFIXED_USER_HOME。。通過這種方式,操作系統會讓應用認為自己的home目錄處在iOS控制之下。如果應用程序試圖訪問真正的系統用戶主目錄,沙盒會予以拒絕。
Powerbox
如果應用程序試圖訪問自己的沙盒以外的文件,系統會拒絕該請求。而iOS提供了一個稱為Powerbox的可信中介進程,應用程序可以調用該進程來表明自己有權訪問自己沙箱之外的某個文件。在收到類似的訪問請求之後,系統會提示用戶選擇哪些文件可以被應用訪問。一旦該用戶做出選擇,那麼該文件被直接提供給應用程序。
XPC Services
為了允許開發者執行相同應用組件的特權分離,iOS啟用了一種叫做XPC的進程間通信技術。單個的XPC服務在自己的沙箱中運行,這也就意味著不同的XPC服務具有不同的權限集。應用程序的XPC服務只能由應用程序本身訪問,而其壽命則完全由操作系統控制。
關於越獄(建議)
為了對應用程序進行徹底的審計,你需要對iOS設備進行越獄操作,雖然說不越獄也能進行測試,但其功力就下降了很多,甚至還會導致有些審查無法開展(我們會對需要越獄的部分加以標注)。關於越獄,本文不做討論,有興趣的看官可以參考以下地址:
http://resources.infosecinstitute.com/ios-application-security-part-1-setting-up-a-mobile-pentesting-platform/
遠程 API
大部分移動應用都依賴外部Web的API執行用戶認證、同步、或者應用的本地數據備份等請求。為了執行API測試,需要通過以下方式代理移動應用程序請求:在控制機上運行代理(比如說Burp)。要設置該設備的代理請求到另一台主機,請參考官方指南(傳送門)。
要在本地移動應用程序上執行網絡通信的檢查列表如下:
與遠程API的純文本通訊
缺少SSL證書鎖定
SSL配置錯誤
與遠程API的純文本通訊
首先檢查的就是,應用程序使用SSL/TLS進行網絡通訊。如果采用明文HTTP協議,應用程序在中間人攻擊中就會變得異常脆弱,一個潛在的攻擊者能夠截獲並修改app與API的網絡數據。
缺少SLL證書鎖定
證書鎖定是將主機和預期的SSL證書或公鑰相關聯的過程。
在iOS設備設置為通過受控代理正確代理網絡流量後,啟動應用程序並嘗試通過登錄來生成網絡流量。如果應用拒絕了這次連接,那麼證書鎖定就已經被正確設置了,相反,就可能會對移動應用程序流量執行中間人攻擊。
【需要越獄】如果證書鎖定被執行了,嘗試使用SSL kill Switch(一個黑盒工具,可以在iOS和OS X中組織SSL證書驗證),以便更好的了解API端點和應用調用的參數。
SSL配置錯誤
在移動應用開發的過程中,開發者為了能夠加快開發進程,就可能接受任何自簽名的SSL證書。當應用程序部署在Apple Store中時,可能就會忘記對簽名進行檢查。所以,子對應用進行審計時,要確保應用可以接收任何類型的自簽名證書。
靜態分析
在本文中,我們用Yelp作為例子來講解。既然是例子,那這個應用是沒有任何漏洞或者利用的。選擇它,純粹是為了描述如何進行iOS應用程序的安全審計。一個應用程序的靜態分析涉及審查和撤銷應用程序二進制文件。下面是一些執行的工具和需要審計的列表:
Needle
Needle是MWR Infosecurity在今年8月發布的一款工具,該工具旨在方便iOS應用的審查。截至10月,該工具有如下功能可以正常使用:允許應用程序二進制文件,存儲,動態和靜態分析(前提是,該源代碼訪問可用)。當然,我們還可以用它將Cycript和Frida進行hooking。Needle由Python語言匯編而成,很容易就通過shell來啟動:
Needle需要一些選項才能連接到iOS設備(需要在其上運行OpenSSH服務器)。在下面的例子中,iOS設備的IP是192.168.2.3,並且我們需要連接到默認SSH端口22,並使用metadata(元數據)模塊提取一些基本的信息。
運行上述命令的結果,顯示了應用程序在設備文件系統中的位置、支持的CPU架構以及進行審計所需的最低iOS版本等等。
應用加密
[需要越獄] 眾所周知,所有在Apple Store上的應用都受到蘋果二進制加密方案的保護(這也是為什麼大家會說蘋果應用比安卓應用好用的地方)。Needle允許對應用進行解密,並拉取本地解密的IPA。
Dumpdecrypted是一個解密iOS應用程序二進制文件的好工具。使用方法如下:
Yelp.decrypted 將會被創建.。為了檢查二進制文件支持的架構,我們可以使用lipo命令(lipo是一個在Mac OS X中處理通用程序(Universal Binaries)的工具):
將會得到如下的結果:
在蘋果中使用otool命令可以得到相同的效果:
運行otool命令得到的結果(otool可以提取並顯示iOS下目標文件的相關信息,包括頭部,加載命令,動態庫等,是一個強大的分析工具,當然也可以做反匯編工具):
lipo也可以用於提取特定架構的可執行文件。在本例中,將使用armv7:
現在,我需要確認新的可執行文件只支持1個架構。
抓取可執行文件到本地機器:
解密過程可以通過加載應用程序手動完成,將gdb附加到進程並將未加密程序的存儲器位置轉儲到文件夾。
現在,我們已經可以訪問未加密的可執行文件,但我們不能用Hopper、IDA或者任何其他的逆向工程工具來檢查它。下面是Hopper的幾個截圖與之前未加密二進制文件的對比。
檢查Plist文件
我們知道,應用程序可能會使用Plist文件來存儲配置信息。Plist是XML結構的文本文件,當訪問iOS應用程序時,要檢查事情之一就是存儲在plist文件中的硬編碼憑證。不需要越獄來訪問這類文件。這裡我們又要提到另外一個工具——i-funbox,它是一款可以在任何iOS設備的沙盒中嗅探應用數據(包括plist文件)的工具。
對Keychain數據和SQL 數據庫的檢查
【需要越獄】iOS系統及第三方應用都會使用Keychain來作為數據持久化存儲媒介,或者應用間數據共享的渠道,有了keychain以後,應用就可以存儲憑證或者是API訪問token一類的信息了。Keychain會在數據存儲到文件系統前對數據進行加密。它是一個sqlite數據庫,位於/private/var/Keychains/keychain-2.db,其保存的所有數據都是加密過的。對設備進行越獄操作,可以讓應用對存儲在keychain中的數據進行無礙訪問。而在所有工具中,Keychain-Dumper無疑是非常出眾的。顧名思義,該工具就是將所有的keychain數據轉儲到越獄設備。
Keychain示例
當我們在對一個應用進行評估時,對app在keychain中存儲的信息進行查看是有必要的。建議使用操作系統提供的Keychain頂部的額外加密來加密存儲在Keychain中的數據。
我們知道,在iOS中,你可以將數據存儲在SQLite數據庫中(SQLite是一款輕型的嵌入式數據庫),SQLite文件可在應用沙箱中數據目錄中進行訪問。默認情況下,SQLite數據庫是未加密的。但如果你要對這些數據進行加密,怎麼辦?
SQLcipher就是一個很好的選擇。當我們審計一個應用時,一定要弄清楚應用是否在SQLite中保存了數據,保存了什麼類型的數據,這些數據是否已經加密了等等。
檢查HTTP緩存響應
如果應用程序使用內置的NSURLRequest來執行HTTP請求,則響應可能會被緩存在應用程序的Cache.db SQLite文件磁盤上。它的遠程API/Web服務器在響應中不返回Cache-Control頭,敏感信息就可能會被存儲在設備上。值得注意的是,存儲在此文件中的緩存數據並未加密。
MobFS(工具)
【需要越獄】MobFS是一個對iOS和安卓應用進行靜態和動態分析的開源工具。
動態分析
動態分析包括對應用程序進程的運行時(運行時是蘋果提供的純C語言的開發庫,是一種非常牛逼、開發中經常用到的底層技術)進行操作,以便實現以下目的:
繞過越獄檢測;
竊取加密密鑰或敏感數據;
加載ViewControllers從而繞過某些控制;
攻擊本地認證(如果存在認證);
訪問企業應用程序時可以進入內部網絡;
檢查自定義加密。
Instrumentation(工具)
【需要越獄】存在許多工具來執行所謂的檢測,它們主要用於在運行時中修改應用。最常見的工具:
Cycript(是大神saurik開發的一個非常強大的工具,可以讓開發者在命令行下和應用交互,在運行時查看和修改應用);
Frida(Frida是一款基於python + javascript 的hook與調試框架,通殺android\ios\linux\win\osx等各平台,相比xposed和substrace cydia更加便捷);
Cydia substrate(Cydia Substrate是一個代碼修改平台。它可以修改任何主進程的代碼,不管是用Java還是C/C++(native代碼)編寫的。);
GDB;
覆蓋函數的動態連接(LD_PRELOAD)。
Cycript
Cycript(傳送門)是大神saurik開發的一個非常強大的工具,可以讓開發者在命令行下和應用交互,在iOS運行時查看和修改應用。 這個工具使用了Objective-C和JavaScript的混合模式,可以實時的和應用交互甚至修改應用。(一種是在越獄的設備上通過MobileSubstrate加裝,這樣可以在所有的應用裡使用;另一種是通過靜態庫的方式把cycript集成到自己的應用,這樣做不要求越獄,當然也只能在自己的應用內使用了。)
Cycript主要是注入你關注的那個應用的線程,然後就可以獲得app,獲得window,慢慢去獲得viewController,逐步逐步撥開UI的面紗。我們可以通過傳遞應用名稱或PID來啟動該工具:
一旦連接到該進程,就可以窺探應用程序的組件了:
有了這個,我們就可以手動調用某方法,或者修改當前的ViewController(視圖控制)等等。
在下面的示例中,我們假設YPUIApplicationDelegate_iPad類實現了一個名為correctCredentials的方法,該方法驗證用戶輸入的憑據,如果憑證正確,則會返回“true”。Cycript允許在運行時中重新定義方法。在這種情況下,我們希望在調用該方法時始終返回“true”:
在查看應用程序時,我們可以在運行時中操作進程來檢查可以實現什麼類型的繞過。如果很輕松就能繞開某些功能,那麼這個應用設計肯定是有問題的。
使用Snoop-it分析iOS應用
【需要越獄】Snoop-it允許我們進行運行時分析和對iOS應用進行黑盒安全評估,它可以查看keychain中存儲的數據,還可以浏覽你手機上App的類的層級,並且可以查看該App中某個文件的屬性和方法。它有著相當有好的Web界面和豐富的功能,如下圖所示:
Snoop-it文件系統模塊
這個模塊可以監聽應用對文件系統的訪問情況。如圖:
Snoop-it加密模塊
該模塊用於跟蹤常見的加密API的調用,如圖:
Snoop-it地址偽造模塊
當應用程序請求設備當前的GPS坐標時,此模塊允許提供假的位置。
Snoop-it硬件欺騙模塊
Snoop-it支持多種運行時修改,包括修改你的硬件標識符比如Mac地址,UDID,設備模型號等等。
Snoop-it Keychain模塊
這個模塊主要用於跟蹤keychain中的數據訪問和存儲情況。
Snoop-it方法調用模塊
這個模塊允許應用程序在運行時調用方法。
Snoop-it方法跟蹤模塊
這個模塊主要是用於跟蹤應用執行期間方法的調用情況。
Snoop-it網絡模塊
這個模塊主要跟蹤應用對HTTP和HTTPS的調用情況。
Snoop-it敏感API模塊
你可以看到應用調用的敏感API。比如在地址簿查找信息,訪問camera,或者訪問設備的UDID。
Snoop-it URL模式模塊
此模塊顯示哪種URL模式在應用程序中被使用。
IDB
【需要越獄】IDB是另外一款強大的開源工具,用Ruby語言編寫而成。雖說不像Snoop-it那樣,可以直接調用方法,它還是有著自己的特色功能,比如檢查系統日志和粘貼板,模糊URL方案等。
IDB應用信息
追蹤分析利器introspy-ios / introspy-analyzer
【需要越獄】Introspy由ISEC partners開發,Introspy由兩個單獨的模塊組成,一個追蹤器,一個分析器。它是分析iOS應用程序安全的最強大工具之一。
introspy-ios有助於自動執行應用程序的運行時分析,而且還可以發現潛在的安全威脅。Introspy-ios hook並檢查被應用調用的敏感API,它將結果存儲在設備的本地SQLite數據庫中。
Introspy-Analyzer是一個幫助格式化跟蹤器數據並生成HTML報告的工具。下面是將工具嵌入Yelp應用程序的示例。
Snapshot
當應用在後台運行時,只需通過Home鍵就可以對當前屏幕進行截屏,截屏照片會保存下來。當我們在對應用進行審計時,有必要檢查該應用是否會展示敏感信息。如果有顯示敏感信息的情況,將程序放置在後台並對iOS的截圖進行檢查。如果這台設備已經被越獄了,則可以通過前面介紹的Needle來進行相同的測試,並且用Needle會自動下載截圖。否則,就只能用i-funbox從應用程序沙盒目錄中手動尋找該文件了。
越獄檢測
【需要越獄】作為深度的安全測量,應用程序可能會對設備實施越獄檢測,如果沒有通過越獄檢測,則會拒絕運行。如果檢測到有敏感數據存儲在設備上,應用程序就會清除這些敏感數據(前提是該設備已經被越獄了)。在審查應用程序時,有必要檢查是否執行越獄檢測以及執行帶來的後果。
防調試保護
【需要越獄】作為另一種深度的安全測量,應用程序可能會檢測到它正處於調試模式,並且還連接到了調試器(如GDB),並正常停止運行。即使經驗豐富的人能繞過這類防護方式,對於經驗少甚至無經驗的人來說,他們只能望洋興歎,另尋出路了。
鍵盤緩存
【需要越獄】我們知道,在iOS應用程序中輸入字段時,數據會被緩存並且進行自動更正,當然,密碼類型的文件和特定字符串除外。我們在對應用進行審計時,尤其要注意哪些數據存儲在緩存中。
緩沖區溢出/格式化字符串/內存損壞
iOS應用很可能會受到內存損壞漏洞攻擊,比如緩沖區溢出和字符串格式化等。在我們做審計時,模糊用戶輸入和檢查應用程序崩潰都是值得嘗試的,通過這些檢查,我們可能會發現這些應用是容易被攻擊的。如果測試設備已經越獄,則可以通過調試手段做進一步的崩潰分析。