在带有 PKCE 的 OAuth 2.0 授权代码流中,是什么阻止了在第一次调用 auth 服务器时拦截代码质询?

In the OAuth 2.0 Authorization Code Flow with PKCE what prevents intercepting the code challenge on the first call to the auth server?

想象一下这次攻击

  1. 攻击者拦截对授权服务器的第一次调用,然后他们进行代码挑战。 (图中的第 1 步)
  2. 攻击者现在使用授权代码拦截来自授权服务器的响应。 (图中的第 2 步)
  3. 然后攻击者可以POST授权码和验证码来获取访问令牌。 (第 3 步)

参考这张图: 流量:

问题

  1. 是什么阻止了攻击者拦截对授权服务器的第一次调用?这就是让授权码+PKCE比隐式流更安全的意思。

  2. 也许调用是否被拦截并不重要,因为代码挑战是散列的,因此攻击者没有第二次调用所需的代码验证器。但是如果代码挑战没有被散列怎么办?

PKCE 旨在确保请求用户进行身份验证的客户端与交换授权代码以获取访问令牌的客户端相同。

与授权服务器的所有通信都使用 HTTPS,很难拦截。但是某些移动平台允许(恶意)应用程序注册与合法客户端相同的 redirect_uri。这意味着当授权服务器使用授权代码重定向回客户端时,合法客户端和恶意客户端都将使用该代码进行调用。这允许恶意客户端交换访问令牌的代码,因为没有完成客户端身份验证。

PKCE 通过在身份验证请求中包含 code_challenge 来解决此问题,这是代码验证程序的哈希值。然后它需要令牌交换调用中的实际验证者。恶意客户端没有验证器,因此无法验证自己,因此无法用代码交换令牌。

PKCE 旨在解决访问令牌/授权代码从 URL 泄露的威胁,与拦截 SSL 流量的攻击者相比,这种情况相对可能发生:

  • URL地址栏中可见
  • URL已保存在浏览器历史记录中
  • 在本机平台上,可以注册多个应用程序以使用相同的自定义 URI 方案

也就是说,它建议代码挑战是代码验证者的 SHA256 哈希,因此即使攻击者拦截代码挑战,他们也无法在无法逆转 SHA256 的情况下完成令牌交换.

另见:What is PKCE actually protecting?