Re: [OAUTH-WG] Standard URL parameter for mitigating RFC6819's threat 4.6.4?

John Bradley <ve7jtb@ve7jtb.com> Tue, 17 March 2015 20:54 UTC

Return-Path: <ve7jtb@ve7jtb.com>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 76E011A88EF for <oauth@ietfa.amsl.com>; Tue, 17 Mar 2015 13:54:06 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.6
X-Spam-Level:
X-Spam-Status: No, score=-2.6 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_PASS=-0.001] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dYgJnmwAYLjm for <oauth@ietfa.amsl.com>; Tue, 17 Mar 2015 13:54:01 -0700 (PDT)
Received: from mail-qc0-f172.google.com (mail-qc0-f172.google.com [209.85.216.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 3EB691A88EC for <oauth@ietf.org>; Tue, 17 Mar 2015 13:54:01 -0700 (PDT)
Received: by qcbkw5 with SMTP id kw5so21053119qcb.2 for <oauth@ietf.org>; Tue, 17 Mar 2015 13:54:00 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:content-type:mime-version:subject:from :in-reply-to:date:cc:message-id:references:to; bh=sb9Wd8qu5B3IOU1/BcX6lLq/reXJ52E2RISAd0eKGgQ=; b=Qo+TNfjLfVX3UIicYKPlohCIMlGi2dS/uKnZ+z9JOrPQYiKt5uW7c1Idc/isgCPBXm ighSW3nyXEKqbG0BaqGo2iCC/2f6Q9tD+hvNSOq8dBWuI2Xj4T5LgDYX+yqCRcIWon6e h1YxMdQNC6MHDKfmsdNv65A+e07omWtJS3oRV2fP423QbltQpcp8W8juKT/8tb5uNly4 T0qDhKumtsX5QghLRyaDeDE1zy+wzHQAztEo5YYcK7tH4n5ZU9zsaxRYrVrDu/WK5oOE 5+3ClBPVVWnkkPHHrRZAhrNVYMl+kIvGC/Ydkr1BmYIyCc4quFdm3XEc6dgrepBfbnlO 6zAg==
X-Gm-Message-State: ALoCoQkhRofI3LevIX2G3ejw/3yBBW+mezxORGAxd8L9+AjCAbVjnMo+0k0HiAyN9HVi1KTUBwEM
X-Received: by 10.140.165.76 with SMTP id l73mr85603227qhl.16.1426625640472; Tue, 17 Mar 2015 13:54:00 -0700 (PDT)
Received: from [192.168.8.100] ([181.202.4.92]) by mx.google.com with ESMTPSA id 132sm10386555qhf.17.2015.03.17.13.53.57 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 17 Mar 2015 13:53:59 -0700 (PDT)
Content-Type: multipart/signed; boundary="Apple-Mail=_9136E9A8-2E8A-40FF-8BDE-E9289B2FDFFE"; protocol="application/pkcs7-signature"; micalg="sha1"
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2070.6\))
From: John Bradley <ve7jtb@ve7jtb.com>
In-Reply-To: <40858890.46948.1426624784094.JavaMail.yahoo@mail.yahoo.com>
Date: Tue, 17 Mar 2015 17:53:53 -0300
Message-Id: <5B76BC82-5987-4902-AF13-4E23217C131E@ve7jtb.com>
References: <7B21E963-C247-4452-B9DF-4D370433511B@ve7jtb.com> <40858890.46948.1426624784094.JavaMail.yahoo@mail.yahoo.com>
To: Bill Mills <wmills_92105@yahoo.com>
X-Mailer: Apple Mail (2.2070.6)
Archived-At: <http://mailarchive.ietf.org/arch/msg/oauth/UsQOpHi7BKSgEw4xyH24E4pi6qg>
Cc: "oauth@ietf.org WG" <oauth@ietf.org>, Matt Randall <matthew.a.randall@gmail.com>, Dixie Baker <Dixie.Baker@martin-blanck.com>
Subject: Re: [OAUTH-WG] Standard URL parameter for mitigating RFC6819's threat 4.6.4?
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: OAUTH WG <oauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/oauth>, <mailto:oauth-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/oauth/>
List-Post: <mailto:oauth@ietf.org>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/oauth>, <mailto:oauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 17 Mar 2015 20:54:06 -0000

