Skip to content

7.13. 减少授权服务器混淆攻击

混淆攻击的发生场景是,OAuth 客户端与两台或多台授权服务器交互,并且至少一个授权服务器由攻击者控制。例如,如果攻击者使用动态注册,在他自己的授权服务器上注册客户端,或者某台授权服务器沦陷,那么就会出现这种攻击。

当 OAuth 客户端只能与一台授权服务器交互时,混淆攻击防御不是必需的。然而,在 OAuth 客户端与两台或多台授权服务器交互时,客户端就必须防止混淆攻击。下面探讨了两种不同的防御方法。

对于两种防御,客户端都必须为每个授权请求存储其发送给的颁发者,将此信息绑定到用户代理,并检查是否从正确的颁发者处接收到了授权响应。客户端必须确保后续的访问令牌请求(如果适用)是发送给同一个颁发者。通过相关元数据,颁发者作为流程中使用的授权端点和令牌端点组合的抽象标识符。如果没有可用的颁发者标识符,例如,既没有使用 OAuth 元数据 [RFC8414],又没有使用 OpenID Connect 发现 [OpenID.Discovery],那么可以使用该元组的不同的唯一标识符,或者元组本身。为了简洁起见,下面将这种部署特定的标识符统一归为颁发者(或颁发者标识符)。

说明:只存储授权服务器的 URL 不足以识别出混淆攻击。攻击者可能将一台未沦陷的授权服务器的授权端点 URL 声明为“他们”的授权服务器 URL,但又声明一个由自己控制的令牌端点。

关于若干种混淆攻击的详细描述,见 [I-D.ietf-oauth-security-topics] 的第 4.4 节。

7.13.1 基于颁发者身份的混淆攻击防御

这种防御要求授权服务器在返回给客户端的授权响应中,发送他的颁发者身份。当接收到授权响应时,客户端必须比对接收到的颁发者身份和存储的颁发者身份。如果不匹配,客户端必须中止交互。

有多种方式可以将颁发者身份传输给客户端。

  • 例如,颁发者信息可以通过可选的响应参数 iss(见第 4.1.2 节)进行传输。
  • 当使用 OpenID Connect,并且授权响应中返回了 ID 令牌时,客户端可以评估 ID 令牌中的 iss 声明。

在两种情况下,iss 的值必须根据 [RFC9207] 进行评估。

虽然这种防御需要使用额外的参数,以传输颁发者信息,但是它比较健壮,并且相对容易实现。

7.13.2. 基于唯一重定向 URI 的混淆攻击防御

在这种防御中,客户端必须对于每个有交互的颁发者,使用唯一的重定向 URI。

客户端必须通过比较颁发者的唯一重定向 URI 和接收到授权响应的 URI,检查授权响应是否从正确的颁发者处接收到。如果不匹配,那么客户端必须中止流程。

虽然这种防御建立在现有 OAuth 功能的基础上,但它不能用于客户只注册一次就能使用许多不同颁发者的情况(如某些开放银行方案)。而且,由于它与客户端的注册紧密耦合,这种防御更难以自动部署。

此外,攻击者可能通过使用客户端分配给攻击者的授权服务器的重定向 URI,在“诚实”的授权服务器上注册新客户端,从而规避这种防御所提供的保护。然后,攻击者就可以发起上述攻击,用新创建客户端的客户端 ID 替换原有的客户端 ID。

因此,只有在没有其它选择的情况下,才应该使用这种防御方法。

本站使用 Vitepress 构建