Re: [OAUTH-WG] Question regarding draft-ietf-oauth-jwt-introspection-response-05

Torsten Lodderstedt <torsten@lodderstedt.net> Fri, 20 September 2019 13:19 UTC

Return-Path: <torsten@lodderstedt.net>
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 3B090120024 for <oauth@ietfa.amsl.com>; Fri, 20 Sep 2019 06:19:06 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.62
X-Spam-Level:
X-Spam-Status: No, score=-2.62 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
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 hF5wpz3f8HTA for <oauth@ietfa.amsl.com>; Fri, 20 Sep 2019 06:19:03 -0700 (PDT)
Received: from smtprelay05.ispgateway.de (smtprelay05.ispgateway.de [80.67.31.98]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id D1CF51200DB for <oauth@ietf.org>; Fri, 20 Sep 2019 06:19:02 -0700 (PDT)
Received: from [91.13.158.20] (helo=[192.168.71.123]) by smtprelay05.ispgateway.de with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92.2) (envelope-from <torsten@lodderstedt.net>) id 1iBIoN-0006lj-Cy; Fri, 20 Sep 2019 15:18:59 +0200
From: Torsten Lodderstedt <torsten@lodderstedt.net>
Message-Id: <59657B9C-0B7F-4A33-AE5B-FF522E754E21@lodderstedt.net>
Content-Type: multipart/signed; boundary="Apple-Mail=_2FD6032A-9815-48B2-822E-B38547662C1C"; protocol="application/pkcs7-signature"; micalg="sha-256"
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Date: Fri, 20 Sep 2019 15:18:58 +0200
In-Reply-To: <9468283E-8B97-4DAF-8493-895B475F6BC9@lodderstedt.net>
Cc: "oauth@ietf.org" <oauth@ietf.org>
To: "Schaar, R.M. (Remco) - Logius" <remco.schaar@logius.nl>
References: <38503cd44d9e455bad4432d9ba5e82e8@SV1601507.frd.shsdir.nl> <308A4847-6390-4D17-BE52-B604E2428391@lodderstedt.net> <10f13f75c100454aa8092961673541b2@SV1601499.frd.shsdir.nl> <C485308C-1E15-40C1-90EB-BD27AD3A941D@lodderstedt.net> <040dcf9971fd4c618e94b957461d14f2@SV1601507.frd.shsdir.nl> <9468283E-8B97-4DAF-8493-895B475F6BC9@lodderstedt.net>
X-Mailer: Apple Mail (2.3445.104.11)
X-Df-Sender: dG9yc3RlbkBsb2RkZXJzdGVkdC5uZXQ=
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/-U4fylHpnthjs6mfLv4sVKAIVWo>
Subject: Re: [OAUTH-WG] Question regarding draft-ietf-oauth-jwt-introspection-response-05
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, 20 Sep 2019 13:19:06 -0000

Hi Remco, 

we just published https://tools.ietf.org/html/draft-ietf-oauth-jwt-introspection-response-08. 

We added text to make the difference between the introspected access token and the token introspection response in JWT format clear. 

Wed didn’t find a compelling reason for having two “iat" claims (for the introspected access token as well as the token introspection response) since in our experience (and the experience of other experts we talked to) “iat" is almost exclusively used for logging/auditing & non-repudiation whereas “exp” is used for lifetime control. 

We therefore added text stating that the “iat” in a token introspection response in JWT format always indicates the time when the introspection response was created by the AS. 

---
If the AS adds the following claims to the token introspection
   response their meaning is defined as follows:

   iat     The "iat" claim indicates when the introspection response was
           issued by the AS.

   exp     The "exp" claim indicates when the access token passed in the
           introspection request will expire.

   jti     The "jti" claim is a unique identifier for the access token
           passed in the introspection request.  This identifier MUST be
           stable for all introspection calls for a given access token.
---

I hope this resolves your issue regarding non-repudiation. 

best regards,
Torsten. 

