为什么开发人员使用嵌入式用户代理进行 3rd 方身份验证?有哪些替代方案?

信息安全 网页浏览器 中间人 oauth 网络钓鱼 账户安全
2021-08-11 07:08:02

近年来,随着 OAuth 的出现(它也可能影响其他框架),我注意到移动和桌面应用程序出现了一种趋势,即请求用户使用 3rd 方身份验证提供程序(通常是 Twitter 等社交帐户)注册或登录,脸书或谷歌。当我无法信任正在输入凭据的应用程序时,问题就出现了,因为开发人员已将浏览器嵌入到应用程序拥有的对话框/窗口中,而我无法知道我正在查看的页面是否是合法的登录页面,或者用户代理(浏览器和顶层)是可以信任的。

我也不是在谈论来自小型独立开发者的应用程序,我说的是广受信任的公司的软件(至少在我花费大部分时间的软件开发社区中)。我在过去几周看到的一些例子:

  • Atlassian Sourcetree允许您使用 Google 帐户登录 - 在 Atlassian 窗口中
  • Postman Google 登录发生在 Postman 窗口中
  • Microsoft Visual Studio 和 Office 使用您的 Microsoft 帐户执行此操作(当然,这更受信任,因为该应用程序归身份验证提供商所有,但它仍然认可该过程)
  • 例如,某些应用程序会要求您在其应用程序内的浏览器窗口中登录 Paypal

过去关于移动应用程序的类似问题(但问题不仅限于移动):

与桌面应用程序相关的一个问题:

切线相关的是在 Web 应用程序中使用 iframe:

当我从应用程序空间转移到网络以进行身份​​验证、获取令牌并返回应用程序时,这对我来说是一个信任问题。我可能足够信任这些公司来安装他们的软件,但不足以将我的 Google 帐户的主密钥(出于所有意图和目的)输入到他们的软件中。

在进一步研究这个问题时,我发现这个 IETF 草案指出:

嵌入式用户代理是授权本机应用程序的另一种方法。但是,根据定义,它们对于授权服务器的第三方使用是不安全的,因为托管嵌入式用户代理的应用程序可以访问用户的完整身份验证凭据,而不仅仅是用于应用程序的 OAuth 授权授权。

编辑:上面的草案成为RFC8252,日期为 2017 年 10 月,感谢@Geir 指导我。

还有一个较旧的指令 RFC6749(日期为 2012 年 10 月),其中还提到了其他有趣的花絮:

嵌入式用户代理带来了安全挑战,因为资源所有者在一个身份不明的窗口中进行身份验证,而无法访问大多数外部用户代理中的视觉保护。嵌入式用户代理教育最终用户信任身份不明的身份验证请求(使网络钓鱼攻击更容易执行)。

我的问题:

  1. 我是否担心这是网络钓鱼和 MITM 攻击的增长机会(中间的假冒或劫持浏览器实时窃取凭据和/或令牌,也击败了 2FA)?与其说受信任的软件本身很可能是恶意软件,不如说是广泛使用会阻止用户验证端到端信任,纵容(甚至鼓励)用户盲目地将凭据输入到任何需要它们的应用程序中?

    我认为上面引用的最后一部分无疑是肯定的,但我对进一步的评论和观点感兴趣,尤其是作为一名软件开发人员。

  2. 明显的“正确”方法是将用户转发到他们受信任的浏览器进行身份验证,但这可能是一个糟糕的用户体验,并且实际上并不能解决问题(恶意开发人员可以从主窗口打开一个窗口)看起来像 Chrome 的应用程序,但实际上不是——事实上,来自主浏览器窗口的用户会话没有被保留,以及其他视觉提示可能会被大多数人忽视)。

    是否有更好的方法来设计应用程序的用户体验,以便用户可以确定他们在应用程序内使用受信任的软件堆栈(应用程序和渲染引擎)?是否应该以难以模仿的方式对此类身份验证请求进行设备级或系统级处理?

  3. 我并没有真正涉足安全领域,只是一个潜伏者,这是业内众所周知的问题吗?是否有努力遏制这种身份验证流程?

