rfc9770v7.txt | rfc9770.txt | |||
---|---|---|---|---|
Internet Engineering Task Force (IETF) M. Tiloca | Internet Engineering Task Force (IETF) M. Tiloca | |||
Request for Comments: 9770 RISE AB | Request for Comments: 9770 RISE AB | |||
Category: Standards Track F. Palombini | Category: Standards Track F. Palombini | |||
ISSN: 2070-1721 Ericsson AB | ISSN: 2070-1721 Ericsson AB | |||
S. Echeverria | S. Echeverria | |||
G. Lewis | G. Lewis | |||
CMU SEI | CMU SEI | |||
May 2025 | June 2025 | |||
Notification of Revoked Access Tokens in the Authentication and | Notification of Revoked Access Tokens in the Authentication and | |||
Authorization for Constrained Environments (ACE) Framework | Authorization for Constrained Environments (ACE) Framework | |||
Abstract | Abstract | |||
This document specifies a method of the Authentication and | This document specifies a method of the Authentication and | |||
Authorization for Constrained Environments (ACE) framework, which | Authorization for Constrained Environments (ACE) framework, which | |||
allows an authorization server to notify clients and resource servers | allows an authorization server to notify clients and resource servers | |||
(i.e., registered devices) about revoked access tokens. As specified | (i.e., registered devices) about revoked access tokens. As specified | |||
skipping to change at line 87 ¶ | skipping to change at line 87 ¶ | |||
6. The TRL Endpoint | 6. The TRL Endpoint | |||
6.1. Error Responses with Problem Details | 6.1. Error Responses with Problem Details | |||
6.2. Supporting Diff Queries | 6.2. Supporting Diff Queries | |||
6.2.1. Supporting the "Cursor" Extension | 6.2.1. Supporting the "Cursor" Extension | |||
6.3. Query Parameters | 6.3. Query Parameters | |||
7. Full Query of the TRL | 7. Full Query of the TRL | |||
8. Diff Query of the TRL | 8. Diff Query of the TRL | |||
9. Response Messages when Using the "Cursor" Extension | 9. Response Messages when Using the "Cursor" Extension | |||
9.1. Response to Full Query | 9.1. Response to Full Query | |||
9.2. Response to Diff Query | 9.2. Response to Diff Query | |||
9.2.1. Empty Collection | 9.2.1. Empty Update Collection | |||
9.2.2. Cursor Not Included in the Diff Query Request | 9.2.2. Cursor Not Included in the Diff Query Request | |||
9.2.3. Cursor Included in the Diff Query Request | 9.2.3. Cursor Included in the Diff Query Request | |||
10. Registration at the Authorization Server | 10. Registration at the Authorization Server | |||
11. Notification of Revoked Access Tokens | 11. Notification of Revoked Access Tokens | |||
11.1. Handling of Revoked Access Tokens and Token Hashes | 11.1. Handling of Revoked Access Tokens and Token Hashes | |||
12. ACE Token Revocation List Parameters | 12. ACE Token Revocation List Parameters | |||
13. ACE Token Revocation List Error Identifiers | 13. ACE Token Revocation List Error Identifiers | |||
14. Security Considerations | 14. Security Considerations | |||
14.1. Content Retrieval from the TRL | 14.1. Content Retrieval from the TRL | |||
14.2. Size of the TRL | 14.2. Size of the TRL | |||
skipping to change at line 589 ¶ | skipping to change at line 589 ¶ | |||
the payload of the POST request. | the payload of the POST request. | |||
* The access token can be uploaded to the RS by means of a POST | * The access token can be uploaded to the RS by means of a POST | |||
request to the /authz-info endpoint, using the media-type | request to the /authz-info endpoint, using the media-type | |||
"application/ace+cbor". When doing so (e.g., like in [RFC9203]), | "application/ace+cbor". When doing so (e.g., like in [RFC9203]), | |||
TOKEN_INFO is the value of the CBOR byte string conveyed by the | TOKEN_INFO is the value of the CBOR byte string conveyed by the | |||
'access_token' parameter, within the CBOR map specified as payload | 'access_token' parameter, within the CBOR map specified as payload | |||
of the POST request. | of the POST request. | |||
* The access token can be uploaded to the RS during a DTLS session | * The access token can be uploaded to the RS during a DTLS session | |||
establishment, e.g., like it is defined in Section 3.2.2 of | establishment, e.g., like it is defined in Section 3.3.2 of | |||
[RFC9202]. When doing so, TOKEN_INFO is the value of the | [RFC9202]. When doing so, TOKEN_INFO is the value of the | |||
'psk_identity' field of the ClientKeyExchange message (when using | 'psk_identity' field of the ClientKeyExchange message (when using | |||
DTLS 1.2 [RFC6347]) or of the 'identity' field of a PSKIdentity, | DTLS 1.2 [RFC6347]) or of the 'identity' field of a PSKIdentity, | |||
within the PreSharedKeyExtension of a ClientHello message (when | within the PreSharedKeyExtension of a ClientHello message (when | |||
using DTLS 1.3 [RFC9147]). | using DTLS 1.3 [RFC9147]). | |||
* The access token can be uploaded to the RS within the MQTT CONNECT | * The access token can be uploaded to the RS within the MQTT CONNECT | |||
packet, e.g., like it is defined in Section 2.2.4.1 of [RFC9431]. | packet, e.g., like it is defined in Section 2.2.4.1 of [RFC9431]. | |||
When doing so, TOKEN_INFO is specified within the 'Authentication | When doing so, TOKEN_INFO is specified within the 'Authentication | |||
Data' field of the MQTT CONNECT packet, following the property | Data' field of the MQTT CONNECT packet, following the property | |||
skipping to change at line 721 ¶ | skipping to change at line 721 ¶ | |||
NoQX7N7ZYMmpUDkR-Cx9obNGwJQ3nM52 | NoQX7N7ZYMmpUDkR-Cx9obNGwJQ3nM52 | |||
YCitxoQVPzjbl7WBuB7AohdBoZOdZ24W | YCitxoQVPzjbl7WBuB7AohdBoZOdZ24W | |||
lN1lVIeh8v1K4krB8xgKvRU8kgFrEn_a | lN1lVIeh8v1K4krB8xgKvRU8kgFrEn_a | |||
1rZgN5TiysnmzTROF869lQ. | 1rZgN5TiysnmzTROF869lQ. | |||
AxY8DCtDaGlsbGljb3RoZQ. | AxY8DCtDaGlsbGljb3RoZQ. | |||
MKOle7UQrG6nSxTLX6Mqwt0orbHvAKeW | MKOle7UQrG6nSxTLX6Mqwt0orbHvAKeW | |||
nDYvpIAeZ72deHxz3roJDXQyhxx0wKaM | nDYvpIAeZ72deHxz3roJDXQyhxx0wKaM | |||
HDjUEOKIwrtkHthpqEanSBNYHZgmNOV7 | HDjUEOKIwrtkHthpqEanSBNYHZgmNOV7 | |||
sln1Eu9g3J8. | sln1Eu9g3J8. | |||
fiK51VwhsxJ-siBMR-YFiA", | fiK51VwhsxJ-siBMR-YFiA", | |||
"token_type" : "pop", | "token_type" : "PoP", | |||
"expires_in" : 86400, | "expires_in" : 86400, | |||
"ace_profile" : "1" | "ace_profile" : "coap_dtls" | |||
} | } | |||
Figure 4: Example of AS-to-Client HTTP Response Using JSON | Figure 4: Example of AS-to-Client HTTP Response Using JSON | |||
4.3. HASH_INPUT on the RS | 4.3. HASH_INPUT on the RS | |||
The following defines how the RS determines the HASH_INPUT value to | The following defines how the RS determines the HASH_INPUT value to | |||
use as input for computing the token hash of an access token, | use as input for computing the token hash of an access token, | |||
depending on the RS using either CWTs (see Section 4.3.1) or JWTs | depending on the RS using either CWTs (see Section 4.3.1) or JWTs | |||
(see Section 4.3.2). | (see Section 4.3.2). | |||
skipping to change at line 927 ¶ | skipping to change at line 927 ¶ | |||
contains a set of token hashes pertaining to the requester. In | contains a set of token hashes pertaining to the requester. In | |||
particular, all such token hashes were added to the TRL or | particular, all such token hashes were added to the TRL or | |||
removed from the TRL at the update related to the diff entry in | removed from the TRL at the update related to the diff entry in | |||
question. | question. | |||
The AS MAY support this type of query. In such a case, the AS | The AS MAY support this type of query. In such a case, the AS | |||
maintains the history of updates to the TRL as defined in | maintains the history of updates to the TRL as defined in | |||
Section 6.2. The processing of a diff query and the related | Section 6.2. The processing of a diff query and the related | |||
response format are defined in Section 8. | response format are defined in Section 8. | |||
If it supports diff queries, the AS MAY additionally support its | If it supports diff queries, the AS MAY additionally support the | |||
"Cursor" extension, which has two benefits: | related "Cursor" extension, which has two benefits: | |||
1. The AS can avoid excessively long messages when several diff | 1. The AS can avoid excessively long messages when several diff | |||
entries have to be transferred by delivering several diff query | entries have to be transferred by delivering several diff query | |||
responses, each containing one adjacent subset of diff entries at | responses, each containing one adjacent subset of diff entries at | |||
a time. | a time. | |||
2. A requester can retrieve diff entries associated with TRL updates | 2. A requester can retrieve diff entries associated with TRL updates | |||
that, even if not the most recent ones, occurred after a TRL | that, even if not the most recent ones, occurred after a TRL | |||
update associated with a diff entry indicated as a reference | update associated with a diff entry indicated as a reference | |||
point. | point. | |||
skipping to change at line 1492 ¶ | skipping to change at line 1492 ¶ | |||
requester (see Section 6.2.1) as corresponding to the most recent TRL | requester (see Section 6.2.1) as corresponding to the most recent TRL | |||
update pertaining to the requester. In fact, such a value is the | update pertaining to the requester. In fact, such a value is the | |||
current value of 'last_index' for the update collection associated | current value of 'last_index' for the update collection associated | |||
with the requester. | with the requester. | |||
9.2. Response to Diff Query | 9.2. Response to Diff Query | |||
When processing a diff query request to the TRL endpoint, the AS | When processing a diff query request to the TRL endpoint, the AS | |||
composes a response as defined in the following subsections. | composes a response as defined in the following subsections. | |||
9.2.1. Empty Collection | 9.2.1. Empty Update Collection | |||
If the update collection associated with the requester has no | If the update collection associated with the requester has no | |||
elements, the AS returns a 2.05 (Content) response. The response | elements, the AS returns a 2.05 (Content) response. The response | |||
MUST have Content-Format set to "application/ace-trl+cbor", and its | MUST have Content-Format set to "application/ace-trl+cbor", and its | |||
payload MUST be a CBOR map formatted as follows: | payload MUST be a CBOR map formatted as follows: | |||
* The 'diff_set' parameter MUST be included and MUST encode the | * The 'diff_set' parameter MUST be included and MUST encode the | |||
empty CBOR array. | empty CBOR array. | |||
* The 'cursor' parameter MUST be included and MUST encode the CBOR | * The 'cursor' parameter MUST be included and MUST encode the CBOR | |||
skipping to change at line 1761 ¶ | skipping to change at line 1761 ¶ | |||
used by the requester when establishing the mutually authenticated | used by the requester when establishing the mutually authenticated | |||
secure communication association with the AS. | secure communication association with the AS. | |||
Further details about the registration process at the AS are out of | Further details about the registration process at the AS are out of | |||
scope for this specification. Note that the registration process is | scope for this specification. Note that the registration process is | |||
also out of the scope of the ACE framework (see Section 5.5 of | also out of the scope of the ACE framework (see Section 5.5 of | |||
[RFC9200]). | [RFC9200]). | |||
11. Notification of Revoked Access Tokens | 11. Notification of Revoked Access Tokens | |||
Once registered at the AS, the administrator or registered device can | Once registered at the AS, the administrator or a registered device | |||
send a GET request to the TRL endpoint at the AS. The request can | can send a GET request to the TRL endpoint at the AS. The request | |||
express the wish for a full query (see Section 7) or a diff query | can express the wish for a full query (see Section 7) or a diff query | |||
(see Section 8) of the TRL. Also, the request can include the CoAP | (see Section 8) of the TRL. Also, the request can include the CoAP | |||
Observe Option set to 0 (register) in order to start an observation | Observe Option set to 0 (register) in order to start an observation | |||
of the TRL endpoint as per Section 3.1 of [RFC7641]. | of the TRL endpoint as per Section 3.1 of [RFC7641]. | |||
In case the request is successfully processed, the AS replies with a | In case the request is successfully processed, the AS replies with a | |||
2.05 (Content) response. In particular, if the AS supports diff | 2.05 (Content) response. In particular, if the AS supports diff | |||
queries but not the "Cursor" extension (see Sections 6.2 and 6.2.1), | queries but not the "Cursor" extension (see Sections 6.2 and 6.2.1), | |||
then the payload of the response is formatted as defined in Sections | then the payload of the response is formatted as defined in Sections | |||
7 or 8, in case the GET request has yielded the execution of a full | 7 or 8, in case the GET request has yielded the execution of a full | |||
query or of a diff query of the TRL, respectively. Instead, if the | query or of a diff query of the TRL, respectively. Instead, if the | |||
skipping to change at line 2172 ¶ | skipping to change at line 2172 ¶ | |||
computed and stored by C and the AS. Finally, the RS stores the | computed and stored by C and the AS. Finally, the RS stores the | |||
manipulated access token and the corresponding wrong token hash. | manipulated access token and the corresponding wrong token hash. | |||
Later on, if the access token is revoked and the AS provides the RS | Later on, if the access token is revoked and the AS provides the RS | |||
with the corresponding correct token hash, the RS does not recognize | with the corresponding correct token hash, the RS does not recognize | |||
the received token hash among the stored ones; therefore, the RS does | the received token hash among the stored ones; therefore, the RS does | |||
not delete the revoked access token. | not delete the revoked access token. | |||
14.7. Two Token Hashes at the RS Using JWTs | 14.7. Two Token Hashes at the RS Using JWTs | |||
Section 4.3.2 states that an RS using JWTs as access tokens has to | Section 4.3.2 specifies that an RS using JWTs as access tokens has to | |||
compute and store two token hashes associated with the same access | compute and store two token hashes associated with the same access | |||
token. This is because the RS does not know for sure if the AS | token. This is because the RS does not know for sure if the AS | |||
provided the access token to the client by means of an AS-to-Client | provided the access token to the client by means of an AS-to-Client | |||
response encoded in CBOR or in JSON. | response encoded in CBOR or in JSON. | |||
Taking advantage of that, a dishonest client can attempt to perform | Taking advantage of that, a dishonest client can attempt to perform | |||
an attack against the RS. That is, the client can first receive the | an attack against the RS. That is, the client can first receive the | |||
JWT in an AS-to-Client response encoded in CBOR (JSON). Then, the | JWT in an AS-to-Client response encoded in CBOR (JSON). Then, the | |||
client can upload the JWT to the RS in a way that makes the RS | client can upload the JWT to the RS in a way that makes the RS | |||
believe that the client instead received the JWT in an AS-to-Client | believe that the client instead received the JWT in an AS-to-Client | |||
skipping to change at line 2197 ¶ | skipping to change at line 2197 ¶ | |||
computes a token hash h' different from the token hash h computed by | computes a token hash h' different from the token hash h computed by | |||
the AS and the client. It follows that, if the AS revokes the access | the AS and the client. It follows that, if the AS revokes the access | |||
token and advertises the right token hash h, then the RS will not | token and advertises the right token hash h, then the RS will not | |||
learn about the access token revocation; therefore, the RS will not | learn about the access token revocation; therefore, the RS will not | |||
delete the access token. | delete the access token. | |||
Fundamentally, this would happen because the HASH_INPUT used to | Fundamentally, this would happen because the HASH_INPUT used to | |||
compute the token hash of a JWT depends on whether the AS-to-Client | compute the token hash of a JWT depends on whether the AS-to-Client | |||
response is encoded in CBOR or in JSON. This makes the RS vulnerable | response is encoded in CBOR or in JSON. This makes the RS vulnerable | |||
to the attack described above when JWTs are used as access tokens. | to the attack described above when JWTs are used as access tokens. | |||
However, this is not a problem if the access token is a CWT since the | However, this is not a problem if the access token is a CWT, since | |||
HASH_INPUT used to compute the token hash of a CWT does not depend on | the HASH_INPUT used to compute the token hash of a CWT does not | |||
whether the AS-to-Client response is encoded in CBOR or in JSON. | depend on whether the AS-to-Client response is encoded in CBOR or in | |||
JSON. | ||||
While this asymmetry cannot be avoided altogether, the method defined | While this asymmetry cannot be avoided altogether, the method defined | |||
for the AS and the client in Section 4.2 deliberately penalizes the | for the AS and the client in Section 4.2 deliberately penalizes the | |||
case where the RS uses JWTs as access tokens. In such a case, the RS | case where the RS uses JWTs as access tokens. In such a case, the RS | |||
effectively neutralizes the attack described above by computing and | effectively neutralizes the attack described above by computing and | |||
storing two token hashes associated with the same access token (see | storing two token hashes associated with the same access token (see | |||
Section 4.3.2). | Section 4.3.2). | |||
Conversely, this design deliberately favors the case where the RS | Conversely, this design deliberately favors the case where the RS | |||
uses CWTs as access tokens, which is a preferable option for | uses CWTs as access tokens, which is a preferable option for | |||
skipping to change at line 2737 ¶ | skipping to change at line 2738 ¶ | |||
Appendix C. Interaction Examples | Appendix C. Interaction Examples | |||
This section provides examples of interactions between an RS as a | This section provides examples of interactions between an RS as a | |||
registered device and an AS. In the examples, all the access tokens | registered device and an AS. In the examples, all the access tokens | |||
issued by the AS are intended to be consumed by the considered RS. | issued by the AS are intended to be consumed by the considered RS. | |||
The AS supports both full queries and diff queries of the TRL, as | The AS supports both full queries and diff queries of the TRL, as | |||
defined in Sections 7 and 8, respectively. | defined in Sections 7 and 8, respectively. | |||
Registration is assumed to be done by the RS sending a POST request | The RS registration is assumed to be done by the RS sending a POST | |||
with an unspecified payload to the AS, which replies with a 2.01 | request with an unspecified payload to the AS, which replies with a | |||
(Created) response. The payload of the registration response is | 2.01 (Created) response. The payload of the registration response is | |||
assumed to be a CBOR map, which, in turn, is assumed to include the | assumed to be a CBOR map, which, in turn, is assumed to include the | |||
following entries: | following entries: | |||
* a 'trl_path' parameter specifying the path of the TRL endpoint; | * a 'trl_path' parameter specifying the path of the TRL endpoint; | |||
* a 'trl_hash' parameter specifying the "Hash Name String" of the | * a 'trl_hash' parameter specifying the "Hash Name String" of the | |||
hash function used to compute token hashes as defined in | hash function used to compute token hashes as defined in | |||
Section 4; | Section 4; | |||
* a 'max_n' parameter specifying the value of MAX_N, i.e., the | * a 'max_n' parameter specifying the value of MAX_N, i.e., the | |||
maximum number of series items that the AS retains in the update | maximum number of series items that the AS retains in the update | |||
collection associated with a registered device (see Section 8); | collection associated with a registered device (see Section 6.2); | |||
* possible further parameters related to the registration process. | * possible further parameters related to the registration process. | |||
Furthermore, 'h(x)' refers to the hash function used to compute the | Furthermore, 'h(x)' refers to the hash function used to compute the | |||
token hashes, as defined in Section 4 of this specification and | token hashes, as defined in Section 4 of this specification and | |||
according to [RFC6920]. Assuming the usage of CWTs transported in | according to [RFC6920]. Assuming the usage of CWTs transported in | |||
AS-to-Client responses encoded in CBOR (see Section 4.2.1), | AS-to-Client responses encoded in CBOR (see Section 4.2.1), | |||
'bstr.h(t1)' and 'bstr.h(t2)' denote CBOR byte strings, whose values | 'bstr.h(t1)' and 'bstr.h(t2)' denote CBOR byte strings, whose values | |||
are the token hashes of the access tokens t1 and t2, respectively. | are the token hashes of the access tokens t1 and t2, respectively. | |||
End of changes. 12 change blocks. | ||||
19 lines changed or deleted | 20 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |