OpenID Connect 服务器流中的 "state" 参数可以防止什么攻击?
What attack does the "state" parameter in OpenID Connect server flow prevent?
不确定哪种 CSRF 攻击会阻止 OpenID Connect 服务器流中的 "state" 参数。有人可以给我举个例子吗?
它可以防止攻击者产生伪造的身份验证响应的攻击,例如通过向客户端的重定向 URI 发送 code
作为基本客户端配置文件的一部分。例如:在对用户进行网络钓鱼之后,攻击者可以注入一个被盗的 code
,它将以这种方式与当前用户相关联。 state
将请求和响应相关联,因此在不知道请求中使用的 state
参数的情况下,不可能主动制作响应。
通过比较授权请求和响应的 state
值,我们的想法是能够验证授权响应与请求相关。
到目前为止一切顺利;但是,是什么阻止对手使用从良性用户那里窃取的授权代码来伪造授权响应呢? OpenID 客户端无法验证授权码是否与 state
值相关。恕我直言,最好在授权请求中使用 nonce
字段,因为一旦交换了授权代码,它就会在签名的 id_token
中回显。现在,OpenID 客户端可以明确地将 id_token
(授权证明)与授权请求相关联。
通过这种方式,我们可以减轻 CSRF 和重放攻击。还是我在这里忽略了什么?
老实说,我有点不明白为什么 OpenID Connect specs "recommends" 使用 state
但留下 nonce
可选。
该建议来自 OAuth2,遵循它会阻止支持 "IdP-initiated" 流程的能力。
OIDC 完全是关于 SSO 进入 RP(依赖方;又名 "Client")系统,因为它们在 IdP(身份提供者;又名 "Provider")系统中经过身份验证---两个系统之间有一些后端信任设置。
所以你有一个 "Authentication Request"。这是从 RP 到 IdP 的重定向;它在 Url 的查询字符串中有 "scope=openid"。然后你有一个 "Authentication Response";它在 Url 的查询字符串中有 "code=XXXXX"。在这两个的GET请求中,browser/end-user在RP眼中是匿名的。只有在 RP 验证 "code"(在后端)后,RP 才会将身份(身份验证)分配给浏览器。
这意味着如果 RP 的应用程序在浏览器中存储该 State 值以唯一标识它,则可以使用 仅 State 方式来尝试防止 CSRF。然后,当浏览器使用代码和状态访问 RP 时,它可以确保浏览器之前曾尝试过身份验证请求。但 RP 永远不能保证代码来自特定请求;该状态可能会在该浏览器的上下文中重播。
这也意味着,RP 可以通过检查 HTTP "Referrer" header 表明 "Authentication Response" 来自预期的 IdP 来减轻 CSRF 攻击,而不是使用状态.
您以这种方式使用 State 有什么好处?
您所减轻的唯一 实际攻击媒介是使 A 人使用 B 人的代码而不是他们自己的代码登录 SiteX 的可能性。换句话说,Alice 理论上可以让 Bob 跟随 link 并以她自己的身份登录 Bob。
据我所知,在这一点上,您已经在 iFrame 中获得了 OIDC 交换 运行——并且攻击者已经找到了利用它的方法——或者浏览器的 Same-Origin 策略有问题(也许 CORS 放宽了太多?)。在任何一种情况下,与攻击者在这种情况下可以做的其他事情相比,这种攻击向量似乎都非常小。哦,如果你有 "follow a link and delete data" 的情况,那与 CSRF 无关。这完全是一个站点如何实现以处理 "deep linking" 的问题(即保留未经身份验证的请求的状态以便稍后在成功身份验证后重播它——作为 end-users 的便利)。
以这种方式使用 State 会损失什么?
您不支持 IdP-initiated SSO。当 browser/end-user 已经在 IdP 并且想要单点登录到 RP 时,IdP 将无法 在单个重定向 中完成。 solution/workaround 必须涉及浏览器命中 RP,然后返回到 IdP,最后再次返回到 RP。
不确定哪种 CSRF 攻击会阻止 OpenID Connect 服务器流中的 "state" 参数。有人可以给我举个例子吗?
它可以防止攻击者产生伪造的身份验证响应的攻击,例如通过向客户端的重定向 URI 发送 code
作为基本客户端配置文件的一部分。例如:在对用户进行网络钓鱼之后,攻击者可以注入一个被盗的 code
,它将以这种方式与当前用户相关联。 state
将请求和响应相关联,因此在不知道请求中使用的 state
参数的情况下,不可能主动制作响应。
通过比较授权请求和响应的 state
值,我们的想法是能够验证授权响应与请求相关。
到目前为止一切顺利;但是,是什么阻止对手使用从良性用户那里窃取的授权代码来伪造授权响应呢? OpenID 客户端无法验证授权码是否与 state
值相关。恕我直言,最好在授权请求中使用 nonce
字段,因为一旦交换了授权代码,它就会在签名的 id_token
中回显。现在,OpenID 客户端可以明确地将 id_token
(授权证明)与授权请求相关联。
通过这种方式,我们可以减轻 CSRF 和重放攻击。还是我在这里忽略了什么?
老实说,我有点不明白为什么 OpenID Connect specs "recommends" 使用 state
但留下 nonce
可选。
该建议来自 OAuth2,遵循它会阻止支持 "IdP-initiated" 流程的能力。
OIDC 完全是关于 SSO 进入 RP(依赖方;又名 "Client")系统,因为它们在 IdP(身份提供者;又名 "Provider")系统中经过身份验证---两个系统之间有一些后端信任设置。
所以你有一个 "Authentication Request"。这是从 RP 到 IdP 的重定向;它在 Url 的查询字符串中有 "scope=openid"。然后你有一个 "Authentication Response";它在 Url 的查询字符串中有 "code=XXXXX"。在这两个的GET请求中,browser/end-user在RP眼中是匿名的。只有在 RP 验证 "code"(在后端)后,RP 才会将身份(身份验证)分配给浏览器。
这意味着如果 RP 的应用程序在浏览器中存储该 State 值以唯一标识它,则可以使用 仅 State 方式来尝试防止 CSRF。然后,当浏览器使用代码和状态访问 RP 时,它可以确保浏览器之前曾尝试过身份验证请求。但 RP 永远不能保证代码来自特定请求;该状态可能会在该浏览器的上下文中重播。
这也意味着,RP 可以通过检查 HTTP "Referrer" header 表明 "Authentication Response" 来自预期的 IdP 来减轻 CSRF 攻击,而不是使用状态.
您以这种方式使用 State 有什么好处?
您所减轻的唯一 实际攻击媒介是使 A 人使用 B 人的代码而不是他们自己的代码登录 SiteX 的可能性。换句话说,Alice 理论上可以让 Bob 跟随 link 并以她自己的身份登录 Bob。
据我所知,在这一点上,您已经在 iFrame 中获得了 OIDC 交换 运行——并且攻击者已经找到了利用它的方法——或者浏览器的 Same-Origin 策略有问题(也许 CORS 放宽了太多?)。在任何一种情况下,与攻击者在这种情况下可以做的其他事情相比,这种攻击向量似乎都非常小。哦,如果你有 "follow a link and delete data" 的情况,那与 CSRF 无关。这完全是一个站点如何实现以处理 "deep linking" 的问题(即保留未经身份验证的请求的状态以便稍后在成功身份验证后重播它——作为 end-users 的便利)。
以这种方式使用 State 会损失什么?
您不支持 IdP-initiated SSO。当 browser/end-user 已经在 IdP 并且想要单点登录到 RP 时,IdP 将无法 在单个重定向 中完成。 solution/workaround 必须涉及浏览器命中 RP,然后返回到 IdP,最后再次返回到 RP。