如果 Oauth 中的授权码泄露怎么办

Posted

技术标签:

【中文标题】如果 Oauth 中的授权码泄露怎么办【英文标题】:What if authorization code in Oauth is leaked 【发布时间】:2018-12-06 16:08:39 【问题描述】:

一旦我成功登录到身份验证服务器,服务器就会使用授权代码重定向回应用程序。然后这个授权码用于在后端获取访问令牌。我怀疑是否有人在我使用授权码之前看到/捕获或复制了我的授权码。然后他也可以使用我的凭据登录。我想知道,我的想法是否正确?或者我在此过程中遗漏了一些安全流程。

编辑:我最关心的情况是有人在我的浏览器历史记录中看到了授权代码,然后他从其他机器发送此代码以获取访问令牌。我们怎样才能防止它。

【问题讨论】:

【参考方案1】:

您是对的:这就是为什么在 OAuth 2.0 中应该是一个固定的、注册的回调 URI,客户端在该 URI 上接收授权码,由 OpenID Connect 等配置文件强制执行。规范的安全考虑部分更深入地分析了授权码概念的风险:https://www.rfc-editor.org/rfc/rfc6749#section-10.5

【讨论】:

所以如果授权码在授权服务器发送给用户之后但在客户端触发交换之前被捕获,并且捕获代码的邪恶用户,在他自己的用户代理中触发对客户端在合法用户之前使用代码,客户端执行交换,现在邪恶用户已经获得了对客户端的访问权限。通常代码发送不安全的http,那么如何缓解这种情况? "state" 用于防止这种情况,并将请求/响应加密绑定到用户的浏览器,请参阅tools.ietf.org/html/rfc6749#section-4.1.1 非常感谢,也发现这很有用***.com/questions/35165793/… @Ron87k 您能否解释一下使用状态如何降低不良行为者在浏览器历史记录中捕获身份验证代码的风险?据了解,状态有助于确保我的 SPA 不会将身份验证代码转发到我的后端服务器,方法是确保请求不是由不良行为者发起的。我看不出它如何帮助那个坏演员观察该身份验证代码,并向我的后端服务器发出他们自己的请求(卷曲)。【参考方案2】:

您客户的秘密is required 用于交换访问令牌的授权码。因此,如果您在后端保密您的客户端,攻击者可能能够捕获您的授权码,但无法获得访问令牌。

然后,很大程度上取决于您的重定向 uri。如果它属于您的服务器,则为 https(因此攻击者将无法 listen the traffic)并且您的服务器不允许 OpenRedirect - 攻击者可能无法捕获代码。

接下来,授权码应该是single-use。因此,如果攻击者在您的浏览器历史记录中发现了该代码 - 此代码可能已被交换为令牌 - 这就是它无法再次使用的原因。

请注意,这里我假设 OAuth 2.0 设计良好。忽略 RFC 4749 要求的 OAuth 2.0 实现可能会受到各种各样的攻击。

【讨论】:

不需要客户端密码,即对于公共客户端;另外:攻击者可能会窃取代码并将其呈现给原始客户端,以进行所谓的“混淆代理”攻击 您当然是对的:公共客户端不需要客户端密钥(或不安全地存储它);他们通常也有不安全的重定向 uri(即使用自定义 urlscheme)。但据我了解,@Avaneesh Kumar 所描述的情况并非如此。对于这种情况,关于混淆副攻击的观点是有效的,感谢您的澄清。

以上是关于如果 Oauth 中的授权码泄露怎么办的主要内容,如果未能解决你的问题,请参考以下文章

一图搞定Oauth2.0授权码模式

OAuth 2.0

OAuth 2.0

OAuth 2.0

#yyds干货盘点# OAuth2.0授权码模式实战

认证开发+Oauth2(授权码)模式+Spring Security+网关解说