在非越獄的 iPhone 6 上,如何盜取你 的App Store 密碼?

作者 | 發布日期 2015 年 09 月 21 日 8:30 | 分類 app , iOS , 資訊安全 follow us in feedly

注意:本文是針對 iOS 8.1.3,iOS 9 已經修復。2014 年 3、4 月份在 iOS 還是 7.0 的時候就發現了一個能在非越獄的 iOS 設備上進行釣魚的攻擊方法 (可以盜取 Apple ID 的密碼,、Gmail的密碼等),很早就報給了Apple 公司,而到現在 Apple 也沒有修復(事實上在 iOS9 中已經修復)。為了緊跟 Project Zero 的潮流(90 天的漏洞披露策略),現在打算公開 demo 和細節:




首先我來解讀一下這個 demo。在非越獄的 iPhone 6 (iOS 8.1.3) 上盜取 App Store 密碼:

在這個 demo 中,App Store 是貨真價實的系統 App,但是彈出來的登錄框不是 App Store 的,而是另一個在後台執行的 app 偽造的。

我們知道在沙盒策略中,一個 App 執行在自己的沙盒空間中,理論上說是無法影響其他 App 的,如果能夠產生影響就是一個很嚴重的問題。

除了沙盒逃逸外,要讓這個 demo 成功還需要具備以下幾點要求:

  • 安裝釣魚 app 到目標設備。
  • 後台無限執行並開機啟動。
  • 檢測目標 app(比如 App Store)的執行狀態。
  • 得到 Apple ID 的用戶名以便實施釣魚攻擊。
  • 彈出釣魚對話框,並將用戶輸入的密碼上傳到伺服器。

如何釣魚

1. 安裝釣魚App到目標設備

釣魚 App 會使用一些特殊的 API 函數(後面會講到,因為這些 API 不屬於 PrivateFrameworks,所以不確定是否是 Private API),所以我們需要考慮如果 App Store 拒絕接受這種 App 的情況。

如果 App Store 拒絕接受的話,一般有兩個方案:

  • 採用特殊手段繞過檢測:最簡單的方法是採用混淆和動態加載,這個是 360 當年最愛用的方法,後來被 Apple 發現了,所有 App 被迫下架了 1-2 年。複雜的方法請參考 Usenix Security 的 paper:Jekyll on iOS: When Benign Apps Become Evil。這種方法是先上傳一個有溢出漏洞的 App 到 App Store,然後採用遠程 ROP Attack 的方法觸發漏洞然後調用Private API。
  • 使用企業證書或者開發者證書簽名 App。這樣的話就不通過 App Store,而是通過 USB 等方法直接安裝 App 到手機上。也就是 PP 助手,同步推使用的手法。想要做到這點很簡單,一個國外的開源庫 libimobiledevice 就可以滿足你的需求。

2.後台無限執行並開機啟動

這個有好幾種方案,我這裡簡單介紹兩種:

如果是採用企業證書或者開發者證書傳播的話,只需要在 UIBackgroundModes 的 plist 裡添加:Continuous,unboundedTaskCompletion 和 VOIP 的屬性即可。前兩個算是 private API,如果上傳到 App Store 是不會通過審核的。

如果想要上傳到 App Store,就需要偽裝成一個 VOIP 類型的 App,這樣的話可以做到開機啟動。隨後可以採用後台播放無聲音樂的方法做到後台運行,播放工具可以採用 AVAudioPlayer  這個對象,然後聲明一個 AudioSessionProperty_OverrideCategoryMixWithOthers 的屬性。因為是 MixWithothers,在面板上不會有任何顯示,用戶並不會發現有音樂在播放,並且其他播放器在放音樂的時候也沒有任何影響。

3.檢測目標 App(比如 App Store)的執行狀態

這個也有好多方法,簡單介紹兩個:

  • UIDevice Category For Processes :通過這種方法,可以獲取到當前運行的程序。Demo 中就是每隔 5 秒鐘檢測一次當前執行的程式是否有 App Store,如果有,彈出釣魚對話框。
  • 獲取所有安裝的 App 的訊息。使用 LSApplicationWorkspace 這個對象可以獲取到所有已經安裝的 App 的訊息。

4 .得到 Apple ID 的用戶名以便實施釣魚攻擊。

5.彈出釣魚對話框,並將用戶輸入的密碼上傳到伺服器。

正常的對話框是採用 UIAlertView 這個類別,但是用這個類產生的對話框只能在自己 App 的view上顯示。但如果採用 CoreFoundation 這個 framework (非 private framework)中的CFUserNotificationCreate() 和 CFUserNotificationReceiveResponse() 方法的話,一個 App 就可以跳出沙盒的限制,並且在別的 app 界面上彈出自己的對話框。

比如下圖,第一個是真正的對話框,而第二個是我偽造的。為了區分,我故意把 K 變成了小寫。通過 CFUserNotificationCreate() 這個 API,我們可以偽造很多應用的登錄對話框,不光是 App Store,還可以是 YouTube、Gmail、天貓等等。因為偽造的對話框和真實對話框沒有任何區別,用戶中招的幾率會變得非常大。

這個 API 本來是為 Mac OS X 設計的,但是因為 iOS 和 Mac OS X 共用了一些基本的底層框架,但是在 iOS 並沒有屏蔽這個 API 接口,也沒有做任何的權限檢測,最後導致了沙盒逃逸。

55fe599fd60b9

▲ 真正的對話框

55fe59ad0143d

▲ 偽造的對話框

結語

人們往往認為 iOS 比 Android 安全,所以在使用蘋果手機的時候格外大膽,但事實並非如此。通過幾個漏洞的 combo,黑客們可以很容易的騙取你的帳號密碼。更恐怖的是,本文所展示 iOS 漏洞也只是冰山一角。關於更多關 於iOS 遠程控制,監控等漏洞的利用等,可以關注烏雲知識庫。


最近Xcode事件讓更多人看到了iOS系統也並非牢不可破,蘋果的安全神話已經被打破。本文來自烏雲知識庫,是2月份時候烏雲出的分析文。盡管蘋果在iOS 9中已經修復了這些漏洞,但並不影響這篇文章對 iOS 8.1.3 的釣魚分析。雷鋒網希望本文能讓讀者有所借鑑,正確看待蘋果系統背後潛在的威脅。 

關鍵字: , ,

發表迴響