@
szzys @
Zy143L @
Senorsen @
AkaHanshan @
ShikiSuen @
tinytian @
liveoppo @
bksv @
morax0xyc 我仔细调研和思考了一下 WebView 通过 SSO 登录这个安全模型,并且跟几个搞安全的朋友讨论了一下。我觉得这种钓鱼方式确实很有迷惑性,但本质上这里苹果的实现是没有安全漏洞的。
具体可以分成两部分讨论,一部分是 WebView 可以通过 SSO 登录是否有问题,第二部分是 SSO 登录是否应该允许绕过 2FA 。
关于第一部分,任意的 app 使用 WebView 加载网页,当网页需要跳转到第三方应用进行登录的时候,进行登录这个行为本身是很正常并且常见的。比方说,你在手机上 [Chrome 浏览器] 应用里面打开 [QQ 空间] 网页的时候,可以点击「通过 QQ 登录」按钮,这时 [QQ] 应用会被唤起,问你「是否使用当前账号来登录 [QQ 空间] 」。这是一个非常标准的 SSO 逻辑。
然后我换成另一个例子,你在手机上下载了一个 [超级单车] app ,然后它的首屏有「通过 QQ 登录」按钮,点击之后 [QQ] 应用被唤起,问你「是否使用当前账号来登录 [腾讯云] 」,你点了确认登录,然后你的腾讯云服务器被盗了。这个例子中问题在哪?在于用户没有意识到正在登录的是腾讯云就进行了授权。这里的 SSO 模型是没有安全漏洞的,唤起 QQ 应用来请求登录腾讯云这件事本来就是每个 app 都能做到的,不应该禁止也没有方便的方案可以禁止。
在本帖的案例中, [菜谱] 应用就是上面例子中的 [超级单车] , [Apple ID] 就对应 [QQ] , [
appleid.apple.com] 就对应 [腾讯云] 。注意看楼主发的第一张图,写的清清楚楚是「你要通过 Apple ID 登录
appleid.apple.com 吗?」,就跟上面说的「你要使用 QQ 号登录腾讯云吗?」是完全一样的道理。用户没有认真看好登录的目标,就点了确认,这就是 user error ,而并非是苹果 SSO 的安全漏洞。当然,我承认这里对普通用户确实有很高的迷惑性。这里「通过 Apple ID 登录
appleid.apple.com 」其实更像「使用 QQ 号登录网页版 QQ 」,但其内在逻辑跟上面超级单车的例子是一样的。
这里我想强调一点,就是苹果账号在我的讨论中并没有什么特殊之处。就算你禁止了 WebView 来使用 Apple 的 SSO ,接下来就会有恶意 app 内嵌一个淘宝网页,唤起你的支付宝来登录淘宝,甚至唤起你的支付宝来登录支付宝网页版(我不知道实际上有没有这个登录渠道,但这里只是举例子来说明问题,有大量的 app 都有类似逻辑)。对于这种 Apple ID 之外的场景,其实 WebView 也并非必须的组件,恶意应用完全可以在 app 里面模拟登录的过程,甚至在服务器上跑个 headless 浏览器来转发请求都是可以的。
除了 SSO 这种授权登录钓鱼,还有很多类似的钓鱼方法也看起来像是安全漏洞其实不是。例如你下载了一个 [超超级单车] app ,然后 app 要求手机号登录,输入手机号之后,手机收到验证码:「 [腾讯云] 你的登录验证码是 123456 」。如果你输入了验证码,这个 app 理所当然就可以登录你的腾讯云后台,而且这种情形从腾讯云和手机运营商的角度都是无法彻底防止的。如果把 [腾讯云] 换成你不熟悉的 [XX 科技] ,其实还真就不好辨别,说不定这个 app 后台就是在用你的手机号登录某个网贷平台呢。
(题外话:我觉得国内运营商强制平台短信必须有方括号前缀,并且不能伪造前缀,从安全模型角度这是非常好的实践。我之前用 +1 手机号注册一些小众平台的时候,就遇到过没有任何前缀的验证码短信,这种验证码我根本不敢输入,因为理论上它完全有可能把验证码请求 proxy 到了另一个平台的验证码接口,偷偷在用我手机号登录其他平台。另外,我认为所有的人脸验证都应该要求用户读出平台的名字,不然一个恶意应用就可以直接靠 proxy 这种方式在后台偷偷进行另一个平台的人脸验证。感觉绝大部分用了人脸验证的 app 开发者都没有意识到这里的鉴权安全模型问题,可能需要做安全的人来多多宣传一下。)
回到第二个问题,SSO 登录是否应该允许绕过 2FA ?这个问题我看了一下我常用的国内外账号,其实很多账号进行授权登录/扫码登录另一台设备的时候都是不要求输入 2FA 验证码或者(对于国内平台)短信验证码的。我觉得这里确实可以加强一下安全性,但是苹果现在的逻辑显然算不上是安全漏洞或者缺陷。
综上,我个人觉得本帖的问题虽然迷惑性确实很强,但还是应该算 user error ,并非安全漏洞。如果加缓解措施的话,只是缓解了一个特定的钓鱼方式而已,如果用户一直不理解 SSO 授权时应该检查的东西,那么还是不能彻底防止类似问题在其他平台或者其他场景下再次发生。