So if I'm understanding this correctly, it sounds like the AS needs to
reject a token request with code_verifier if the authorization code was
issued in response to a request that did not contain a code_challenge. This
to me sounds like it would be simpler to just say the code_challenge and
code_verifier are always required.

That said, I do understand the previously discussed concerns around
existing OpenID Connect clients.

I believe the text that Daniel proposed is the best of both worlds, and I
support making this change in both OAuth 2.1 and the Security BCP.

Aaron Parecki



On Tue, May 19, 2020 at 9:29 AM Nov Matake <mat...@gmail.com> wrote:

> Yes.
>
> The root problem isn’t the mix-use of PKCE and nonce, it’s PKCE
> implementation bug.
> Yeah, all PKCE implementation MUST reject such requests, regardless it’s
> OAuth 2.1 or 2.0.
>
> (and it’s probably because of PKCE spec’s ambiguity..)
>
> 2020/05/20 1:13、Mike Jones <michael.jo...@microsoft.com>のメール:
>
> So it sounds me like the fix is to have servers reject PKCE requests with
> incomplete parameter sets: requests that only contains one of
> code_challenge and code_verified.  Will that eliminate the attack, Nov?
>
>                                                        -- Mike
>
> *From:* OAuth <oauth-boun...@ietf.org> *On Behalf Of *Nov Matake
> *Sent:* Monday, May 18, 2020 11:50 PM
> *To:* Daniel Fett <f...@danielfett.de>
> *Cc:* oauth@ietf.org
> *Subject:* Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
>
> Sure, feel free to add the senario to your post.
>
> FYI:
> my OAuth2 server ruby gem rejects such token requests,
>
> https://github.com/nov/rack-oauth2/blob/master/lib/rack/oauth2/server/extension/pkce.rb#L28
> and Google also does the same.
> https://gist.github.com/nov/9feba86685bd3b18b4bf7bfb88022046
>
> So I'm guessing such behavior is relatively rare-case, hopefully.
>
> iPadから送信
>
>
> 2020/05/19 15:43、Daniel Fett <f...@danielfett.de>のメール:
>
> 
> Hi,
>
> Am 19.05.20 um 04:55 schrieb Nov Matake:
>
> I thought the server MUST reject such token requests, but I couldn’t find
> such definition in RFC7636...
>
> > The client will send the code, along with a (now not matching)
> code_verifier to the server. The server will ignore the code_verifier (as
> it was not expected) and send back an access token and ID token to the
> client.
>
> https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#noncepkce-sidestep-attack
>
> If the behavior is acceptable by RFC7636, "Nonce/PKCE Sidestep Attack”
> would be possible.
>
> I *think* that there is nothing preventing servers from sometimes using
> PKCE and sometimes using Nonce. I assume that this is out of the scope of
> the existing specifications.
>
> I would be interested to hear how actual implementations handle this in
> practice.
>
>
> Plus, with such AS behavior, CSRF protection using PKCE can also be
> bypassed as below.
> 1. The attacker removes code_challenge from his/her own AuthZ
> Req, receives a non-code_challenge-bound code, and sends it to the victim..
> 2. The client receives the attacker’s code from the victim, and sends it
> to the AS w/ the valid code_verifier bound to the victim’s browser session.
> 3. The AS ignores the code_verifier and returns tokens.
>
> If that’s the case, current OAuth 2.0 PKCE implementation can be weaker
> than expected..
>
> Excellent point!
>
> Would it be okay if I add that attack to the original post (with credits,
> of course)?
>
> -Daniel
>
>
> nov
>
>
> 2020/05/19 1:54、Daniel Fett <f...@danielfett.de>のメール:
>
> Hi all,
>
> Talking to Torsten, we realized that providing a generic extension point
> here is probably not a good idea. It is really hard to tell what protects
> you from code injection and what does not, and people might come up with
> all sorts of non-standard and potentially insecure solutions.
>
> Even just for PKCE vs. Nonce, it is not obvious if they provide the same
> level of protection. In an attempt to answer this question, I tried to come
> up with a more systematic analysis of "PKCE vs Nonce". I wrote up my
> results here:
> https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/
>
> Although this is not a formal analysis, I hope that I have covered all
> interesting cases. Please review the text and let me know if I have missed
> something or if there are any mistakes.
>
> The main results are:
>
>    1. In terms of protection against CSRF and code misuse, PKCE and Nonce
>    provide similar levels of security, with a slight advantage for PKCE.
>    2. In practice, a circumvention of both mechanisms, however, is
>    possible if an AS allows a client to choose between PKCE and Nonce and the
>    client makes use of this freedom. I propose to call this attack the
>    Nonce/PKCE Sidestep Attack. → Please review the attack description in the
>    analysis.
>    3. To avoid the Nonce/PKCE Sidestep Attack, clients must not switch
>    between using only PKCE and only Nonce (but may use both in parallel, or
>    switch between using only PKCE and PKCE+Nonce). Authorization servers must
>    enforce PKCE unless they know that the client uses Nonce for all of its
>    flows (and checks the Nonce value). The presence of a nonce parameter in
>    the authorization request is not sufficient to determine if a client
>    actually checks the nonce claim in the ID token.
>
> As you can see, already having two more-or-less well-understood mechanisms
> is hard enough to wrap your head around from a security standpoint. We
> should therefore make PKCE the default and Nonce an option for backwards
> compatibility.
> To this end, I would like to propose the follwing strawman, based on
> Torsten's and Aaron's suggestions:
> An AS MUST reject requests without a code_challenge from public
> clients, and MUST reject such requests from other clients unless there
> is reasonable assurance that the client mitigates authorization code
> injection using the OpenID Connect Nonce mechanism and that this
> mitigation is used for all interactions with the client. See section
> 9.7 for details.
>
> Section 9.7:
>
> Clients MUST prevent injection (replay) of authorization codes into
> the authorization response by attackers. The use of the
> `code_challenge` parameter is RECOMMENDED to this end. For
> confidential clients, the OpenID Connect `nonce` parameter and ID
> Token Claim {{OpenID}} MAY be used instead of or in addition to the
> `code_challenge` parameter for this purpose. The `code_challenge` or
> OpenID Connect `nonce` value MUST be transaction-specific and securely
> bound to the client and the user agent in which the transaction was
> started.
>
> If the OpenID Connect `nonce` is used to mitigate authorization code
> injection instead of `code_challenge`, client and authorization server
> MUST ensure that the mitigation is applied to every interaction with
> the client and that the client cannot switch between `code_challenge`
> and `nonce`. For example, the presence of a `nonce` parameter in the
> authorization request is not sufficient to determine that the
> `code_verifier` check can be skipped.
>
> Of course, we need to adapt the wording in the Security BCP accordingly.
> -Daniel
>
>
> Am 15.05.20 um 01:01 schrieb Mike Jones:
>
> I agree with Nov that obscuring the language in 9.7 would be a disservice to 
> developers.
>
>
>
> The Security BCP, which has already going the WGLC, explicitly calls out the 
> use of nonce as part of the best practices.  OAuth 2.1 should do no less.
>
>
>
> The 9.7 language that Aaron proposed was the result of many people's 
> contributions and a vigorous discussion.  Let's publish the next version of 
> 2.1 with that language intact, as I believe it represents at least a local 
> point of hard-won consensus.  Let's get that language into the record of 
> drafts.
>
>
>
> There's always time to debate it and change it later in subsequent drafts, 
> but let's not now lose what it took a lot of effort to achieve.
>
>
>
>     Thanks,
>
>     -- Mike
>
>
>
> -----Original Message-----
>
> From: Nov Matake <mat...@gmail.com> <mat...@gmail.com>
>
> Sent: Thursday, May 14, 2020 3:18 AM
>
> To: Torsten Lodderstedt <tors...@lodderstedt.net> <tors...@lodderstedt.net>
>
> Cc: OAuth WG <oauth@ietf.org> <oauth@ietf.org>; Mike Jones 
> <michael.jo...@microsoft.com> <michael.jo...@microsoft.com>
>
> Subject: Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
>
>
>
> There is no specific mechanism right now.
>
> But future developers won’t be able to read the reason why the extension 
> point is given only for confidential clients.
>
>
>
> On May 14, 2020, at 18:32, Torsten Lodderstedt <tors...@lodderstedt.net> 
> <tors...@lodderstedt.net> wrote:
>
>
>
> Are you aware of any suitable mechanism? I’m asking since from my perspective 
> this clause is mainly intended to allow existing OpenID Connect deployments 
> to use nonce instead of PKCE in combination with OAuth 2.1. It’s a 
> compromise. I think we should not encourage others to invent their own OAuth 
> security mechanisms.
>
>
>
> On 14. May 2020, at 09:37, Nov Matake <mat...@gmail.com> <mat...@gmail.com> 
> wrote:
>
>
>
> Hi,
>
>
>
> Why not allowing public clients use "other suitable mechanisms” then?
>
> OAuth WG can allow both type of clients do so, then OIDF will define nonce as 
> the alternative only for confidential clients.
>
>
>
> 2020/05/14 15:56、Torsten Lodderstedt 
> <torsten=40lodderstedt....@dmarc.ietf.org> 
> <torsten=40lodderstedt....@dmarc.ietf.org>のメール:
>
>
>
> Hi all,
>
>
>
> I would also like to thank everybody for the substantial discussion.
>
>
>
> The proposed change for Section 4.1.2.1 works for me (as already stated). I’m 
> not fully comfortable with the proposed change for Section 9.7 for the 
> following reasons:
>
>
>
> - The text is weaker than Section 4.1.2.1 since it RECOMMENDS use of PKCE 
> instead of requiring it (with a well-defined exception).
>
> - Given the latest findings re nonce I don’t feel comfortable with 
> recommending any mechanism that this WG is not responsible for and thus did 
> not conduct the security threat analysis for. I think the better way for us 
> as WG is to define the extension point for other mechanisms. The OpenID 
> Foundation (or any other body) can then fill in and issue a statement that 
> nonce (or another suitable mechanism) fulfils the requirements of the 
> extension point.
>
>
>
> Based on this considerations, I propose the following text for Section 9.7:
>
>
>
> Clients MUST prevent injection (replay) of authorization codes into
>
> the authorization response by attackers. Public clients MUST use the
>
> "code_challenge” with a transaction-specific value that is securely
>
> bound to the client and the user agent in which the transaction was
>
> started. Confidential clients MUST use the “code_challenge” in the
>
> same way or other suitable mechanisms to mitigate authorization code
>
> injection.
>
>
>
> This text follows the logic in Section 4.1.2.1 and allows use of the nonce 
> for confidential clients.
>
>
>
> best regards,
>
> Torsten.
>
>
>
> On 12. May 2020, at 02:21, Mike Jones 
> <Michael.Jones=40microsoft....@dmarc.ietf.org> 
> <Michael.Jones=40microsoft....@dmarc.ietf.org> wrote:
>
>
>
> That works for me.  Thanks all for the useful back-and-forth that got us to 
> this point of clarity.  I suspect many of us learned things along the way; I 
> know that I did!
>
>
>
>                                                     Cheers,
>
>                                                     -- Mike
>
>
>
> From: Aaron Parecki <aa...@parecki.com> <aa...@parecki.com>
>
> Sent: Monday, May 11, 2020 4:55 PM
>
> To: OAuth WG <oauth@ietf.org> <oauth@ietf.org>
>
> Cc: Neil Madden <neil.mad...@forgerock.com> <neil.mad...@forgerock.com>; Mike 
> Jones
>
> <michael.jo...@microsoft.com> <michael.jo...@microsoft.com>
>
> Subject: Re: [OAUTH-WG] proposed resolution for PKCE in OAuth 2.1
>
>
>
> Thank you Neil.
>
>
>
> To address Mike's concerns in the previous threads, I would like to also 
> update section 9.7 with the following text:
>
>
>
> Clients MUST prevent injection (replay) of authorization codes into
>
> the authorization response by attackers. The use of the
>
> `code_challenge` parameter is RECOMMENDED to this end. For
>
> confidential clients, the OpenID Connect `nonce` parameter and ID
>
> Token Claim {{OpenID}} MAY be used instead of or in addition to the
>
> `code_challenge` parameter for this purpose. The `code_challenge`
>
> or OpenID Connect `nonce` value MUST be transaction-specific and
>
> securely bound to the client and the user agent in which the transaction was 
> started.
>
>
>
> This change better clarifies the specific circumstances under which the 
> "nonce" parameter is sufficient to protect against authorization code 
> injection.
>
>
>
> Aaron Parecki
>
>
>
> On Mon, May 11, 2020 at 11:55 AM Neil Madden <neil.mad...@forgerock.com> 
> <neil.mad...@forgerock.com> wrote:
>
> I am happy with this proposed wording. Thanks for updating it.
>
>
>
> — Neil
>
>
>
>
>
> On 11 May 2020, at 19:52, Aaron Parecki <aa...@parecki.com> 
> <aa...@parecki.com> wrote:
>
>
>
> Thanks for the lively discussion around PKCE in OAuth 2.1 everyone!
>
>
>
> We would like to propose the following text, which is a slight variation from 
> the text Neil proposed. This would replace the paragraph in 4.1.2.1 
> (https://tools.ietf.org/html/draft-parecki-oauth-v2-1-02#section-4.1.2.1) 
> that begins with "If the client does not send the "code_challenge" in the 
> request..."
>
>
>
> "An AS MUST reject requests without a code_challenge from public clients, and 
> MUST reject such requests from other clients unless there is reasonable 
> assurance that the client mitigates authorization code injection in other 
> ways.. See section 9.7 for details."
>
>
>
> Section 9.7 is where the nuances of PKCE vs nonce are described.
>
>
>
> As Neil described, we believe this will allow ASs to support both OAuth 2..0 
> and 2.1 clients simultaneously. The change from Neil's text is the 
> clarification of which threats, and changing to MUST instead of SHOULD. The 
> "MUST...unless" is more specific than "SHOULD", and since we are already 
> describing the explicit exception to the rule, it's more clear as a MUST here.
>
>
>
> Aaron Parecki
>
>
>
>
>
>
>
>
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
>
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
> _______________________________________________
>
> OAuth mailing list
>
> OAuth@ietf.org
>
> https://www.ietf.org/mailman/listinfo/oauth
>
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth
>
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth
>
_______________________________________________
OAuth mailing list
OAuth@ietf.org
https://www.ietf.org/mailman/listinfo/oauth

Reply via email to