I think was a little unclear in my statement regarding the Consumers' duties. Allow me to rephrase:
As a consumer you need to do one of two things: 1) Mixed Binding - Ensure the user who initiated the dance is the one who completed it and then associate the access token/secret with that user. 2) Late Binding - Only rely on the identity of the user who completed the dance and associated the access token/secret with that user. What you've described is 'Early Binding' and generally a bad idea for the very reason called out. Darren On Sat, May 9, 2009 at 12:04 AM, Darren Bounds <dar...@cliqset.com> wrote: > Manish, > > See my post and subsequent thread from last week which I believe is > what you're describing: > > http://groups.google.com/group/oauth/browse_thread/thread/1c3874d94008135a/a99aaa5de87f98dc > > As a consumer you need to ensure that the user who *completes* the > negotiation is the same user who authorized the access token at the > SP. The initiating user is somewhat irrelevant. Additionally, Brian > Eaton and I have submitted the following language relating to CSRF > attacks which draws attention to this form of attack. > > http://groups.google.com/group/oauth/msg/f02d7d2bf10bad36 > > Darren > > > On Fri, May 8, 2009 at 9:50 PM, Manish Pandit <pandit.man...@gmail.com> wrote: >> >> There you go again: >> >> Assumptions: >> >> 1. The provider requires a callback_url with get_request_token, signed >> per the 1.0a. >> 2. The provider returns an oauth_verifier along the blessed request >> token on the callback (if not oob) to the consumer upon user consent. >> 3. The consumer has a database table (or any other mechanism) to store >> a user identifier (user's identity at the consumer), request token and >> access token >> 4. The provider has a database table (or any other mechanism) to store >> the user identifier (user's identity at the provider), request token >> and access token >> 5. The endpoints are one time use only - so authorize_token and >> get_access_token can be called once and only once for a given token. >> 6. The victim consents to providing access to the consumer for his >> protected data. >> 7. The access token lives long enough for these steps (usually a few >> hours) >> 8. The request token lives long enough for steps 3 though 11. >> >> Flow: >> >> 1. Evil user (identity = eviluser) logs in to the consumer webapp. >> >> 2. Clicks a link to access protected resources on the provider >> >> 3. Consumer gets a request token per 1.0a (token1), and redirects the >> eviluser to provider's login page. >> >> 4. Consumer record says {userId=evilUser, requestToken=token1, >> accessToken=null} >> >> 5. Provider record says {userId = null, requestToken=token1, >> accessToken = null} >> >> 6. eviluser copy-pastes this link and sends it to the soon-to-be >> victim via IM to get everything done in the request token TTL which >> can be few minutes. Evil user does not even need to be online after >> this step. >> >> 7. The soon-to-be victim get the IM, clicks on the link. >> >> 8. Everything checks out, the victim logs in to the provider with his >> credentials (gooduser). The provider updates the record at their end. >> >> 9. Provider record now says {userId=gooduser, requestToken=token1, >> accessToken=null} >> >> 10. Provider now generates an oauth_verifier (abcd). Appends it to >> oauth_token=token1 and calls back the consumer on the callback >> provider in step 3 >> >> 11. The consumer gets the callback with the token and verifier. The >> record still says {userId=eviluser, requestToken=token1, >> accessToken=null} >> >> 12. The consumer tries to convert this token to access token, now that >> it has received the callback with a verifier. It may or may not store >> the oauth_verifier. (In my provider implementation, I am not storing >> the verifier and relying completely on the signature verification) >> >> 13. The consumer per 12 creates a signed request (including the >> verifier) to request access token against the blessed request token. >> >> 14. The provider gets the request, and converts the requestToken to >> access token as everything seems to be alright. The provider record >> now says {userId=gooduser, requestToken=token1, accessToken=token2) >> >> 15. The provider returns the accesstoken to the consumer. Consumer >> record now says {userId=evilUser, requestToken=token1, >> accessToken=token2). >> >> 16. Now eviluser logs in to consumer, accesses a protected endpoint >> (getAddressBook.do). Since the consumer already has an access token >> for evilUser (see the db record above), it sends the request to access >> protected resources. >> >> 17. The provider looks up the user who has that access token >> (gooduser, see db record above) and returns gooduser's addressbook to >> the consumer. >> >> 18. The consumer passes along the gooduser's addressbook to the >> eviluser. >> >> There you have it - I really really hope I am missing something here. >> >> Since the spec does not have any guidelines for the consumer (it >> should never do anyway), we cannot assume that the consumer is or is >> not linking identities and tokens in a particular fashion. Besides I >> think the whole scenario can be replicated without the record at the >> consumer too, but Friday 6:45P I am too fried to think further :( >> >> -cheers, >> Manish >> >> >> > > > > -- > darren bounds > dar...@cliqset.com > -- darren bounds dar...@cliqset.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "OAuth" group. To post to this group, send email to oauth@googlegroups.com To unsubscribe from this group, send email to oauth+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/oauth?hl=en -~----------~----~----~----~------~----~------~--~---