3个回答
  1. 我是否担心这是网络钓鱼和 MITM 攻击的增长机会(中间的假冒或劫持浏览器实时窃取凭据和/或令牌,也击败了 2FA)?与其说受信任的软件本身很可能是恶意的,不如说是广泛使用会阻止用户验证端到端信任,而不是盲目地将凭据输入任何需要它们的应用程序?

    你是正确的100%。最后,大多数用户希望网站是相似的。如果每个网站都有一个绿色挂锁,用户会注意到红色的大安全警告。当每个网站都询问用户的电子邮件等时,用户开始不假思索地分发他们的联系信息。

    同样,当越来越多的应用程序使用应用程序内浏览器请求凭据时,用户也会“脱敏”。希望这不会导致用户最终在不眨眼的情况下跨服务共享凭据,但在最坏的情况下可能会。

  2. 显而易见的“正确”方法是将用户转发到他们受信任的浏览器进行身份验证,但这可能会带来糟糕的用户体验

    这两种说法都是正确的。

    并且实际上并没有解决问题(恶意开发人员可以从主应用程序打开一个看起来像 Chrome 的窗口,但事实并非如此 - 来自主浏览器窗口的用户会话没有被保留,以及其他视觉提示可能会消失大多数人都没有注意到)。

    可悲的是,这也是事实,尽管在这一点上,在大多数情况下,它是普通的网络钓鱼。恶意软件也可能将用户发送到钓鱼网站:/

  3. 是否有更好的方法来设计应用程序的用户体验,以便用户可以确定他们在应用程序内使用受信任的软件堆栈(应用程序和渲染引擎)?

    我不这么认为,很遗憾。

    是否应该以难以模仿的方式对此类身份验证请求进行设备级或系统级处理?

    这是非常有趣的。SE 上的一个相关问题在涉及系统级登录提示时讨论了此问题。它的要点是当前的实现/使用中的解决方案不存在,但一些有趣的想法包括关闭不属于系统的窗口的快捷方式/按钮。这样,系统可以说“按 XYZ 继续”,除非它确实是系统,否则窗口会关闭并且不会发送凭据。

    在这种特定情况下,操作系统可能具有具有与上述类似功能的系统浏览器实例。这个浏览器可以是一个单页、无超链接浏览、仅用于登录的 HTML/css/js 渲染器/解析器,带有用于 OAuth 的简单 api。

    我并没有真正涉足安全领域,只是一个潜伏者,这是业内众所周知的问题吗?

    网络钓鱼的问题(或至少应该)始终是一个问题,但这是我个人第一次在 OAuth 等的背景下想到它。

    是否有努力遏制这种身份验证流程?

    我不知道有任何努力来防止这种攻击,但 u2f 硬件智能卡(如yubikeys)将 2fa 令牌加密到设置它们的特定网站。这可以防止网络钓鱼,但仍然不能阻止恶意/假冒浏览器窃取用户名、密码等。此外,恶意(应用内)浏览器可能会在用户登录后窃取会话 cookie。


为应用程序开发人员提出的解决方案

OAuth 应该通过用户的默认浏览器完成,而不是应用内

操作系统开发人员可能的解决方案

如上所述,操作系统理论上可以为 OAuth 等提供受信任的输入方法。这也可以扩展 OAuth 以允许用户轻松安全地登录服务,如 cli 中的 git 等。

这是一个令人担忧的问题,尽管(我相信)现在才被广泛认可。例如,关于 OAuth2 的 RFC 8252 声明:

来自本机应用程序的 OAuth 2.0 授权请求只能通过外部用户代理(主要是用户的浏览器)发出。https://www.rfc-editor.org/rfc/rfc8252)。

不是一个完整的答案,但我想补充一点,U2F使来自浏览器的身份验证几乎不可钓鱼。如果要使用它,您的“正确”策略实际上会成为一种安全策略。使用 U2F,用户无需在浏览器中输入密码。取而代之的是浏览器和 U2F 身份验证器(协议摘要之间的安全握手。U2F 最大的问题是企业没有动力投资该选项。