Yes but it is custom.  People are inventing structured scopes like "aud:https://foo.com", and that potentially doesn't solve the security issue if a client just passes on the scopes it receives in the error response, the bad RS just adds a scope for the good RS.

The client then potentially needs to understand the custom structures scopes of every AS it might deal with.

I think that would lead to lots of problems trying to make that a pattern long term.   At teh moment yes you can do it with a scope as long as the client and AS both understand what is going on.


We added "aud" as a separate parameter for PoP as the token format for different RS might be different as well as the symmetric  pop keys needing to be encrypted with different keys.
Yes we could have invented a special scope to carry the audience but a separate parameter was much cleaner.

I know some people have started using "aud" as a way to communicate the resource when a scope applies to multiple RS but they may take different token formats JWT vs opaque etc.

Brian commented that the "aud" parameter may be useful beyond PoP so we might want to think about documenting it in it's own mini spec, if I understood him correctly.

I think that may not be a bad idea as we are also planning on using it in NAPPS.

John B.

> On Mar 17, 2015, at 5:39 PM, Bill Mills <wmills_92105@yahoo.com> wrote:
> 
> I don't think it's "overloading scope names" to use them that way.  The aud value(s) could as easily be carried in scope as anywhere.  Nothing says a scope can't be "https://foo.com", and that Foo.com requires that scope to be present for a token to be accepted.  I would not make it foo.com-read-mail for example.
> 
> If it's more convenient to put it in aud I can accept that, but it's the same functionality and can be implemented in scopes now.
> 
> 
> 
> On Tuesday, March 17, 2015 12:41 PM, John Bradley <ve7jtb@ve7jtb.com> wrote:
> 
> 
> People have been overloading scope names to create implicit audience.   
> 
> The problem is that clients need to know via some magic method that you need to ask for scope "purple" to get write access to RS 2.
> 
> Having an explicit "aud" parameter gives clients a way to communicate to the AS what RS they are asking for a token for. 
> 
> the security issue is that if a client discovers a API out via some out of band mechanism the OAuth error code can tell the client go to AS X and ask for Scope Y.  
> 
> Unfortunately without POP tokens or at-least passing the URI of the RS to the AS via "aud", a bad RS could get a legitimate client to give it a token that can be replayed at a legitimate RS.
> 
> This was one of the issues that Eran Hammer-Lahav was particularly concerned about.  
> 
> I think I proposed a "aud" parameter to the token endpoint back then as a alternative to requiring HMAC tokens, but that got lost in the confusion at the time.
> 
> At that time though people were not yet thinking about interoperable OAuth API,  only relatively tightly bound clients that were preconfigured for the API endpoints they were using.
> 
> In Health and other places we are starting to see standard clients that discover API endpoints and configure themselves based on a users Identity to use a arbitrary OAuth AS, moving into federation of AT.
> 
> That is one of the reasons POP will be important, as it prevents RS from misusing federated tokens by presenting them at other RS.
> 
> The simplest thing to do is have the client say what RS it is trying to access explicitly (The "aud" parameter), and including an audience in the AT.  to protect against malicious RS.
> 
> PoP is the step up that also protects against tokens being intercepted and replayed by another client.
> 
> John B.
> 
>> On Mar 17, 2015, at 4:10 PM, Bill Mills <wmills_92105@yahoo.com <mailto:wmills_92105@yahoo.com>> wrote:
>> 
>> This may have been hashed out already and I missed it, but "aud" just becomes another kind of scope, correct?
>> 
>> 
>> 
>> 
>> On Tuesday, March 17, 2015 8:50 AM, John Bradley <ve7jtb@ve7jtb.com <mailto:ve7jtb@ve7jtb.com>> wrote:
>> 
>> 
>> You could do that, but it is probably safer for the AS to know what RS it can issue tokens for and refuse to issue a token for RS A to a client asking for a token with RS X as the aud.
>> 
>> John B.
>>> On Mar 16, 2015, at 8:27 PM, Dixie Baker <Dixie.Baker@martin-blanck.com <mailto:Dixie.Baker@martin-blanck.com>> wrote:
>>> 
>> 
>> The threat that RFC6819 4.6.4 describes is when a client obtains an AT and then sends it to a counterfeit RS, which then uses the AT to access resources from a legitimate RS, on the end-user's behalf.  
>> 
>> The suggested countermeasure is a bit difficult to interpret:  "Associate the endpoint URL of the resource server the client talked to with the access token (e.g., in an audience field) and validate the association at a legitimate resource server.  The endpoint URL validation policy may be strict (exact match) or more relaxed (e.g., same host).  This would require telling the authorization server about the resource server endpoint URL in the authorization process."  
>> 
>> As I read this, the suggestion is to have the client pass the URL of the bad RS in the request to the AS (using the audience field).  The AS then would include that RS URL in the AT.  Then, when the client passes the AT to the bad RS, and it passes it on to the good RS, the good RS will check the audience field, compare that URL with its own, and refuse the request.  
>> 
>> -Dixie
>> 
>> 
>> 
>> Dixie B. Baker, Ph.D.
>> Senior Partner
>> Martin, Blanck and Associates
>> Office (Redondo Beach, CA):  310-791-9671
>> Mobile:  310-279-2579
>> 
>> On Mar 16, 2015, at 11:39 AM, John Bradley <ve7jtb@ve7jtb.com <mailto:ve7jtb@ve7jtb.com>> wrote:
>> 
>> 
>> Brian and I were talking about "aud" used as a parameter to the token endpoint when using a code or refresh token to indicate what RS the resulting AT will be used at.
>> 
>> Sending a audience in the AT wouldn't help prevent the attack being discussed,  though it may stop other sorts of attacks if the RS can tell if a AT was issued for it or another RS.
>> 
>> In PoP having the AS check that you are sending the AT to the correct RS is less important as the AT if stolen can't be used to replay against the real AS.
>> 
>> Though depending on the app the bogus RS feeding the app the wrong info may well be a problem as well.
>> 
>> John B.
>> 
>>> On Mar 16, 2015, at 2:40 PM, Torsten Lodderstedt <torsten@lodderstedt.net <mailto:torsten@lodderstedt.net>> wrote:
>>> 
>> 
>> I don't think putting an aud into an AT will help to prevent counterfeit RSs (as long as the aud is nit directly derived from the original URL used by the client to invoke the counterfeit RS. as long as the aud is a symbolic name of any kind, the counterfeit RS will accept ATs for the legitimate RS and just (ab)use it.
>> 
>> POP on the contrary helps since the counterfeit RS, in order to send a message to the legitimate RS, needs to produce a new digitally signed message using the correct secret, which it doesn't know.
>> 
>> kind regards,
>> Torsten.
>> 
>> 
>> 
>> Am 16.03.2015 um 17:40 schrieb Dixie Baker <Dixie.Baker@martin-blanck.com <mailto:Dixie.Baker@martin-blanck.com>>:
>> 
>> 
>> Using the "aud" parameter makes sense to me.  Good suggestion.
>> 
>> Authenticating the client to the RS would not address the counterfeit RS threat. 
>> 
>> -Dixie
>> 
>>  
>> Dixie B. Baker, Ph.D.
>> Senior Partner
>> Martin, Blanck and Associates
>> Office (Redondo Beach, CA):  310-791-9671
>> Mobile:  310-279-2579
>> 
>> On Mar 16, 2015, at 6:43 AM, Brian Campbell <bcampbell@pingidentity.com <mailto:bcampbell@pingidentity.com>> wrote:
>> 
>>> We've used "aud" (optionally) with OAuth 2 and bearer tokens to help identify the RS to whom the AT should be issued. It is useful but it's mostly about getting format/content/etc of the AT correct for the RS rather than it is about preventing possible AT leaks.
>>> 
>>> I do think an "aud(iance)" parameter at both token and authorization endpoints would have utility beyond the POP work. So defining it independently might make sense. 
>>> 
>>> On Sun, Mar 15, 2015 at 11:34 AM, John Bradley <ve7jtb@ve7jtb.com <mailto:ve7jtb@ve7jtb.com>> wrote:
>>> In POP key distribution we do introduce a "audiance" parameter to the token_endpoint. https://tools.ietf.org/html/draft-ietf-oauth-pop-key-distribution-01#section-3.1 <https://tools.ietf.org/html/draft-ietf-oauth-pop-key-distribution-01#section-3.1>
>>> 
>>> It would be possible to have a small spec to define using "aud" with bearer tokens, however that would be undefined behaviour at this point.
>>> 
>>> I don't know of any clients that would try to access a RS server and then besed on the error response try and get a access token from the AS specified in the error.
>>> 
>>> In POP we are trying to both protect agains that attack and more common ones like doing a MiM to intercept the AT or the RS being hacked and leaking the token.
>>> 
>>> Using "aud" with bearer tokens would be useful, but probably won't stop the majority of possible AT leaks.
>>> 
>>> John B.
>>> 
>>> 
>>>> On Mar 15, 2015, at 2:18 PM, Torsten Lodderstedt <torsten@lodderstedt.net <mailto:torsten@lodderstedt.net>> wrote:
>>>> 
>>>> Hi Josh,
>>>> 
>>>> I'm not aware of a common practice to use such a parameter. The WG is instead heading towards authenticated requests to the resource server (see https://tools.ietf.org/html/rfc6819#section-5.4.2 <https://tools.ietf.org/html/rfc6819#section-5.4.2>). 
>>>> 
>>>> Please take a look onto http://tools.ietf.org/html/draft-ietf-oauth-pop-architecture <http://tools.ietf.org/html/draft-ietf-oauth-pop-architecture> and further drafts on this topic.
>>>> 
>>>> kind regards,
>>>> Torsten.
>>>> 
>>>> Am 03.03.2015 um 18:27 schrieb Josh Mandel:
>>>>> Hi All,
>>>>> 
>>>>> In section 4.6.4 ("Threat: Access Token Phishing by Counterfeit Resource Server"), RFC6819 describes a threat where a counterfeit resource server tricks a client into obtaining and sharing an access token from a legitimate authorization server. One of the proposed mitigations involves: "telling the authorization server about the resource server endpoint URL in the authorization process."
>>>>> 
>>>>> In other words, this mitigation would ask the client to pass an additional parameter when redirecting to the Authorization server's "authorize" URL, effectively something like:
>>>>> 
>>>>> https://auth-server/authorize <https://auth-server/authorize>?
>>>>> response_type=code&
>>>>> client_id=123&
>>>>> state=456&
>>>>> scope=read-all&
>>>>> redirect_uri=https://app-server/after-auth& <https://app-server/after-auth&>
>>>>> resource_server_that_told_me_to_authorize_here=https://attacker.com <https://attacker.com/>
>>>>> 
>>>>> (And if the authorization server saw a value it didn't like in the final parameter, it would reject the request.)
>>>>> 
>>>>> This is obviously not appropriate in every authorization scenario, but it is useful anytime there's a discovery process by which apps learn about authorization servers from resource servers. Since it's something of a common need, I wanted to see if there was any common practice in how to name this parameter, or whether it's worth registering a standard extension at http://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml <http://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml> . (I don't see one there now -- possibly I'm just missing it.)
>>>>> 
>>>>> If so, what should it be called? The name I used in the example above is a bit verbose :-)
>>>>> 
>>>>> Best,
>>>>> 
>>>>>   Josh
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> OAuth mailing list
>>>>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>>>>> https://www.ietf.org/mailman/listinfo/oauth <https://www.ietf.org/mailman/listinfo/oauth>
>>>> 
>>>> _______________________________________________
>>>> OAuth mailing list
>>>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>>>> https://www.ietf.org/mailman/listinfo/oauth <https://www.ietf.org/mailman/listinfo/oauth>
>>> 
>>> 
>>> _______________________________________________
>>> OAuth mailing list
>>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>>> https://www.ietf.org/mailman/listinfo/oauth <https://www.ietf.org/mailman/listinfo/oauth>
>>> 
>>> 
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> OAuth mailing list
>> OAuth@ietf.org <mailto:OAuth@ietf.org>
>> https://www.ietf.org/mailman/listinfo/oauth <https://www.ietf.org/mailman/listinfo/oauth>
>> 
>> 
> 
> 
>