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