Re: [OAUTH-WG] OAuth 2.1 - require PKCE?

Daniel Fett <fett@danielfett.de> Fri, 08 May 2020 06:50 UTC

Return-Path: <fett@danielfett.de>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id BD57E3A07EA for <oauth@ietfa.amsl.com>; Thu, 7 May 2020 23:50:23 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.095
X-Spam-Level:
X-Spam-Status: No, score=-2.095 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_FONT_LOW_CONTRAST=0.001, HTML_MESSAGE=0.001, SPF_NONE=0.001, UNPARSEABLE_RELAY=0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=danielfett.de
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 T3wNhop1lDiw for <oauth@ietfa.amsl.com>; Thu, 7 May 2020 23:50:20 -0700 (PDT)
Received: from d3f.me (redstone.d3f.me [5.9.29.41]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 317F83A07E9 for <oauth@ietf.org>; Thu, 7 May 2020 23:50:20 -0700 (PDT)
Received: from authenticated-user (PRIMARY_HOSTNAME [PUBLIC_IP]) by d3f.me (Postfix) with ESMTPA id 56FB32A9C for <oauth@ietf.org>; Fri, 8 May 2020 06:50:17 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=danielfett.de; s=dkim; t=1588920617; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=P0RfDQgkeHis5HlJA3TPPbTCC2IBj7IIfn1/+d6Yzmg=; b=mOCpL2dumBLox7IfaDfwDAuEFismzuMkf3yLH7U80unk/KuAeO/c0s9pZPajh73Y2WDEJU /ftbEbDdVOamnTF624a0A+mKl16rRJ4ME1rbELn5d9ziAMEFpneQAs5uTE8zxDQLH9GCqk vxMzdPE5QbNR5zrhp+Jj4vbByV/g8/I=
To: oauth@ietf.org
References: <CAD9ie-sRjnt67qjZ9Uw1E7KNR+YbKr6NiyA+uG1dDWqjDC082A@mail.gmail.com> <CAGBSGjr7zcZ=+eN1gA_A9Vb1fuYrfmAqHe71iDMgOkQsq+0wmA@mail.gmail.com>
From: Daniel Fett <fett@danielfett.de>
Message-ID: <3b016c63-facd-a1cf-cb58-6ad5d8633055@danielfett.de>
Date: Fri, 08 May 2020 08:50:16 +0200
MIME-Version: 1.0
In-Reply-To: <CAGBSGjr7zcZ=+eN1gA_A9Vb1fuYrfmAqHe71iDMgOkQsq+0wmA@mail.gmail.com>
Content-Type: multipart/alternative; boundary="------------1E952F0315636F5548B44BE2"
Content-Language: de-DE
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=danielfett.de; s=dkim; t=1588920617; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=P0RfDQgkeHis5HlJA3TPPbTCC2IBj7IIfn1/+d6Yzmg=; b=UZ/X04b1y/tlJ/9Dh7JKy+jWPFFLKjv1qIrnk/e7D2wy6pY5dSk/FbR580mVJUeb54usS8 v8/+QdGN2Q037PvaF9V03NxMIxE3rkjDuNh4xklHIiT6Be6GxPlc5pL5KcSn7ti2VRRjh7 b8blNdAhxzjZNMHwJjS+TwIKuGeh8v8=
ARC-Seal: i=1; s=dkim; d=danielfett.de; t=1588920617; a=rsa-sha256; cv=none; b=Ni4FTXzDA2YmEncwo/8ZiCIDxIGE3izoa9OWuP1t0EWXD/xQUEuEyuEo885jGyzjS6i5yZ ylfXsAgR5t0Qck4JMuWqT2gXreX8jX6Q1kRgw0nIvf68S6vN+KDAtM7pxPOb5K4ZXdYFI6 wjI+1mhQmpo7VV7ccLpdmbLJPL3xsQc=
ARC-Authentication-Results: i=1; d3f.me; auth=pass smtp.auth=fett@danielfett.de smtp.mailfrom=fett@danielfett.de
X-Spamd-Bar: +
Authentication-Results: d3f.me; auth=pass smtp.auth=fett@danielfett.de smtp.mailfrom=fett@danielfett.de
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/OCERAUzCSXgcyYLcT_hWN7BQII4>
Subject: Re: [OAUTH-WG] OAuth 2.1 - require PKCE?
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.29
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: <https://mailarchive.ietf.org/arch/browse/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: Fri, 08 May 2020 06:50:24 -0000

+1 to all what Aaron said. Thanks for pointing this out!

We need to address this in the security BCP and this will be a normative
change that affects OpenID Connect Core (just as our current
recommendation on the usage of nonce).

We would then have:

- use PKCE, except if you use OIDC with a nonce, then you don't need
PKCE, except if you are a public client, then you still need PKCE.
- use state, except if you use PKCE, then you don't need state.

I think there are very good reasons to simplify this down to

- use PKCE
- you may or may not use state

First and foremost, not many people will understand why there are cases
when the BCP/OAuth 2.1 mandate PKCE and some where they don't. However,
understanding /why/ you have to do something is key to compliance. The
short version "PKCE protects the code; there is a specific case where it
is not needed, but its better to use it all the time" is easy to
understand. We will not see many implementations following the long
version above correctly.

Second, we dramatically reduce technical complexity by reducing cases
that need to be handled. We reduce correctness and compliance testing
complexity in the same way. We reduce the cost of security analysis,
which scales really badly to more cases.

And finally, using nonce to protect against code injection is less
robust than PKCE. AS have a better track record than clients when it
comes to correctly implementing security mechanisms.

Yes, this will make a number of implementations non-spec-compliant, but
I do not think that this is a huge problem. Software needs to adapt all
the time and a software that has not been changed in a while is probably
not one you would want to use anyway. We are setting a new goal for
implementations to meet and eventually, maintained implementations will
get there.

-Daniel


Am 08.05.20 um 01:38 schrieb Aaron Parecki:
> Backing up a step or two, there's another point here that I think has
> been missed in these discussions.
>
> PKCE solves two problems: stolen authorization codes for public
> clients, and authorization code injection for all clients. We've only
> been talking about authorization code injection on the list so far.
> The quoted section of the security BCP (4.5.3) which says clients can
> do PKCE or use the nonce, is only talking about preventing
> authorization code injection.
>
> The nonce parameter solves authorization code injection if the client
> requests an ID token. Public clients using the nonce parameter are
> still susceptible to stolen authorization codes so they still need to
> do PKCE as well.
>
> The only case where OpenID Connect clients don't benefit from PKCE is
> if they are also confidential clients. Public client OIDC clients
> still need to do PKCE even if they check the nonce.
>
> OpenID Connect servers working with confidential clients still benefit
> from PKCE because they can then enforce the authorization code
> injection protection server-side rather than cross their fingers that
> clients implemented the nonce check properly.
>
> I really don't think it's worth the amount of explanation this will
> take in the future to write an exception into OAuth 2.1 or the
> Security BCP for only some types of OpenID Connect clients when all
> clients would benefit from PKCE anyway.
>
> Aaron
>
>
>
> On Wed, May 6, 2020 at 10:48 AM Dick Hardt <dick.hardt@gmail.com
> <mailto:dick.hardt@gmail.com>> wrote:
>
>     Hello!
>
>     We would like to have PKCE be a MUST in OAuth 2.1 code flows. This
>     is best practice for OAuth 2.0. It is not common in OpenID Connect
>     servers as the nonce solves some of the issues that PKCE protects
>     against. We think that most OpenID Connect implementations also
>     support OAuth 2.0, and hence have support for PKCE if following
>     best practices.
>
>     The advantages or requiring PKCE are:
>
>     - a simpler programming model across all OAuth applications and
>     profiles as they all use PKCE
>
>     - reduced attack surface when using  S256 as a fingerprint of the
>     verifier is sent through the browser instead of the clear text value
>
>     - enforcement by AS not client - makes it easier to handle for
>     client developers and AS can ensure the check is conducted
>
>     What are disadvantages besides the potential impact to OpenID
>     Connect deployments? How significant is that impact?
>
>     Dick, Aaron, and Torsten
>
>     ᐧ
>
>
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth