关于iOS应用URL Schemes相同的问题
iOS可以使用URL Schemes进行应用间的通信,例如我们可以通过 weixin:// 来打开微信,或者通过 alipay:// 来打开支付宝。
其实,我们也可以将我们自己开发的应用的 URL Schemes 设置为 weixin:// 或者 alipay:// ,也就是说,对于不同的app,这个 URL Schemes 可以是相同的,苹果并没有像 BundleID 那样进行限制。这就导致一个问题,如果一个app想进行微信登录,而这个手机上有多个app都有相同的 URL Schemes:weixin:// ,那么哪个应用会被打开呢?这个苹果没有明确说明,但可以确定的是,苹果自己的相应 URL Schemes 的应用会被打开,如果不是苹果自己的应用,那么可能会根据bundleID,也可能会根据安装顺序。
URL Scheme 劫持和钓鱼攻击
想象这样一种场景:你的手机上不小心安装了一个恶意应用 FakeWX,该应用设置了和微信相同的 URL Schemes:weixin://,它的 bundleID 也经过精心设计,能够保证优于微信被调起。现在假如要在美团上使用微信登录,则会调起 FakeWX,并将整个url传给 FakeWX,而 FakeWX 伪装成和微信一模一样的登录页面诱使你输入自己的用户名和密码,点登录后,你的微信用户名和密码以及刚才获取的url将传给黑客后台,这样就造成了你的微信密码泄漏。
这还没有结束,黑客后台还会把这个url传给黑客手机上的应用 FakeMT,而 FakeMT 的 URL Schemes 与美团的设置一致。FakeMT 会通过这个url打开微信并用你的微信帐号密码进行登录,因为 FakeMT 的 URL Schemes 和美团的设置一致,所以之后微信会回调一个用于微信登录的url给 FakeMT。FakeMT 再通过后台将该url传给你手机上的 FakeWX,然后 FakeWX 通过这个url打开美团实现微信登录。如果你没有注意到微信登录时打开的是一个“钓鱼app”,那么黑客就在你不知情的情况下窃取了你的微信密码。
还有一种场景:你的手机上不小心装了个一个恶意应用 FakeMT,该应用设置了和美团相同的 URL Schemes,它的 bundleID 也经过精心设计,能够保证优于美团被调起。现在假如在美团上点击微信登录,打开微信,之后微信会回调一个用于微信登录的url,由于 FakeMT 的 URL Schemes 和美团设置一致且会优于美团被调起,则这个url将会传给 FakeMT。然后 FakeMT 将该url通过黑客后台传给黑客手机上的应用 FakeApp,FakeApp通过这个url来打开并登录黑客手机上的美团。
解决方案:
针对第一种场景的“钓鱼攻击”:需要用户在进行第三方登录/支付的时候注意是否调起了正确的app。
针对第二种场景:拿美团进行微信登录来举例。在美团中点击微信登录,打开微信后,微信将按照一定的规则生成一个字符串A(这个规则在同一台设备上生成的字符串相同,不同的设备上不同),并将其保存在微信后台。之后微信回调一个url(这个url里不包含字符串A)到美团,然后美团中的微信SDK按照同样的规则生成一个字符串B,并将其同url中的oauth信息一起传给微信后台,微信后台判断如果字符串A和字符串B不相同则认为存在安全问题而登录失败。