在iOS上,一個應用可以將其自身“綁定”到一個自定義URL Scheme上,該scheme用於從浏覽器或其他應用中啟動該應用。如果是有用過《Launch Center Pro》和《Workflow》這類App的朋友,應該多少明白URLScheme的原理。
在正常的支付流程中,某個App(視頻上是美團)首先將訂單信息通過URL Scheme發送給支付寶(Alipay),支付寶收到訂單信息,調用支付界面,用戶在支付寶上完成支付後,支付寶再發送一個URL Scheme給美團,美團收到付款信息後,顯示團購成功的界面。
在iOS系統中,多個應用程序注冊了同一種URLScheme的時候,iOS系統程序的優先級高於第三方開發程序。但是一種URLScheme的注冊應用程序都屬於第三方開發,那麼它們之間就沒有優先級了。作者經過測試,證明系統判定優先級順序與Bundle ID有關(一個Bundle ID對應一個應用),如果有人精心偽造Bundle ID,iOS就會調用我們App的URL Scheme去接收相應的URL Scheme請求。
劫持過程:
演示視頻中“偽裝”成支付寶的“FakeAlipay”,在收到美團發來的訂單信息後,生成了一個和支付寶一樣的登陸界面,用戶在輸入帳號密碼後FakeAlipay 會把帳號密碼以及訂單信息發送到黑客的服務器上,黑客獲得這些信息後可以在自己的iOS設備上完成支付,並把支付成功的URL Scheme信息發回給FakeAlipay,FakeAlipay再把支付成功的URL Scheme信息轉發給美團。這樣就完成了一次被劫持的支付。
作者建議:(參考烏雲原文及視頻介紹)
作者在文章中表示該漏洞利用簡單,修復卻非常復雜,所以在 iOS 8.2 上還是未能修復。但他還是提出了幾點建議讓開發者參考:
1.蘋果可以限制 iOS 應用不能注冊別的應用的 Bundle ID 作為 URL Scheme。這樣的話,使用自己的 Bundle ID 作為 URL Scheme 的接收器就會變的安全很多。
2.第三方應用可以通過①給自己發送 URL Scheme 請求來證明沒有被劫持,如果沒有收到自己的 URL Scheme,就可以及時給用戶發送提醒;②利用 MobileCoreServices 服務中的 applicationsAvailableForHandlingURLScheme() 來查看所有注冊了該 URL Schemes 的應用和處理順序,從而檢測自己、或者別人的 URL Scheme 是否被劫持。
果粉們只能等待官方新出的版本,更新BUG。