此前有人統計過2015年漏洞最多的産品,蘋果的OSX與iOS系統分别占據第一二名,雖有人懷疑統計資料可能存在重複的不準确情況,但相信大趨勢是不會變的。而今年國内一家機構釋出的手機安全報告指出,32.3%的使用者明确表示自己曾經在手機上遭受過風險危害,而遭遇安全威脅的iPhone使用者比例達23.9%。iOS的安全形勢不容樂觀,是以對iOS應用進行安全審計也變得更為迫切。
本文旨在提供iOS應用程式安全稽核方法的概述,并介紹一些可用于執行分析的工具。首先是iOS沙盒介紹:
IOS沙盒
iOS沙盒機制示意圖
iOS沙盒機制簡述起來就是,iOS應用程式隻能在為該程式建立的檔案系統中讀取檔案,不可以去其他地方通路,此區域稱為沙盒,所有的非代碼檔案都要儲存在此,如圖像、圖示、聲音、映像以及文本檔案等。歸納起來就是以下3點:
1、每個應用程式都有自己的存儲空間;
2、應用程式不能翻過自己的圍牆去通路别的存儲空間的内容;
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)。要設定該裝置的代理請求到另一台主機,請參考官方指南(傳送門)。
要在本地移動應用程式上執行網絡通信的檢查清單如下:
1.與遠端API的純文字通訊;
2.缺少SSL證書鎖定;
3.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(中繼資料)子產品提取一些基本的資訊。
set IP 192.168.2.3
set PORT 22
use metadata
run
運作上述指令的結果,顯示了應用程式在裝置檔案系統中的位置、支援的CPU架構以及進行審計所需的最低iOS版本等等。
/private/var/mobile/Containers/Bundle/Application/A51E9-B964B6-B360AD21CE2BE3/Yelp.app/Yelp
Architectures : armv7, arm64
Platform Version :
SDK Version : iphoneos9
Minimum OS :
應用加密
[需要越獄] 衆所周知,所有在Apple Store上的應用都受到蘋果二進制加密方案的保護(這也是為什麼大家會說蘋果應用比安卓應用好用的地方)。Needle允許對應用進行解密,并拉取本地解密的IPA。
Dumpdecrypted是一個解密iOS應用程式二進制檔案的好工具。使用方法如下:
Yelp.decrypted 将會被建立.。為了檢查二進制檔案支援的架構,我們可以使用lipo指令(lipo是一個在Mac OS X中處理通用程式(Universal Binaries)的工具):
lipo -info Yelp.decrypted
将會得到如下的結果:
Architectures in the fat file: /private/var/mobile/Containers/Bundle/Application/A51E9-B964B6-B360AD21CE2BE3/Yelp.app/Yelp are: armv7 arm64
在蘋果中使用otool指令可以得到相同的效果:
運作otool指令得到的結果(otool可以提取并顯示iOS下目标檔案的相關資訊,包括頭部,加載指令,動态庫等,是一個強大的分析工具,當然也可以做反彙編工具):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0x00 EXECUTE NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
/private/var/mobile/Containers/Bundle/Application/A51E9-B964B6-B360AD21CE2BE3/Yelp.app/Yelp
(architecture arm64):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL EXECUTE NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
lipo也可以用于提取特定架構的可執行檔案。在本例中,将使用armv7:
現在,我需要确認新的可執行檔案隻支援1個架構。
otool -vh Yelpv7
Yelpv7:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0×00 EXECUTE 116 9800 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
抓取可執行檔案到本地機器:
scp [email protected]:/private/var/root/Yelpv7 .
解密過程可以通過加載應用程式手動完成,将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頭,敏感資訊就可能會被存儲在裝置上。值得注意的是,存儲在此檔案中的緩存資料并未加密。
MobSF(工具)
【需要越獄】MobSF是一個對iOS和安卓應用進行靜态和動态分析的開源工具。
動态分析
動态分析包括對應用程式程序的運作時(運作時是蘋果提供的純C語言的開發庫,是一種非常牛逼、開發中經常用到的底層技術)進行操作,以便實作以下目的:
1.繞過越獄檢測;
2.竊取加密密鑰或敏感資料;
3.加載ViewControllers進而繞過某些控制;
4.攻擊本地認證(如果存在認證);
5.通路企業應用程式時可以進入内部網絡;
6.檢查自定義加密。
Instrumentation(工具)
【需要越獄】存在許多工具來執行所謂的檢測,它們主要用于在運作時中修改應用。最常見的工具:
1.Cycript(是大神saurik開發的一個非常強大的工具,可以讓開發者在指令行下和應用互動,在運作時檢視和修改應用);
2.Frida(Frida是一款基于python + javascript 的hook與調試架構,通殺android\ios\linux\win\osx等各平台,相比xposed和substrace cydia更加便捷);
3.Cydia substrate(Cydia Substrate是一個代碼修改平台。它可以修改任何主程序的代碼,不管是用Java還是C/C++(native代碼)編寫的。);
4.GDB;
5.覆寫函數的動态連接配接(LD_PRELOAD)。
Cycript
Cycript(傳送門)是大神saurik開發的一個非常強大的工具,可以讓開發者在指令行下和應用互動,在iOS運作時檢視和修改應用。 這個工具使用了Objective-C和JavaScript的混合模式,可以實時的和應用互動甚至修改應用。(一種是在越獄的裝置上通過MobileSubstrate加裝,這樣可以在所有的應用裡使用;另一種是通過靜态庫的方式把cycript內建到自己的應用,這樣做不要求越獄,當然也隻能在自己的應用内使用了。)
Cycript主要是注入你關注的那個應用的線程,然後就可以獲得app,獲得window,慢慢去獲得viewController,逐漸逐漸撥開UI的面紗。我們可以通過傳遞應用名稱或PID來啟動該工具:
cycript -p Yelp
一旦連接配接到該程序,就可以窺探應用程式的元件了:
cy# UIApp
#"<UIApplication: 0x1667a760>"
cy# [UIApplication sharedApplication]
#"<UIApplication: 0x1667a760>"
cy# UIApp.keyWindow
#"<UIWindow: 0x17bdfd70; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x17f14270>; layer = <UIWindowLayer: 0x17d23150>>"
cy# UIApp.keyWindow.rootViewController
#"<YPUITabBarViewController_iPad: 0x17c30b90>"
cy# UIApp.delegate
#"<YPUIApplicationDelegate_iPad: 0x1667fd30>"
有了這個,我們就可以手動調用某方法,或者修改目前的ViewController(視圖控制)等等。
在下面的示例中,我們假設YPUIApplicationDelegate_iPad類實作了一個名為correctCredentials的方法,該方法驗證使用者輸入的憑據,如果憑證正确,則會傳回“true”。Cycript允許在運作時中重新定義方法。在這種情況下,我們希望在調用該方法時始終傳回“true”:
cy# YPUIApplicationDelegate_iPad.prototype['correctCredentials'] = function(){return true;}
function () {return!0;}
在檢視應用程式時,我們可以在運作時中操作程序來檢查可以實作什麼類型的繞過。如果很輕松就能繞開某些功能,那麼這個應用設計肯定是有問題的。
使用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應用很可能會受到記憶體損壞漏洞攻擊,比如緩沖區溢出和字元串格式化等。在我們做審計時,模糊使用者輸入和檢查應用程式崩潰都是值得嘗試的,通過這些檢查,我們可能會發現這些應用是容易被攻擊的。如果測試裝置已經越獄,則可以通過調試手段做進一步的崩潰分析。
轉載來源:
http://www.freebuf.com/articles/terminal/123098.html
英文版:
http://www.droidsec.cn/ios-app%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1%E6%96%B9%E6%B3%95%E4%B8%8E%E5%B7%A5%E5%85%B7/