如果我滥用 OAuth 2.0 进行身份验证,我是否有风险?

信息安全 验证 oauth 授权 开放式连接
2021-09-07 23:39:34

我了解OAuth 不是身份验证协议,而是授权协议(即使Google 的 OAuth 2.0 页面上的第一段不同意),以及:

[...] 授权可以被滥用成一些伪身份验证,基于如果实体 A 通过 OAuth 从 B 获得访问密钥,并将其显示给服务器 S,那么服务器 S 可能会在授予 B 之前推断出B 验证了 A访问密钥。

并且当我需要对用户进行身份验证时应该使用 OpenID。

但是,这是否意味着如果我在 Google 上实际使用 OAuth(不是OpenID Connect,而是 OAuth 2.0),是否意味着我的 Web 应用程序不安全?是否会受到损害以访问帐户或做错事?用户可以伪造一些东西来传递给另一个用户吗?

为了使这个问题不那么抽象,让我们假设

  • 我使用的库(例如Flask-OAuthPython 和其他语言的类似库)是安全的。

  • 我相信谷歌,

  • 用户的谷歌账户没有被泄露(如果用户的谷歌账户被泄露,攻击者确实可以访问我的网络应用程序上的用户账户),

  • FAI/托管服务/中间的其他人不应该被信任,

  • 任何拥有谷歌帐户的人都可以登录/注册/无论如何,

  • 我不需要用户的电子邮件地址、名字/姓氏或其他个人信息是真实的;我所需要的只是保护一个用户的数据不受其他用户的影响。

1个回答

主要问题是确保您免受混淆代理问题的影响。

想象一下,您正在使用 OAuth 对应用程序中的用户进行身份验证。

然而,一个邪恶的开发者有他们自己的应用程序,它也使用 OAuth。假设他们的应用程序是一个纸牌游戏,它使用 Google 的 OAuth API。用户使用其 Google 帐户对 Solitaire 进行身份验证。

但是,邪恶的开发者会从用户那里获得他们从 Google 获得的授权,然后将其播放到您的应用程序中。因为您使用 OAuth 进行身份验证,所以您将授权令牌作为权威声明,即用户实际上是您想要进行身份验证的用户,但事实并非如此 - 攻击者使用授权令牌作为该用户进行身份验证. 因此,攻击者滥用了您的授权,以欺骗您的应用程序,使用户实际上正在与您进行身份验证。

这个博客很好地解释了它。请注意,当我认为他们的意思是“跨站点请求伪造”时,他们使用了“跨站点脚本”一词。

audience您可以通过正确验证参数来缓解这种情况。您还应该state在回调中设置 a 并对其进行验证,因为这可以防止 CSRF 攻击对您的应用程序用户执行“登录 CSRF”攻击(例如,如果您的应用程序将数据同步到 Google,攻击者会使另一个用户看起来像登录,因为他们可以将同步的数据窃取到他们的 Google 帐户)。

另请参阅此答案