在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。