此前有人統計過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來啟動:
python needle.py
Needle需要一些選項才能連接到iOS設備(需要在其上運行OpenSSH服務器)。在下麵的例子中,iOS設備的IP是192.168.2.3,並且我們需要連接到默認SSH埠22,並使用metadata(中繼資料)模塊選取一些基本的資訊。
set IP 192.168.2.3
set PORT 22
use metadata
run
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
Architectures : armv7, arm64
Platform Version : 9.3
SDK Version : iphoneos9.3
Minimum OS : 8.0
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
Architectures :armv7,arm64
Platform Version :9.3
SDK Version :iphoneos9.3
Minimum OS :8.0
應用加密
[需要越獄]眾所周知,所有在Apple Store上的應用都受到蘋果二進位加密方案的保護(這也是為什麼大家會說蘋果應用比安卓應用好用的地方)。Needle允許對應用進行解密,並拉取本地解密的IPA。
Dumpdecrypted是一個解密iOS應用程序二進位檔案的好工具。使用方法如下:
DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
lipo -info Yelp.decrypted
將會得到如下的結果:
Architectures in the fat file: /private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp are: armv7 arm64
otool -vh Yelp.decrypted
運行otool命令得到的結果(otool可以選取並顯示iOS下目標檔案的相關資訊,包括頭部,加載命令,動態庫等,是一個强大的分析工具,當然也可以做反彙編工具):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0x00 EXECUTE 116 9800 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
(architecture arm64):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 116 10584 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
馬赫割臺
magic cputype cpusubtype caps檔案類型ncmds sizeofcmds標誌
MH_魔臂V7 0x00執行116 9800 NOUNDEFS DYLDLINK二級弱定義
把你綁在軟弱的餡餅上
/私有/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
(架構arm64):
馬赫割臺
magic cputype cpusubtype caps檔案類型ncmds sizeofcmds標誌
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 116 10584 NOUNDEFS DYLDLINK二級弱定義
把你綁在軟弱的餡餅上
裏波
lipo -thin armv7 -output Yelpv7 Yelp.decrypted
現在,我需要確認新的可執行文件只支持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頭,敏感資訊就可能會被存儲在設備上。值得注意的是,存儲在此檔案中的緩存數據並未加密。
MobFS(工具)
【需要越獄】MobFS是一個對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>"
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;}
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應用很可能會受到記憶體損壞漏洞攻擊,比如緩衝區溢位和字串格式化等。在我們做稽核時,模糊用戶輸入和檢查應用程序崩潰都是值得嘗試的,通過這些檢查,我們可能會發現這些應用是容易被攻擊的。如果測試設備已經越獄,則可以通過調試手段做進一步的崩潰分析。
*參攷來源:research,latiaojun含淚編譯,轉載請注明來自Freebuf.COM。