9
本文作者: 小芹菜 | 2015-09-20 16:30 |
【編者按】最近Xcode事件讓更多人看到了iOS系統(tǒng)也并非牢不可破,蘋果的安全神話已經(jīng)被打破。本文來自烏云知識庫,是2月份時候烏云出的分析文。盡管蘋果在iOS 9中已經(jīng)修復了這些漏洞,但并不影響這篇文章對 iOS 8.1.3 的釣魚分析。雷鋒網(wǎng)希望本文能讓讀者有所借鑒,正確看待蘋果系統(tǒng)背后潛在的威脅。
注意:本文是針對 iOS 8.1.3,iOS9已經(jīng)修復。
前言
我們?nèi)ツ?、4月份在iOS還是7.0的時候就發(fā)現(xiàn)了一個能在非越獄的iOS設備上進行釣魚的攻擊方法 (可以盜取Apple id的密碼,、gmail的密碼等),很早就報給了Apple 公司,而到現(xiàn)在Apple也沒有修復(事實上在iOS9中已經(jīng)修復)。為了緊跟Project Zero的潮流(90天的漏洞披露策略),現(xiàn)在打算公開demo和細節(jié): ??
首先我來解讀一下這個demo。在非越獄的iPhone 6 (iOS 8.1.3) 上盜取App Store密碼:?
在這個demo中,App Store是貨真價實的系統(tǒng)App,但是彈出來的登錄框不是App Store的,而是另一個在后臺運行的app偽造的。
我們知道在沙盒策略中,一個App運行在自己的沙盒空間中,理論上說是無法影響其他App的,如果能夠產(chǎn)生影響就是一個很嚴重的問題。
除了沙盒逃逸外,要讓這個demo成功還需要具備以下幾點要求:
安裝釣魚app到目標設備。
后臺無限運行并開機啟動。
檢測目標app(比如App Store)的運行狀態(tài)。
得到Apple ID的用戶名以便實施釣魚攻擊。
彈出釣魚對話框,并將用戶輸入的密碼上傳到服務器。?
如何釣魚,
1. 安裝釣魚App到目標設備
?釣魚App會使用一些特殊的API函數(shù)(后面會講到,因為這些API不屬于PrivateFrameworks,所以不確定是否是Private API),所以我們需要考慮如果App Store拒絕接受這種App的情況。
如果App Store拒絕接受的話,一般有兩個方案:
采用特殊手段繞過檢測:最簡單的方法是采用混淆和動態(tài)加載,這個是360當年最愛用的方法,后來被Apple發(fā)現(xiàn)了,所有App被迫下架了1-2年。復雜的方法請參考Usenix Security的paper:Jekyll on iOS: When Benign Apps Become Evil。這種方法是先上傳一個有溢出漏洞的App到App Store,然后采用遠程ROP Attack的方法觸發(fā)漏洞然后調(diào)用Private API。
使用企業(yè)證書或者開發(fā)者證書簽名App。這樣的話就不通過App Store,而是通過USB等方法直接安裝App到手機上。也就是PP助手,同步推使用的手法。想要做到這點很簡單,一個國外的開源庫libimobiledevice 就可以滿足你的需求。?
2.后臺無線運行并開機啟動
?這個有好幾種方案,我這里簡單介紹兩種:
如果是采用企業(yè)證書或者開發(fā)者證書傳播的話,只需要在UIBackgroundModes的plist里添加:Continuous,unboundedTaskCompletion和VOIP的屬性即可。前兩個算是private API,如果上傳到App Store是不會通過審核的。
如果想要上傳到App Store,就需要偽裝成一個VOIP類型的App,這樣的話可以做到開機啟動。隨后可以采用后臺播放無聲音樂的方法做到后臺運行.播放工具可以采用AVAudioPlayer 這個對象,然后聲明一個AudioSessionProperty_OverrideCategoryMixWithOthers的屬性。因為是MixWithothers,在面板上不會有任何顯示,用戶并不會發(fā)現(xiàn)有音樂在播放,并且其他播放器在放音樂的時候也沒有任何影響。??
3.檢測目標App(比如App Store)的運行狀態(tài)
這個也有好多方法,簡單介紹兩個:
UIDevice Category For Processes 。通過這種方法,可以獲取到當前運行的程序。Demo中就是每隔5秒鐘檢測一次當前運行的程序是否有App Store,如果有,彈出釣魚對話框。
獲取所有安裝的App的信息。使用LSApplicationWorkspace這個對象可以獲取到所有已經(jīng)安裝的App的信息。?
4.得到Apple ID的用戶名以便實施釣魚攻擊。?
5.彈出釣魚對話框,并將用戶輸入的密碼上傳到服務器。
正常的對話框是采用UIAlertView這個類,但是用這個類產(chǎn)生的對話框只能在自己App的view上顯示。但如果采用CoreFoundation 這個framework (非private framework)中的CFUserNotificationCreate()和 CFUserNotificationReceiveResponse()方法的話,一個App就可以跳出沙盒的限制,并且在別的app界面上彈出自己的對話框。
比如下圖,第一個是真正的對話框,而第二個是我偽造的。為了區(qū)分,我故意把K變成了小寫。通過CFUserNotificationCreate()這個API,我們可以偽造很多應用的登陸對話框,不光是App Store,還可以是YouTube,Gmail,天貓等等。因為偽造的對話框和真實對話框沒有任何區(qū)別,用戶中招的幾率會變得非常大。
這個API本來是為Mac OS X設計的,但是因為iOS和Mac OS X共用了一些基本的底層框架,但是在iOS并沒有屏蔽這個API接口,也沒有做任何的權(quán)限檢測,最后導致了沙盒逃逸。?
(真正的對話框)
(偽造的對話框)
結(jié)語
人們往往認為iOS比Android安全,所以在使用蘋果手機的時候格外大膽,但事實并非如此。通過幾個漏洞的combo,黑客們可以很容易的騙取你的帳號密碼。更恐怖的是,本文所展示iOS漏洞也只是冰山一角。關(guān)于更多關(guān)于iOS遠程控制,監(jiān)控等漏洞的利用等,可以關(guān)注烏云知識庫。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。