> On 4. Sep 2019, at 11:21, Torsten Lodderstedt <torsten@lodderstedt.net> wrote:
> 
> Hi Remco,
> 
>> On 31. Aug 2019, at 21:27, Schaar, R.M. (Remco) - Logius <remco.schaar@logius.nl> wrote:
>> 
>> Hello Torsten,
>> 
>> (my apologies for making a typo previously)
> 
> Thanks :-)
> 
>> 
>> Time of introspection is critical if you want to use the signed introspection
>> response for later accountability or audit purposes. For example, a Client
>> obtains an access token A at time t. Now a resource server receives A at time
>> t+1, calls introspection and receives a response containing active=true. At
>> t+2 the acccess token is revoked. At time t+3 the resource server makes a new
>> introspection request, now receives a response containing active=false. The
>> only difference would be the value of the active parameter. Without the time
>> of introspection nor a unique id covered by the signature, one cannot make a
>> conclusive distinction between subsequent responses if revocation may be in
>> play.
> 
> That’s a good point.  
> 
>> 
>> The draft specifies 
>>      [...] to return responses as JWTs.
>> This could either mean "the response is returned in JWT format" or "the
>> response contains a JWT representation of the inspected token”.
> 
> I'm meanwhile leaning towards "the response is returned in JWT format”.
> 
>> Not having
>> clear, separate parameters to distinguish between the time and id of the
>> token and the time and id of the response results in double meaning. As a
>> consequence, it is either having the risk of replay of an access token or
>> replay of an introspection response instead of neither.
> 
> I’m not sure how an attacker could replay an introspection response given it is tighted to a certain endpoint via the iss claim. 
> 
> I agree the RS lacks a way to proof when it was provided with the access token data by the AS. 
> 
> The problem in my opinion is the overlay between the original access token data (e.g. when was it issued by the AS) and the data belonging to the representation in the introspection response (when was the response created). Conceptually, this means we require two separat “iat" (alike) claims to distinguish both aspects. 
> 
> I could image two ways to handle this:
> - add another iat claim, e.g. “tir_iat", to the JWT
> - add another “iat" claim to the JWS header containing the instant when the token introspection response was created
> 
> What do you think?
> 
> best regards,
> Torsten. 
> 
>> 
>> Kind regards,
>> Remco schaar
>> 
>> -----Oorspronkelijk bericht-----
>> Van: Torsten Lodderstedt <torsten@lodderstedt.net> 
>> Verzonden: woensdag 28 augustus 2019 11:14
>> Aan: Schaar, R.M. (Remco) - Logius <remco.schaar@logius.nl>
>> CC: oauth@ietf.org
>> Onderwerp: Re: [OAUTH-WG] Question regarding draft-ietf-oauth-jwt-introspection-response-05
>> 
>> Hi Rhemco,
>> 
>>> On 26. Aug 2019, at 09:42, Schaar, R.M. (Remco) - Logius <remco.schaar@logius.nl> wrote:
>>> 
>>> Hello Thorsten,
>>> 
>>> Thank you for your response. I have a few more questions/comments as
>>> follow-up...
>>> 
>>> You state that RFC7519 and RFC7662 "just" define different representations
>>> for token data. If the draft RFC would refer to RFC 7515 (JWS), I would
>>> agree. However, RFC7519 (JWT) explicitly adds semantics to some specific
>>> parameters (e.g. aud, jti and iat). RFC7662 has different semantics for
>>> the several of the same parameters.
>>> For instance the 'iat', is the moment of issuance of the JWT in RFC7519. In
>>> RFC7662 that is the "when this token was originally issued". This time will
>>> vary in use cases without immediate introspection of an access token.
>> 
>> I read the text differently. In my interpretation “when the token was originally issued” stated from the perspective of the introspection endpoint refers exactly to the same instant as “the time at which the JWT was
>>  issued”.
>> 
>>> 
>>> For the use case of the resource server relying on verifiable data, as
>>> described in the introduction of the draft RFC, the time of the introspection
>>> is critical.
>> 
>> Why is this time critical?
>> 
>>> In particular when combined with revocation, the time of
>>> introspection and the 'active' status can differ between two subsequent calls
>>> for introspection.
>> 
>> The status at token introspection request time is indeed critical. RFC 7662 gives a good indication how this value should be calculated.
>> 
>> “… a "true"
>>     value return for the "active" property will generally indicate
>>     that a given token has been issued by this authorization server,
>>     has not been revoked by the resource owner, and is within its
>>     given time window of validity (e.g., after its issuance time and
>>     before its expiration time)." 
>> 
>> So it represents the results of the issuer check, the revocation check and the validity check in one boolean value. 
>> 
>>> 
>>> If the draft RFC just produces a JWT representation of the access token,
>>> including 'active' would not make sense as the JWT will expire without
>>> updating it to false. Leaving 'active' out would make it incompatible with
>>> RFC7662 introspection responses.
>> 
>> “active” is not part of the JWT representation I referred to. The AS needs to determine the active value for every token introspection request. 
>> 
>> If the RS would consume JWTs, it would determine the “active” value itself by inspecting the iss claim and check against its AS whitelist, check the signature and the iat & exp values. Determining the revocation status would require an information exchange with the AS of some sort. 
>> 
>>> Similar, not including a unique 'jti' per introspection response would make
>>> the resource server vulnerable to replay attacks.
>> 
>> To the contrary, including a different “jit" with every token introspection response would make the RS vulnerable to replay of one time access token since it remove the possibility for the RS to identity a certain access token. 
>> 
>>> Or the resource server
>>> would mistakenly refer to non-unique tokens, making the responses unsuitable
>>> for accountability and audit purposes.
>>> 
>>> 
>>> As to why someone would want to distinguish a JWT access token from an
>>> introspection response: several use cases come to mind.
>>> 
>>> First of all, even if one is using standalone interpretable JWT access tokens,
>>> one may want to combine that with revocation checking using introspection. The
>>> interpretation and meaning of the JWT and the introspection response than do
>>> differ and matter.
>> 
>> As I described above, I don’t see any difference. 
>> 
>>> 
>>> Another use case would be a mixed ecosystem with resource servers relying on
>>> introspection while others do parse JWT access tokens. A single, uniform
>>> implementation for the AS would than mix both as well.
>> 
>> See above - I don’t see any issue. 
>> 
>>> 
>>> A last use case could be exchanging access tokens with a subset of the full
>>> set of applicable parameters, to reduce the size of access tokens. Additional
>>> information can be exchanged via introspection, resulting in mixed JWT access
>>> tokens and introspection as well.
>> 
>> That’s all possible within the current text. 
>> 
>> kind regards,
>> Torsten 
>> 
>>> 
>>> Kind regards,
>>> Remco Schaar
>>> 
>>> -----Oorspronkelijk bericht-----
>>> Van: Torsten Lodderstedt <torsten@lodderstedt.net> 
>>> Verzonden: zaterdag 17 augustus 2019 14:00
>>> Aan: Schaar, R.M. (Remco) - Logius <remco.schaar@logius.nl>
>>> CC: oauth@ietf.org
>>> Onderwerp: Re: [OAUTH-WG] Question regarding draft-ietf-oauth-jwt-introspection-response-05
>>> 
>>> Hi Remco,
>>> 
>>>> On 6. Aug 2019, at 16:01, Schaar, R.M. (Remco) - Logius <remco.schaar@logius.nl> wrote:
>>>> 
>>>> Hello,
>>> 
>>> [...]
>>> RFC 7519 and RFC 7662 “just” define different representations for token data. In RFC 7519 the data is carried in the token itself (which also means the format of the token is well-defined and know to the RS) whereas RFC 7662 defines a way to inspect tokens via an API provided by the AS. The latter is typically used in conjunction with opaque tokens, i.e. the RS does not have a clue how to parse and interpret the token. The token might just be a handle to a database entry at the AS in this case. 
>>> 
>>> This also means a JWT (RFC 7662) and the Introspection Response are conceptually the same from a RSs perspective.
>>> 
>>> [...]
>>> 
>>>> The ‘jti’ parameter however will always be ambiguous. As it is an identifier, it should differ for the introspected token and the introspection response by definition. Hence the semantics of ‘jti’ in a JWT introspection response is unclear. The same can apply to the ‘iat’, ‘nbf’ and ‘exp’ claims in a JWT introspection response.
>>> 
>>> I don’t understand the difference you are making. All before mentioned claims are related to the (abstract) access token. You may think of the Introspection Response as _the_ JWT representation of the access token produced by the AS for the RS.
>>> 
>>>> 
>>>> Can someone clarify the semantics of claims in an introspection response JWT that are defined in both RFC7662 and RFC7519?
>>>> 
>>>> Furthermore, the introspection response should use the ‘iss’ and ‘aud’ claims to avoid cross-JWT confusion (section 6.1). The ‘iss’ and ‘aud’ of an introspected token will typically be the same as those of the introspection response. Hence a JWT access token cannot be distinguished from an introspection response using ‘iss’ and ‘aud’ as suggested in the draft..
>>>> 
>>>> Introspection refers to JWT best-current-practice. The draft BCP recommends using explicit typing of JWTs, however the draft JWT response for introspection does not apply this recommendation and uses the generic ‘application/jwt’ instead... The BCP has other recommendations in section 3.12, but these may be insufficient to distinguish a JWT access token from a JWT introspection response.
>>> 
>>> Good point. The reason why the BCP recommends explicit typing is to prevent replay in other contexts. In the end typing is a compelling concept unfortunately not broadly used in the wild.
>>> 
>>> So the JWT Introspection Response draft copes with that attack angle by making iss and aud mandatory. 
>>> 
>>> 
>>>> 
>>>> How would people suggest to best distinguish a JWT (access) token from a JWT introspection response?
>>> 
>>> Why should you? One reason why we extended the Introspection Response was to eliminate the difference between JWTs directly used as access tokens and Introspection Responses.
>>> 
>>> best regards,
>>> Torsten. 
>>> 
>>> 
>>> Dit bericht kan informatie bevatten die niet voor u is bestemd. Indien u niet de geadresseerde bent of dit bericht abusievelijk aan u is toegezonden, wordt u verzocht dat aan de afzender te melden en het bericht te verwijderen. De Staat aanvaardt geen aansprakelijkheid voor schade, van welke aard ook, die verband houdt met risico's verbonden aan het elektronisch verzenden van berichten.
>>> This message may contain information that is not intended for you. If you are not the addressee or if this message was sent to you by mistake, you are requested to inform the sender and delete the message. The State accepts no liability for damage of any kind resulting from the risks inherent in the electronic transmission of messages.
>> 
> 
> _______________________________________________
> OAuth mailing list
> OAuth@ietf.org
> https://www.ietf.org/mailman/listinfo/oauth