Live Connect OAuth2是否存在严重的重放攻击问题?为什么授权码可以多次使用?

1 windows-live-id dotnetopenauth liveconnect oauth-2.0 live-connect-sdk

首先感谢您的宝贵时间。我对Live Connect的OAuth2 API表示严重关注。

我遵循此步骤,并使用DotNetOpenAuth为我们的联合身份和访问管理系统实现/集成LiveId身份验证/授权。

http://msdn.microsoft.com/zh-CN/library/live/hh243647.aspx#authcodegrant

在很长一段时间内,一切正常。但是现在在解决LiveId登录模块的重放攻击问题时遇到了严重的麻烦。让我们看一下以上文章中的授权代码授予流程。

“ * 4。用户代理使用重定向URI调用客户端,该重定向URI包括授权码和客户端提供的任何本地状态。例如:... Callback.htm?code = AUTHORIZATION_CODE。5.客户端请求来自授权服务器令牌端点的访问令牌,使用其客户端凭据进行身份验证,并包括在上一步中接收到的授权代码。客户端包括用于获取验证授权代码的重定向URI。

在步骤4之后,Live Connect OAuth2服务器将使用授权代码和状态返回我的回调端点,如下所示:

https://ssss.myapp.com:443/liveid/consume.idp?code=406dd558-0cda-50cc-bd37-d964ec29fbb3&state=uvygsnd3gba0jwi315kdyccs

问题是,授权代码可以多次使用。因此,这会导致严重的重放攻击问题,例如以下情况:

  1. 用户A登录到我的应用程序时,选择LiveId进行登录,然后将他重定向到LiveId登录页面。然后,他登录,Live Connect OAuth2服务器使用代码= xxx&state = yyy返回到回调端点。用户A然后使用此授权代码获取访问令牌。

  2. 用户B登录到我的应用程序时,选择LiveId进行登录,然后登录LiveId的登录页面。Live Connect OAuth2服务器现在返回,代码为= kkk&state = ggg

如果这一次,请使用Webscarab之类的工具来捕获响应/请求,然后将OAuth2服务器的返回值更改为code = xxx&state = ggg(旧的授权码是提供给用户A,而不是B)。然后,使用此重播授权代码请求访问令牌的过程很顺利。你猜怎么着?我再次收到了A的访问令牌,该令牌是在A之前提供给用户A的。最终,用户B可以以用户A的身份登录我的应用程序。

请注意,对Google OAuth2服务器应用与上述相同的重播攻击,我从服务器收到错误的请求错误,Google OAuth2授权代码永远不能使用超过一次。而且代码流或完全相同,Google登录名和LiveId登录名的实现完全相同。

我使用DotNetOpenAuth.OAuth2.WebServerClient为Google和LiveId实施OAuth2身份验证流程。同样,代码完全相同,但是当重复使用授权代码时,Google OAuth2服务器返回了“错误请求”,但是LiveId返回了先前用户的旧访问令牌。

这是一个严重的安全问题。希望你们对此有一些想法。或者希望我在某些方面是错误的。请指出。

非常感谢Phuc Le。

Jan*_*ger 5

OAuth 2规范在这里非常清楚

如果授权代码被多次使用,授权服务器必须拒绝该请求,并应(如果可能)撤消基于该授权代码先前发行的所有令牌。

这是由于您上面提到的确切原因

就您而言,您应将此问题通知您的提供商

同时,您可以在客户端实现已使用授权代码的缓存,并检查是否已发布代码。请注意,在提供者为两个不同的用户随机生成相同代码的情况下,这也可能会产生误报(根据实现的情况,这不太可能发生)。