| rfc9175.original | rfc9175.txt | |||
|---|---|---|---|---|
| CoRE Working Group C. Amsuess | Internet Engineering Task Force (IETF) C. Amsüss | |||
| Internet-Draft | Request for Comments: 9175 | |||
| Updates: 7252 (if approved) J. Mattsson | Updates: 7252 J. Preuß Mattsson | |||
| Intended status: Standards Track G. Selander | Category: Standards Track G. Selander | |||
| Expires: 7 April 2022 Ericsson AB | ISSN: 2070-1721 Ericsson AB | |||
| 4 October 2021 | February 2022 | |||
| CoAP: Echo, Request-Tag, and Token Processing | Constrained Application Protocol (CoAP): Echo, Request-Tag, and Token | |||
| draft-ietf-core-echo-request-tag-14 | Processing | |||
| Abstract | Abstract | |||
| This document specifies enhancements to the Constrained Application | This document specifies enhancements to the Constrained Application | |||
| Protocol (CoAP) that mitigate security issues in particular use | Protocol (CoAP) that mitigate security issues in particular use | |||
| cases. The Echo option enables a CoAP server to verify the freshness | cases. The Echo option enables a CoAP server to verify the freshness | |||
| of a request or to force a client to demonstrate reachability at its | of a request or to force a client to demonstrate reachability at its | |||
| claimed network address. The Request-Tag option allows the CoAP | claimed network address. The Request-Tag option allows the CoAP | |||
| server to match block-wise message fragments belonging to the same | server to match block-wise message fragments belonging to the same | |||
| request. This document updates RFC 7252 with respect to the client | request. This document updates RFC 7252 with respect to the | |||
| Token processing requirements, forbidding non-secure reuse of Tokens | following: processing requirements for client Tokens, forbidding non- | |||
| to ensure binding of response to request when CoAP is used with a | secure reuse of Tokens to ensure response-to-request binding when | |||
| security protocol, and with respect to amplification mitigation, | CoAP is used with a security protocol, and amplification mitigation | |||
| where the use of Echo is now recommended. | (where the use of the Echo option is now recommended). | |||
| Discussion Venues | ||||
| This note is to be removed before publishing as an RFC. | ||||
| Discussion of this document takes place on the CORE Working Group | ||||
| mailing list (core@ietf.org), which is archived at | ||||
| https://mailarchive.ietf.org/arch/browse/core/. | ||||
| Source for this draft and an issue tracker can be found at | ||||
| https://github.com/core-wg/echo-request-tag. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on 7 April 2022. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9175. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
| as described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
| provided without warranty as described in the Simplified BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
| in the Revised BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.1. Terminology | |||
| 2. Request Freshness and the Echo Option . . . . . . . . . . . . 5 | 2. Request Freshness and the Echo Option | |||
| 2.1. Request Freshness . . . . . . . . . . . . . . . . . . . . 5 | 2.1. Request Freshness | |||
| 2.2. The Echo Option . . . . . . . . . . . . . . . . . . . . . 5 | 2.2. The Echo Option | |||
| 2.2.1. Echo Option Format . . . . . . . . . . . . . . . . . 6 | 2.2.1. Echo Option Format | |||
| 2.3. Echo Processing . . . . . . . . . . . . . . . . . . . . . 7 | 2.3. Echo Processing | |||
| 2.4. Applications of the Echo Option . . . . . . . . . . . . . 10 | 2.4. Applications of the Echo Option | |||
| 2.5. Characterization of Echo Applications . . . . . . . . . . 13 | 2.5. Characterization of Echo Applications | |||
| 2.5.1. Time versus Event Based Freshness . . . . . . . . . . 13 | 2.5.1. Time-Based versus Event-Based Freshness | |||
| 2.5.2. Authority over Used Information . . . . . . . . . . . 13 | 2.5.2. Authority over Used Information | |||
| 2.5.3. Protection by a Security Protocol . . . . . . . . . . 14 | 2.5.3. Protection by a Security Protocol | |||
| 2.6. Updated Amplification Mitigation Requirements for | 2.6. Updated Amplification Mitigation Requirements for Servers | |||
| Servers . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 3. Protecting Message Bodies Using Request Tags | |||
| 3. Protecting Message Bodies using Request Tags . . . . . . . . 15 | 3.1. Fragmented Message Body Integrity | |||
| 3.1. Fragmented Message Body Integrity . . . . . . . . . . . . 15 | 3.2. The Request-Tag Option | |||
| 3.2. The Request-Tag Option . . . . . . . . . . . . . . . . . 16 | 3.2.1. Request-Tag Option Format | |||
| 3.2.1. Request-Tag Option Format . . . . . . . . . . . . . . 16 | 3.3. Request-Tag Processing by Servers | |||
| 3.3. Request-Tag Processing by Servers . . . . . . . . . . . . 17 | 3.4. Setting the Request-Tag | |||
| 3.4. Setting the Request-Tag . . . . . . . . . . . . . . . . . 18 | 3.5. Applications of the Request-Tag Option | |||
| 3.5. Applications of the Request-Tag Option . . . . . . . . . 19 | 3.5.1. Body Integrity Based on Payload Integrity | |||
| 3.5.1. Body Integrity Based on Payload Integrity . . . . . . 19 | 3.5.2. Multiple Concurrent Block-Wise Operations | |||
| 3.5.2. Multiple Concurrent Block-wise Operations . . . . . . 20 | 3.5.3. Simplified Block-Wise Handling for Constrained Proxies | |||
| 3.5.3. Simplified Block-Wise Handling for Constrained | 3.6. Rationale for the Option Properties | |||
| Proxies . . . . . . . . . . . . . . . . . . . . . . . 21 | 3.7. Rationale for Introducing the Option | |||
| 3.8. Block2 and ETag Processing | ||||
| 3.6. Rationale for the Option Properties . . . . . . . . . . . 21 | 4. Token Processing for Secure Request-Response Binding | |||
| 3.7. Rationale for Introducing the Option . . . . . . . . . . 21 | 4.1. Request-Response Binding | |||
| 3.8. Block2 / ETag Processing . . . . . . . . . . . . . . . . 22 | 4.2. Updated Token Processing Requirements for Clients | |||
| 4. Token Processing for Secure Request-Response Binding . . . . 22 | 5. Security Considerations | |||
| 4.1. Request-Response Binding . . . . . . . . . . . . . . . . 22 | 5.1. Token Reuse | |||
| 4.2. Updated Token Processing Requirements for Clients . . . . 23 | 6. Privacy Considerations | |||
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 23 | 7. IANA Considerations | |||
| 5.1. Token reuse . . . . . . . . . . . . . . . . . . . . . . . 25 | 8. References | |||
| 6. Privacy Considerations . . . . . . . . . . . . . . . . . . . 26 | 8.1. Normative References | |||
| 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27 | 8.2. Informative References | |||
| 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 27 | Appendix A. Methods for Generating Echo Option Values | |||
| 8.1. Normative References . . . . . . . . . . . . . . . . . . 28 | Appendix B. Request-Tag Message Size Impact | |||
| 8.2. Informative References . . . . . . . . . . . . . . . . . 28 | Acknowledgements | |||
| Appendix A. Methods for Generating Echo Option Values . . . . . 30 | Authors' Addresses | |||
| Appendix B. Request-Tag Message Size Impact . . . . . . . . . . 32 | ||||
| Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 32 | ||||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
| 1. Introduction | 1. Introduction | |||
| The initial Constrained Application Protocol (CoAP) suite of | The initial suite of specifications for the Constrained Application | |||
| specifications ([RFC7252], [RFC7641], and [RFC7959]) was designed | Protocol (CoAP) ([RFC7252], [RFC7641], and [RFC7959]) was designed | |||
| with the assumption that security could be provided on a separate | with the assumption that security could be provided on a separate | |||
| layer, in particular by using DTLS ([RFC6347]). However, for some | layer, in particular, by using DTLS [RFC6347]. However, for some use | |||
| use cases, additional functionality or extra processing is needed to | cases, additional functionality or extra processing is needed to | |||
| support secure CoAP operations. This document specifies security | support secure CoAP operations. This document specifies security | |||
| enhancements to the Constrained Application Protocol (CoAP). | enhancements to CoAP. | |||
| [ Note to RFC editor: If C321 gets published before C280, then the | ||||
| [RFC6347] references can be upgraded to draft-ietf-tls-dtls13-43 | ||||
| without the need for further changes; the reference is to 6347 here | ||||
| because that was the stable DTLS reference when the document was last | ||||
| touched by the authors. ] | ||||
| This document specifies two CoAP options, the Echo option and the | This document specifies two CoAP options, the Echo option and the | |||
| Request-Tag option: The Echo option enables a CoAP server to verify | Request-Tag option. The Echo option enables a CoAP server to verify | |||
| the freshness of a request, which can be used to synchronize state, | the freshness of a request, which can be used to synchronize state, | |||
| or to force a client to demonstrate reachability at its claimed | or to force a client to demonstrate reachability at its claimed | |||
| network address. The Request-Tag option allows the CoAP server to | network address. The Request-Tag option allows the CoAP server to | |||
| match message fragments belonging to the same request, fragmented | match message fragments belonging to the same request, fragmented | |||
| using the CoAP block-wise transfer mechanism, which mitigates attacks | using the CoAP block-wise transfer mechanism, which mitigates attacks | |||
| and enables concurrent block-wise operations. These options in | and enables concurrent block-wise operations. These options in | |||
| themselves do not replace the need for a security protocol; they | themselves do not replace the need for a security protocol; they | |||
| specify the format and processing of data which, when integrity | specify the format and processing of data that, when integrity | |||
| protected using e.g. DTLS ([RFC6347]), TLS ([RFC8446]), or OSCORE | protected using, e.g., DTLS [RFC6347], TLS [RFC8446], or Object | |||
| ([RFC8613]), provide the additional security features. | Security for Constrained RESTful Environments (OSCORE) [RFC8613], | |||
| provide the additional security features. | ||||
| This document updates [RFC7252] with a recommendation that servers | This document updates [RFC7252] with a recommendation that servers | |||
| use the Echo option to mitigate amplification attacks. | use the Echo option to mitigate amplification attacks. | |||
| The document also updates the Token processing requirements for | The document also updates the Token processing requirements for | |||
| clients specified in [RFC7252]. The updated processing forbids non- | clients specified in [RFC7252]. The updated processing forbids non- | |||
| secure reuse of Tokens to ensure binding of responses to requests | secure reuse of Tokens to ensure binding of responses to requests | |||
| when CoAP is used with security, thus mitigating error cases and | when CoAP is used with security, thus mitigating error cases and | |||
| attacks where the client may erroneously associate the wrong response | attacks where the client may erroneously associate the wrong response | |||
| to a request. | to a request. | |||
| Each of the following sections provides a more detailed introduction | Each of the following sections provides a more-detailed introduction | |||
| to the topic at hand in its first subsection. | to the topic at hand in its first subsection. | |||
| 1.1. Terminology | 1.1. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| Like [RFC7252], this document is relying on the Representational | Like [RFC7252], this document relies on the Representational State | |||
| State Transfer [REST] architecture of the Web. | Transfer [REST] architecture of the Web. | |||
| Unless otherwise specified, the terms "client" and "server" refer to | Unless otherwise specified, the terms "client" and "server" refer to | |||
| "CoAP client" and "CoAP server", respectively, as defined in | "CoAP client" and "CoAP server", respectively, as defined in | |||
| [RFC7252]. The term "origin server" is used as in [RFC7252]. The | [RFC7252]. | |||
| term "origin client" is used in this document to denote the client | ||||
| from which a request originates; to distinguish from clients in | ||||
| proxies. | ||||
| A message's "freshness" is a measure of when a message was sent on a | A message's "freshness" is a measure of when a message was sent on a | |||
| time scale of the recipient. A server that receives a request can | timescale of the recipient. A server that receives a request can | |||
| either verify that the request is fresh or determine that it cannot | either verify that the request is fresh or determine that it cannot | |||
| be verified that the request is fresh. What is considered a fresh | be verified that the request is fresh. What is considered a fresh | |||
| message is application dependent; exemplary uses are "no more than | message is application dependent; exemplary uses are "no more than 42 | |||
| one hour ago" or "after this server's last reboot". | seconds ago" or "after this server's last reboot". | |||
| The terms "payload" and "body" of a message are used as in [RFC7959]. | The terms "payload" and "body" of a message are used as in [RFC7959]. | |||
| The complete interchange of a request and a response body is called a | The complete interchange of a request and a response body is called a | |||
| (REST) "operation". An operation fragmented using [RFC7959] is | (REST) "operation". An operation fragmented using [RFC7959] is | |||
| called a "block-wise operation". A block-wise operation which is | called a "block-wise operation". A block-wise operation that is | |||
| fragmenting the request body is called a "block-wise request | fragmenting the request body is called a "block-wise request | |||
| operation". A block-wise operation which is fragmenting the response | operation". A block-wise operation that is fragmenting the response | |||
| body is called a "block-wise response operation". | body is called a "block-wise response operation". | |||
| Two request messages are said to be "matchable" if they occur between | Two request messages are said to be "matchable" if they occur between | |||
| the same endpoint pair, have the same code, and have the same set of | the same endpoint pair, have the same code, and have the same set of | |||
| options, with the exception that elective NoCacheKey options and | options, with the exception that elective NoCacheKey options and | |||
| options involved in block-wise transfer (Block1, Block2 and Request- | options involved in block-wise transfer (Block1, Block2, and Request- | |||
| Tag) need not be the same. Two operations are said to be matchable | Tag) need not be the same. Two blockwise request operations are said | |||
| if any of their messages are. | to be matchable if their request messages are matchable. | |||
| Two matchable block-wise operations are said to be "concurrent" if a | Two matchable block-wise request operations are said to be | |||
| block of the second request is exchanged even though the client still | "concurrent" if a block of the second request is exchanged even | |||
| intends to exchange further blocks in the first operation. | though the client still intends to exchange further blocks in the | |||
| (Concurrent block-wise request operations from a single endpoint are | first operation. (Concurrent block-wise request operations from a | |||
| impossible with the options of [RFC7959] (see the last paragraphs of | single endpoint are impossible with the options of [RFC7959] -- see | |||
| Sections 2.4 and 2.5) because the second operation's block overwrites | the last paragraphs of Sections 2.4 and 2.5 -- because the second | |||
| any state of the first exchange.). | operation's block overwrites any state of the first exchange.) | |||
| The Echo and Request-Tag options are defined in this document. | The Echo and Request-Tag options are defined in this document. | |||
| 2. Request Freshness and the Echo Option | 2. Request Freshness and the Echo Option | |||
| 2.1. Request Freshness | 2.1. Request Freshness | |||
| A CoAP server receiving a request is in general not able to verify | A CoAP server receiving a request is, in general, not able to verify | |||
| when the request was sent by the CoAP client. This remains true even | when the request was sent by the CoAP client. This remains true even | |||
| if the request was protected with a security protocol, such as DTLS. | if the request was protected with a security protocol, such as DTLS. | |||
| This makes CoAP requests vulnerable to certain delay attacks which | This makes CoAP requests vulnerable to certain delay attacks that are | |||
| are particularly perilous in the case of actuators | particularly perilous in the case of actuators [COAP-ATTACKS]. Some | |||
| ([I-D.mattsson-core-coap-attacks]). Some attacks can be mitigated by | attacks can be mitigated by establishing fresh session keys, e.g., | |||
| establishing fresh session keys, e.g. performing a DTLS handshake for | performing a DTLS handshake for each request, but, in general, this | |||
| each request, but in general this is not a solution suitable for | is not a solution suitable for constrained environments, for example, | |||
| constrained environments, for example, due to increased message | due to increased message overhead and latency. Additionally, if | |||
| overhead and latency. Additionally, if there are proxies, fresh DTLS | there are proxies, fresh DTLS session keys between the server and the | |||
| session keys between server and proxy does not say anything about | proxy do not say anything about when the client made the request. In | |||
| when the client made the request. In a general hop-by-hop setting, | a general hop-by-hop setting, freshness may need to be verified in | |||
| freshness may need to be verified in each hop. | each hop. | |||
| A straightforward mitigation of potential delayed requests is that | A straightforward mitigation of potential delayed requests is that | |||
| the CoAP server rejects a request the first time it appears and asks | the CoAP server rejects a request the first time it appears and asks | |||
| the CoAP client to prove that it intended to make the request at this | the CoAP client to prove that it intended to make the request at this | |||
| point in time. | point in time. | |||
| 2.2. The Echo Option | 2.2. The Echo Option | |||
| This document defines the Echo option, a lightweight challenge- | This document defines the Echo option, a lightweight challenge- | |||
| response mechanism for CoAP that enables a CoAP server to verify the | response mechanism for CoAP that enables a CoAP server to verify the | |||
| freshness of a request. A fresh request is one whose age has not yet | freshness of a request. A fresh request is one whose age has not yet | |||
| exceeded the freshness requirements set by the server. The freshness | exceeded the freshness requirements set by the server. The freshness | |||
| requirements are application specific and may vary based on resource, | requirements are application specific and may vary based on resource, | |||
| method, and parameters outside of CoAP such as policies. The Echo | method, and parameters outside of CoAP, such as policies. The Echo | |||
| option value is a challenge from the server to the client included in | option value is a challenge from the server to the client included in | |||
| a CoAP response and echoed back to the server in one or more CoAP | a CoAP response and echoed back to the server in one or more CoAP | |||
| requests. | requests. | |||
| This mechanism is not only important in the case of actuators, or | This mechanism is not only important in the case of actuators, or | |||
| other use cases where the CoAP operations require freshness of | other use cases where the CoAP operations require freshness of | |||
| requests, but also in general for synchronizing state between CoAP | requests, but also in general for synchronizing state between a CoAP | |||
| client and server, cryptographically verifying the aliveness of the | client and server, cryptographically verifying the aliveness of the | |||
| client, or forcing a client to demonstrate reachability at its | client or forcing a client to demonstrate reachability at its claimed | |||
| claimed network address. The same functionality can be provided by | network address. The same functionality can be provided by echoing | |||
| echoing freshness indicators in CoAP payloads, but this only works | freshness indicators in CoAP payloads, but this only works for | |||
| for methods and response codes defined to have a payload. The Echo | methods and response codes defined to have a payload. The Echo | |||
| option provides a convention to transfer freshness indicators that | option provides a convention to transfer freshness indicators that | |||
| works for all methods and response codes. | works for all methods and response codes. | |||
| 2.2.1. Echo Option Format | 2.2.1. Echo Option Format | |||
| The Echo Option is elective, safe-to-forward, not part of the cache- | The Echo option is elective, safe to forward, not part of the cache- | |||
| key, and not repeatable, see Figure 1, which extends Table 4 of | key, and not repeatable (see Table 1, which extends Table 4 of | |||
| [RFC7252]). | [RFC7252]). | |||
| +--------+---+---+---+---+-------------+--------+------+---------+ | +=====+===+===+===+===+======+========+========+=========+ | |||
| | No. | C | U | N | R | Name | Format | Len. | Default | | | No. | C | U | N | R | Name | Format | Length | Default | | |||
| +--------+---+---+---+---+-------------+--------+------+---------+ | +=====+===+===+===+===+======+========+========+=========+ | |||
| | TBD252 | | | x | | Echo | opaque | 1-40 | (none) | | | 252 | | | x | | Echo | opaque | 1-40 | (none) | | |||
| +--------+---+---+---+---+-------------+--------+------+---------+ | +-----+---+---+---+---+------+--------+--------+---------+ | |||
| C = Critical, U = Unsafe, N = NoCacheKey, R = Repeatable | Table 1: Echo Option Summary | |||
| Figure 1: Echo Option Summary | C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable | |||
| The Echo option value is generated by a server, and its content and | The Echo option value is generated by a server, and its content and | |||
| structure are implementation specific. Different methods for | structure are implementation specific. Different methods for | |||
| generating Echo option values are outlined in Appendix A. Clients | generating Echo option values are outlined in Appendix A. Clients | |||
| and intermediaries MUST treat an Echo option value as opaque and make | and intermediaries MUST treat an Echo option value as opaque and make | |||
| no assumptions about its content or structure. | no assumptions about its content or structure. | |||
| When receiving an Echo option in a request, the server MUST be able | When receiving an Echo option in a request, the server MUST be able | |||
| to verify that the Echo option value (a) was generated by the server | to verify that the Echo option value (a) was generated by the server | |||
| or some other party that the server trusts, and (b) fulfills the | or some other party that the server trusts and (b) fulfills the | |||
| freshness requirements of the application. Depending on the | freshness requirements of the application. Depending on the | |||
| freshness requirements the server may verify exactly when the Echo | freshness requirements, the server may verify exactly when the Echo | |||
| option value was generated (time-based freshness) or verify that the | option value was generated (time-based freshness) or verify that the | |||
| Echo option was generated after a specific event (event-based | Echo option was generated after a specific event (event-based | |||
| freshness). As the request is bound to the Echo option value, the | freshness). As the request is bound to the Echo option value, the | |||
| server can determine that the request is not older that the Echo | server can determine that the request is not older than the Echo | |||
| option value. | option value. | |||
| When the Echo option is used with OSCORE [RFC8613] it MAY be an Inner | When the Echo option is used with OSCORE [RFC8613], it MAY be an | |||
| or Outer option, and the Inner and Outer values are independent. | Inner or Outer option, and the Inner and Outer values are | |||
| OSCORE servers MUST only produce Inner Echo options unless they are | independent. OSCORE servers MUST only produce Inner Echo options | |||
| merely testing for reachability of the client (the same as proxies | unless they are merely testing for reachability of the client (the | |||
| may do). The Inner option is encrypted and integrity protected | same as proxies may do). The Inner option is encrypted and integrity | |||
| between the endpoints, whereas the Outer option is not protected by | protected between the endpoints, whereas the Outer option is not | |||
| OSCORE. As always with OSCORE, outer options are visible to (and may | protected by OSCORE. As always with OSCORE, Outer options are | |||
| be acted on by) all proxies, and are visible on all links where no | visible to (and may be acted on by) all proxies and are visible on | |||
| additional encryption (like TLS between client and proxy) is used. | all links where no additional encryption (like TLS between client and | |||
| proxy) is used. | ||||
| 2.3. Echo Processing | 2.3. Echo Processing | |||
| The Echo option MAY be included in any request or response (see | The Echo option MAY be included in any request or response (see | |||
| Section 2.4 for different applications). | Section 2.4 for different applications). | |||
| The application decides under what conditions a CoAP request to a | The application decides under what conditions a CoAP request to a | |||
| resource is required to be fresh. These conditions can for example | resource is required to be fresh. These conditions can, for example, | |||
| include what resource is requested, the request method and other data | include what resource is requested, the request method and other data | |||
| in the request, and conditions in the environment such as the state | in the request, and conditions in the environment, such as the state | |||
| of the server or the time of the day. | of the server or the time of the day. | |||
| If a certain request is required to be fresh, the request does not | If a certain request is required to be fresh, the request does not | |||
| contain a fresh Echo option value, and the server cannot verify the | contain a fresh Echo option value, and the server cannot verify the | |||
| freshness of the request in some other way, the server MUST NOT | freshness of the request in some other way, the server MUST NOT | |||
| process the request further and SHOULD send a 4.01 Unauthorized | process the request further and SHOULD send a 4.01 (Unauthorized) | |||
| response with an Echo option. The server MAY include the same Echo | response with an Echo option. The server MAY include the same Echo | |||
| option value in several different response messages and to different | option value in several different response messages and to different | |||
| clients. Examples of this could be time-based freshness when several | clients. Examples of this could be time-based freshness (when | |||
| responses are sent closely after each other or event-based freshness | several responses are sent closely after each other) or event-based | |||
| with no event taking place between the responses. | freshness (with no event taking place between the responses). | |||
| The server may use request freshness provided by the Echo option to | The server may use request freshness provided by the Echo option to | |||
| verify the aliveness of a client or to synchronize state. The server | verify the aliveness of a client or to synchronize state. The server | |||
| may also include the Echo option in a response to force a client to | may also include the Echo option in a response to force a client to | |||
| demonstrate reachability at its claimed network address. Note that | demonstrate reachability at its claimed network address. Note that | |||
| the Echo option does not bind a request to any particular previous | the Echo option does not bind a request to any particular previous | |||
| response, but provides an indication that the client had access to | response but provides an indication that the client had access to the | |||
| the previous response at the time when it created the request. | previous response at the time when it created the request. | |||
| Upon receiving a 4.01 Unauthorized response with the Echo option, the | Upon receiving a 4.01 (Unauthorized) response with the Echo option, | |||
| client SHOULD resend the original request with the addition of an | the client SHOULD resend the original request with the addition of an | |||
| Echo option with the received Echo option value. The client MAY send | Echo option with the received Echo option value. The client MAY send | |||
| a different request compared to the original request. Upon receiving | a different request compared to the original request. Upon receiving | |||
| any other response with the Echo option, the client SHOULD echo the | any other response with the Echo option, the client SHOULD echo the | |||
| Echo option value in the next request to the server. The client MAY | Echo option value in the next request to the server. The client MAY | |||
| include the same Echo option value in several different requests to | include the same Echo option value in several different requests to | |||
| the server, or discard it at any time (especially to avoid tracking, | the server or discard it at any time (especially to avoid tracking; | |||
| see Section 6). | see Section 6). | |||
| A client MUST only send Echo values to endpoints it received them | A client MUST only send Echo option values to endpoints it received | |||
| from (where as defined in [RFC7252] Section 1.2, the security | them from (where, as defined in Section 1.2 of [RFC7252], the | |||
| association is part of the endpoint). In OSCORE processing, that | security association is part of the endpoint). In OSCORE processing, | |||
| means sending Echo values from Outer options (or from non-OSCORE | that means sending Echo option values from Outer options (or from | |||
| responses) back in Outer options, and those from Inner options in | non-OSCORE responses) back in Outer options and sending those from | |||
| Inner options in the same security context. | Inner options in Inner options in the same security context. | |||
| Upon receiving a request with the Echo option, the server determines | Upon receiving a request with the Echo option, the server determines | |||
| if the request is required to be fresh. If not, the Echo option MAY | if the request is required to be fresh. If not, the Echo option MAY | |||
| be ignored. If the request is required to be fresh and the server | be ignored. If the request is required to be fresh and the server | |||
| cannot verify the freshness of the request in some other way, the | cannot verify the freshness of the request in some other way, the | |||
| server MUST use the Echo option to verify that the request is fresh. | server MUST use the Echo option to verify that the request is fresh. | |||
| If the server cannot verify that the request is fresh, the request is | If the server cannot verify that the request is fresh, the request is | |||
| not processed further, and an error message MAY be sent. The error | not processed further, and an error message MAY be sent. The error | |||
| message SHOULD include a new Echo option. | message SHOULD include a new Echo option. | |||
| One way for the server to verify freshness is to bind the Echo value | One way for the server to verify freshness is to bind the Echo option | |||
| to a specific point in time and verify that the request is not older | value to a specific point in time and verify that the request is not | |||
| than a certain threshold T. The server can verify this by checking | older than a certain threshold T. The server can verify this by | |||
| that (t1 - t0) < T, where t1 is the request receive time and t0 is | checking that (t1 - t0) < T, where t1 is the request receive time and | |||
| the time when the Echo option value was generated. An example | t0 is the time when the Echo option value was generated. An example | |||
| message flow over DTLS is shown Figure 2. | message flow over DTLS is shown Figure 1. | |||
| Client Server | Client Server | |||
| | | | | | | |||
| +------>| Code: 0.03 (PUT) | +------>| Code: 0.03 (PUT) | |||
| | PUT | Token: 0x41 | | PUT | Token: 0x41 | |||
| | | Uri-Path: lock | | | Uri-Path: lock | |||
| | | Payload: 0 (Unlock) | | | Payload: 0 (Unlock) | |||
| | | | | | | |||
| |<------+ Code: 4.01 (Unauthorized) | |<------+ Code: 4.01 (Unauthorized) | |||
| | 4.01 | Token: 0x41 | | 4.01 | Token: 0x41 | |||
| skipping to change at page 9, line 5 ¶ | skipping to change at line 359 ¶ | |||
| | | Uri-Path: lock | | | Uri-Path: lock | |||
| | | Echo: 0x00000009437468756c687521 (t0 = 9, +MAC) | | | Echo: 0x00000009437468756c687521 (t0 = 9, +MAC) | |||
| | | Payload: 0 (Unlock) | | | Payload: 0 (Unlock) | |||
| | | | | | | |||
| | | Verify MAC, compare t1 - t0 = 1 < T => permitted. | | | Verify MAC, compare t1 - t0 = 1 < T => permitted. | |||
| | | | | | | |||
| |<------+ Code: 2.04 (Changed) | |<------+ Code: 2.04 (Changed) | |||
| | 2.04 | Token: 0x42 | | 2.04 | Token: 0x42 | |||
| | | | | | | |||
| Figure 2: Example Message Flow for Time-Based Freshness using the | Figure 1: Example Message Flow for Time-Based Freshness Using the | |||
| 'Integrity Protected Timestamp' construction of Appendix A | 'Integrity-Protected Timestamp' Construction of Appendix A | |||
| Another way for the server to verify freshness is to maintain a cache | Another way for the server to verify freshness is to maintain a cache | |||
| of values associated to events. The size of the cache is defined by | of values associated to events. The size of the cache is defined by | |||
| the application. In the following we assume the cache size is 1, in | the application. In the following, we assume the cache size is 1, in | |||
| which case freshness is defined as no new event has taken place. At | which case, freshness is defined as "no new event has taken place". | |||
| each event a new value is written into the cache. The cache values | At each event, a new value is written into the cache. The cache | |||
| MUST be different except with negligible probability. The server | values MUST be different or chosen in a way so the probability for | |||
| verifies freshness by checking that e0 equals e1, where e0 is the | collisions is negligible. The server verifies freshness by checking | |||
| cached value when the Echo option value was generated, and e1 is the | that e0 equals e1, where e0 is the cached value when the Echo option | |||
| cached value at the reception of the request. An example message | value was generated, and e1 is the cached value at the reception of | |||
| flow over DTLS is shown in Figure 3. | the request. An example message flow over DTLS is shown in Figure 2. | |||
| Client Server | Client Server | |||
| | | | | | | |||
| +------>| Code: 0.03 (PUT) | +------>| Code: 0.03 (PUT) | |||
| | PUT | Token: 0x41 | | PUT | Token: 0x41 | |||
| | | Uri-Path: lock | | | Uri-Path: lock | |||
| | | Payload: 0 (Unlock) | | | Payload: 0 (Unlock) | |||
| | | | | | | |||
| |<------+ Code: 4.01 (Unauthorized) | |<------+ Code: 4.01 (Unauthorized) | |||
| | 4.01 | Token: 0x41 | | 4.01 | Token: 0x41 | |||
| skipping to change at page 9, line 45 ¶ | skipping to change at line 399 ¶ | |||
| | PUT | Token: 0x42 | | PUT | Token: 0x42 | |||
| | | Uri-Path: lock | | | Uri-Path: lock | |||
| | | Echo: 0x05 | | | Echo: 0x05 | |||
| | | Payload: 0 (Unlock) | | | Payload: 0 (Unlock) | |||
| | | | | | | |||
| | | Compare e1 = e0 => permitted. | | | Compare e1 = e0 => permitted. | |||
| | | | | | | |||
| |<------+ Code: 2.04 (Changed) | |<------+ Code: 2.04 (Changed) | |||
| | 2.04 | Token: 0x42 | | 2.04 | Token: 0x42 | |||
| | | Echo: 0x06 (e2 = 6, to allow later locking | | | Echo: 0x06 (e2 = 6, to allow later locking | |||
| | | without more round-trips) | | | without more round trips) | |||
| | | | | | | |||
| Figure 3: Example Message Flow for Event-Based Freshness using | Figure 2: Example Message Flow for Event-Based Freshness Using | |||
| the 'Persistent Counter' construction of Appendix A | the 'Persistent Counter' Construction of Appendix A | |||
| When used to serve freshness requirements (including client aliveness | When used to serve freshness requirements (including client aliveness | |||
| and state synchronizing), the Echo option value MUST be integrity | and state synchronizing), the Echo option value MUST be integrity | |||
| protected between the intended endpoints, e.g. using DTLS, TLS, or an | protected between the intended endpoints, e.g., using DTLS, TLS, or | |||
| OSCORE Inner option ([RFC8613]). When used to demonstrate | an OSCORE Inner option [RFC8613]. When used to demonstrate | |||
| reachability at a claimed network address, the Echo option SHOULD be | reachability at a claimed network address, the Echo option SHOULD be | |||
| a MAC of the claimed address, but MAY be unprotected. Combining | a Message Authentication Code (MAC) of the claimed address but MAY be | |||
| different Echo applications can necessitate different choices, see | unprotected. Combining different Echo applications can necessitate | |||
| Appendix A item 2 for an example. | different choices; see Appendix A, item 2 for an example. | |||
| An Echo option MAY be sent with a successful response, i.e., even | An Echo option MAY be sent with a successful response, i.e., even | |||
| though the request satisfied any freshness requirements on the | though the request satisfied any freshness requirements on the | |||
| operation. This is called a "preemptive" Echo value, and useful when | operation. This is called a "preemptive" Echo option value and is | |||
| the server anticipates that the client will need to demonstrate | useful when the server anticipates that the client will need to | |||
| freshness relative to the current response the near future. | demonstrate freshness relative to the current response in the near | |||
| future. | ||||
| A CoAP-to-CoAP proxy MAY set an Echo option on responses, both on | A CoAP-to-CoAP proxy MAY set an Echo option on responses, both on | |||
| forwarded ones that had no Echo option or ones generated by the proxy | forwarded ones that had no Echo option or ones generated by the proxy | |||
| (from cache or as an error). If it does so, it MUST remove the Echo | (from cache or as an error). If it does so, it MUST remove the Echo | |||
| option it recognizes as one generated by itself on follow-up | option it recognizes as one generated by itself on follow-up | |||
| requests. When it receives an Echo option in a response, it MAY | requests. When it receives an Echo option in a response, it MAY | |||
| forward it to the client (and, not recognizing it as an own in future | forward it to the client (and, not recognizing it as its own in | |||
| requests, relay it in the other direction as well) or process it on | future requests, relay it in the other direction as well) or process | |||
| its own. If it does so, it MUST ensure that the client's request was | it on its own. If it does so, it MUST ensure that the client's | |||
| generated (or is re-generated) after the Echo value used to send to | request was generated (or is regenerated) after the Echo option value | |||
| the server was first seen. (In most cases, this means that the proxy | used to send to the server was first seen. (In most cases, this | |||
| needs to ask the client to repeat the request with a new Echo value.) | means that the proxy needs to ask the client to repeat the request | |||
| with a new Echo option value.) | ||||
| The CoAP server side of CoAP-to-HTTP proxies MAY request freshness, | The CoAP server side of CoAP-to-HTTP proxies MAY request freshness, | |||
| especially if they have reason to assume that access may require it | especially if they have reason to assume that access may require it | |||
| (e.g. because it is a PUT or POST); how this is determined is out of | (e.g., because it is a PUT or POST); how this is determined is out of | |||
| scope for this document. The CoAP client side of HTTP-to-CoAP | scope for this document. The CoAP client side of HTTP-to-CoAP | |||
| proxies MUST respond to Echo challenges itself if the proxy knows | proxies MUST respond to Echo challenges itself if the proxy knows | |||
| from the recent establishing of the connection that the HTTP request | from the recent establishing of the connection that the HTTP request | |||
| is fresh. Otherwise, it MUST NOT repeat an unsafe request and SHOULD | is fresh. Otherwise, it MUST NOT repeat an unsafe request and SHOULD | |||
| respond with 503 Service Unavailable, Retry-After: 0 and terminate | respond with a 503 (Service Unavailable) with a Retry-After value of | |||
| any underlying Keep-Alive connection. If the HTTP request arrived in | 0 seconds and terminate any underlying Keep-Alive connection. If the | |||
| Early Data, the proxy SHOULD use a 425 Too Early response instead | HTTP request arrived in early data, the proxy SHOULD use a 425 (Too | |||
| (see [RFC8470]). They MAY also use other mechanisms to establish | Early) response instead (see [RFC8470]). The proxy MAY also use | |||
| freshness of the HTTP request that are not specified here. | other mechanisms to establish freshness of the HTTP request that are | |||
| not specified here. | ||||
| 2.4. Applications of the Echo Option | 2.4. Applications of the Echo Option | |||
| Unless otherwise noted, all these applications require a security | Unless otherwise noted, all these applications require a security | |||
| protocol to be used, and the Echo option to be protected by it. | protocol to be used and the Echo option to be protected by it. | |||
| 1. Actuation requests often require freshness guarantees to avoid | 1. Actuation requests often require freshness guarantees to avoid | |||
| accidental or malicious delayed actuator actions. In general, | accidental or malicious delayed actuator actions. In general, | |||
| all non-safe methods (e.g. POST, PUT, DELETE) may require | all unsafe methods (e.g., POST, PUT, and DELETE) may require | |||
| freshness guarantees for secure operation. | freshness guarantees for secure operation. | |||
| * The same Echo value may be used for multiple actuation | * The same Echo option value may be used for multiple actuation | |||
| requests to the same server, as long as the total time since | requests to the same server, as long as the total time since | |||
| the Echo option value was generated is below the freshness | the Echo option value was generated is below the freshness | |||
| threshold. | threshold. | |||
| * For actuator applications with low delay tolerance, to avoid | * For actuator applications with low delay tolerance, to avoid | |||
| additional round-trips for multiple requests in rapid | additional round trips for multiple requests in rapid | |||
| sequence, the server may send preemptive Echo values in | sequence, the server may send preemptive Echo option values in | |||
| successful requests, irrespectively of whether the request | successful requests, irrespectively of whether or not the | |||
| contained an Echo option or not. The client then uses the | request contained an Echo option. The client then uses the | |||
| Echo option with the new value in the next actuation request, | Echo option with the new value in the next actuation request, | |||
| and the server compares the receive time accordingly. | and the server compares the receive time accordingly. | |||
| 2. A server may use the Echo option to synchronize properties (such | 2. A server may use the Echo option to synchronize properties (such | |||
| as state or time) with a requesting client. A server MUST NOT | as state or time) with a requesting client. A server MUST NOT | |||
| synchronize a property with a client which is not the authority | synchronize a property with a client that is not the authority of | |||
| of the property being synchronized. E.g. if access to a server | the property being synchronized. For example, if access to a | |||
| resource is dependent on time, then server MUST NOT synchronize | server resource is dependent on time, then the server MUST NOT | |||
| time with a client requesting access unless the client is time | synchronize time with a client requesting access unless the | |||
| authority for the server. | client is a time authority for the server. | |||
| Note that the state to be synchronized is not carried inside the | Note that the state to be synchronized is not carried inside the | |||
| Echo option. Any explicit state information needs to be carried | Echo option. Any explicit state information needs to be carried | |||
| along in the messages the Echo value is sent in; the Echo | along in the messages the Echo option value is sent in; the Echo | |||
| mechanism only provides a partial order on the messages' | mechanism only provides a partial order on the messages' | |||
| processing. | processing. | |||
| * If a server reboots during operation it may need to | * If a server reboots during operation, it may need to | |||
| synchronize state or time before continuing the interaction. | synchronize state or time before continuing the interaction. | |||
| For example, with OSCORE it is possible to reuse a partly | For example, with OSCORE, it is possible to reuse a partly | |||
| persistently stored security context by synchronizing the | persistently stored security context by synchronizing the | |||
| Partial IV (sequence number) using the Echo option as | Partial IV (sequence number) using the Echo option, as | |||
| specified in Section 7.5 of [RFC8613]. | specified in Section 7.5 of [RFC8613]. | |||
| * A device joining a CoAP group communication | * A device joining a CoAP group communication [GROUP-COAP] | |||
| [I-D.ietf-core-groupcomm-bis] protected with OSCORE | protected with OSCORE [GROUP-OSCORE] may be required to | |||
| [I-D.ietf-core-oscore-groupcomm] may be required to initially | initially synchronize its replay window state with a client by | |||
| synchronize its replay window state with a client by using the | using the Echo option in a unicast response to a multicast | |||
| Echo option in a unicast response to a multicast request. The | request. The client receiving the response with the Echo | |||
| client receiving the response with the Echo option includes | option includes the Echo option value in a subsequent unicast | |||
| the Echo value in a subsequent unicast request to the | request to the responding server. | |||
| responding server. | ||||
| 3. An attacker can perform a denial-of-service attack by putting a | 3. An attacker can perform a denial-of-service attack by putting a | |||
| victim's address in the source address of a CoAP request and | victim's address in the source address of a CoAP request and | |||
| sending the request to a resource with a large amplification | sending the request to a resource with a large amplification | |||
| factor. The amplification factor is the ratio between the size | factor. The amplification factor is the ratio between the size | |||
| of the request and the total size of the response(s) to that | of the request and the total size of the response(s) to that | |||
| request. A server that provides a large amplification factor to | request. A server that provides a large amplification factor to | |||
| an unauthenticated peer SHOULD mitigate amplification attacks as | an unauthenticated peer SHOULD mitigate amplification attacks, as | |||
| described in Section 11.3 of [RFC7252]. One way to mitigate such | described in Section 11.3 of [RFC7252]. One way to mitigate such | |||
| attacks is that the server responds to the alleged source address | attacks is for the server to respond to the alleged source | |||
| of the request with an Echo option in short response message | address of the request with an Echo option in a short response | |||
| (e.g. 4.01 Unauthorized), thereby requesting the client to verify | message (e.g., 4.01 (Unauthorized)), thereby requesting the | |||
| its source address. This needs to be done only once per endpoint | client to verify its source address. This needs to be done only | |||
| and limits the range of potential victims from the general | once per endpoint and limits the range of potential victims from | |||
| Internet to endpoints that have been previously in contact with | the general Internet to endpoints that have been previously in | |||
| the server. For this application, the Echo option can be used in | contact with the server. For this application, the Echo option | |||
| messages that are not integrity protected, for example during | can be used in messages that are not integrity protected, for | |||
| discovery. (This is formally recommended in Section 2.6). | example, during discovery. (This is formally recommended in | |||
| Section 2.6.) | ||||
| * In the presence of a proxy, a server will not be able to | * In the presence of a proxy, a server will not be able to | |||
| distinguish different origin client endpoints. Following from | distinguish different origin client endpoints, i.e., the | |||
| the recommendation above, a proxy that provides a large | client from which a request originates. Following from the | |||
| recommendation above, a proxy that provides a large | ||||
| amplification factor to unauthenticated peers SHOULD mitigate | amplification factor to unauthenticated peers SHOULD mitigate | |||
| amplification attacks. The proxy SHOULD use Echo to verify | amplification attacks. The proxy SHOULD use the Echo option | |||
| origin reachability as described in Section 2.3. The proxy | to verify origin reachability, as described in Section 2.3. | |||
| MAY forward safe requests immediately to have a cached result | The proxy MAY forward safe requests immediately to have a | |||
| available when the client's repeated request arrives. | cached result available when the client's repeated request | |||
| arrives. | ||||
| * Amplification mitigation is a trade-off between giving | * Amplification mitigation is a trade-off between giving | |||
| leverage to an attacker and causing overhead. An | leverage to an attacker and causing overhead. An | |||
| amplification factor of 3 (i.e., don't send more than three | amplification factor of 3 (i.e., don't send more than three | |||
| times the number of bytes received until the peer's address is | times the number of bytes received until the peer's address is | |||
| confirmed) is considered acceptable for unconstrained | confirmed) is considered acceptable for unconstrained | |||
| applications in [RFC9000] Section 8. | applications in [RFC9000], Section 8. | |||
| When that limit is applied and no further context is | When that limit is applied and no further context is | |||
| available, a safe default is sending initial responses no | available, a safe default is sending initial responses no | |||
| larger than 136 Bytes in CoAP serialization. (The number is | larger than 136 bytes in CoAP serialization. (The number is | |||
| assuming a 14 + 40 + 8 Bytes Ethernet, IP and UDP header with | assuming Ethernet, IP, and UDP headers of 14, 40, and 8 bytes, | |||
| 4 Bytes added for the CoAP header. Triple that minus the non- | respectively, with 4 bytes added for the CoAP header. Triple | |||
| CoAP headers gives the 136 Bytes). Given the token also takes | that minus the non-CoAP headers gives the 136 bytes.) Given | |||
| up space in the request, responding with 132 Bytes after the | the token also takes up space in the request, responding with | |||
| token is safe as well. | 132 bytes after the token is safe as well. | |||
| * When an Echo response is sent to mitigate amplification, it | * When an Echo response is sent to mitigate amplification, it | |||
| MUST be sent as a piggybacked or Non-confirmable response, | MUST be sent as a piggybacked or Non-confirmable response, | |||
| never as a separate one (which would cause amplification due | never as a separate one (which would cause amplification due | |||
| to retransmission). | to retransmission). | |||
| 4. A server may want to use the request freshness provided by the | 4. A server may want to use the request freshness provided by the | |||
| Echo to verify the aliveness of a client. Note that in a | Echo option to verify the aliveness of a client. Note that, in a | |||
| deployment with hop-by-hop security and proxies, the server can | deployment with hop-by-hop security and proxies, the server can | |||
| only verify aliveness of the closest proxy. | only verify aliveness of the closest proxy. | |||
| 2.5. Characterization of Echo Applications | 2.5. Characterization of Echo Applications | |||
| Use cases for the Echo option can be characterized by several | Use cases for the Echo option can be characterized by several | |||
| criteria that help determine the required properties of the Echo | criteria that help determine the required properties of the Echo | |||
| value. These criteria apply both to those listed in Section 2.4 and | option value. These criteria apply both to those listed in | |||
| any novel applications. They provide rationale for the statements in | Section 2.4 and any novel applications. They provide rationale for | |||
| the former, and guidance for the latter. | the statements in the former and guidance for the latter. | |||
| 2.5.1. Time versus Event Based Freshness | 2.5.1. Time-Based versus Event-Based Freshness | |||
| The property a client demonstrates by sending an Echo value is that | The property a client demonstrates by sending an Echo option value is | |||
| the request was sent after a certain point in time, or after some | that the request was sent after a certain point in time or after some | |||
| event happened on the server. | event happened on the server. | |||
| When events are counted, they form something that can be used as a | When events are counted, they form something that can be used as a | |||
| monotonic but very non-uniform time line. With highly regular events | monotonic but very non-uniform time line. With highly regular events | |||
| and low-resolution time, the distinction between time and event based | and low-resolution time, the distinction between time-based and | |||
| freshness can be blurred: "No longer than a month ago" is similar to | event-based freshness can be blurred: "no longer than a month ago" is | |||
| "since the last full moon". | similar to "since the last full moon". | |||
| In an extreme form of event based freshness, the server can place an | In an extreme form of event-based freshness, the server can place an | |||
| event whenever an Echo value is used. This makes the Echo value | event whenever an Echo option value is used. This makes the Echo | |||
| effectively single-use. | option value effectively single use. | |||
| Event and time based freshness can be combined in a single Echo | Event-based and time-based freshness can be combined in a single Echo | |||
| value, e.g. by encrypting a timestamp with a key that changes with | option value, e.g., by encrypting a timestamp with a key that changes | |||
| every event to obtain "usable once but only for 5 minutes"-style | with every event to obtain semantics in the style of "usable once but | |||
| semantics. | only for 5 minutes". | |||
| 2.5.2. Authority over Used Information | 2.5.2. Authority over Used Information | |||
| Information conveyed to the server in the request Echo value has | Information conveyed to the server in the request Echo option value | |||
| different authority depending on the application. Understanding who | has different authority depending on the application. Understanding | |||
| or what is the authoritative source of that information helps the | who or what is the authoritative source of that information helps the | |||
| server implementer decide the necessary protection of the Echo value. | server implementor decide the necessary protection of the Echo option | |||
| value. | ||||
| If all that is conveyed to the server is information which the client | If all that is conveyed to the server is information that the client | |||
| is authorized to provide arbitrarily, (which is another way of saying | is authorized to provide arbitrarily (which is another way of saying | |||
| that the server has to trust the client on whatever Echo is being | that the server has to trust the client on whatever the Echo option | |||
| used for), then the server can issue Echo values that do not need to | is being used for), then the server can issue Echo option values that | |||
| be protected on their own. They still need to be covered by the | do not need to be protected on their own. They still need to be | |||
| security protocol that covers the rest of the message, but the Echo | covered by the security protocol that covers the rest of the message, | |||
| value can be just short enough to be unique between this server and | but the Echo option value can be just short enough to be unique | |||
| client. | between this server and client. | |||
| For example, the client's OSCORE sender sequence number (as used in | For example, the client's OSCORE Sender Sequence Number (as used in | |||
| [RFC8613] Appendix B.1.2) is such information. | [RFC8613], Appendix B.1.2) is such information. | |||
| In most other cases, there is information conveyed for which the | In most other cases, there is information conveyed for which the | |||
| server is the authority ("The request must not be older than five | server is the authority ("the request must not be older than five | |||
| minutes" is counted on the server's clock, not the client's) or which | minutes" is counted on the server's clock, not the client's) or which | |||
| even involve the network (as when performing amplification | even involve the network (as when performing amplification | |||
| mitigation). In these cases, the Echo value itself needs to be | mitigation). In these cases, the Echo option value itself needs to | |||
| protected against forgery by the client, e.g. by using a sufficiently | be protected against forgery by the client, e.g., by using a | |||
| large random value or a MAC as described in Appendix A items 1 and 2. | sufficiently large, random value or a MAC, as described in | |||
| Appendix A, items 1 and 2. | ||||
| For some applications, the server may be able to trust the client to | For some applications, the server may be able to trust the client to | |||
| also act as the authority (e.g. when using time based freshness | also act as the authority (e.g., when using time-based freshness | |||
| purely to mitigate request delay attacks); these need careful case- | purely to mitigate request delay attacks); these need careful case- | |||
| by-case evaluation. | by-case evaluation. | |||
| To issue Echo values without own protection, the server needs to | To issue Echo option values without integrity protection of its own, | |||
| trust the client to never produce requests with attacker controlled | the server needs to trust the client to never produce requests with | |||
| Echo values. The provisions of Section 2.3 (saying that an Echo | attacker-controlled Echo option values. The provisions of | |||
| value may only be sent as received from the same server) allow that. | Section 2.3 (saying that an Echo option value may only be sent as | |||
| The requirement stated there for the client to treat the Echo value | received from the same server) allow that. The requirement stated | |||
| as opaque holds for these application like for all others. | there for the client to treat the Echo option value as opaque holds | |||
| for these applications like for all others. | ||||
| When the client is the sole authority over the synchronized property, | When the client is the sole authority over the synchronized property, | |||
| the server can still use time or events to issue new Echo values. | the server can still use time or events to issue new Echo option | |||
| Then, the request's Echo value not so much proves the indicated | values. Then, the request's Echo option value not so much proves the | |||
| freshness to the server, but reflects the client's intention to | indicated freshness to the server but reflects the client's intention | |||
| indicate reception of responses containing that value when sending | to indicate reception of responses containing that value when sending | |||
| the later ones. | the later ones. | |||
| Note that a single Echo value can be used for multiple purposes (e.g. | Note that a single Echo option value can be used for multiple | |||
| to get both the sequence number information and perform amplification | purposes (e.g., to both get the sequence number information and | |||
| mitigation). In this case the stricter protection requirements | perform amplification mitigation). In this case, the stricter | |||
| apply. | protection requirements apply. | |||
| 2.5.3. Protection by a Security Protocol | 2.5.3. Protection by a Security Protocol | |||
| For meaningful results, the Echo option needs to be used in | For meaningful results, the Echo option needs to be used in | |||
| combination with a security protocol in almost all applications. | combination with a security protocol in almost all applications. | |||
| When the information extracted by the server is only about a part of | When the information extracted by the server is only about a part of | |||
| the system outside of any security protocol, then the Echo option can | the system outside of any security protocol, then the Echo option can | |||
| also be used without a security protocol (in case of OSCORE, as an | also be used without a security protocol (in case of OSCORE, as an | |||
| outer option). | Outer option). | |||
| The only known application satisfying this requirement is network | The only known application satisfying this requirement is network | |||
| address reachability, where unprotected Echo values are used both by | address reachability, where unprotected Echo option values are used | |||
| servers (e.g. during setup of a security context) and proxies (which | both by servers (e.g., during setup of a security context) and | |||
| do not necessarily have a security association with their clients) | proxies (which do not necessarily have a security association with | |||
| for amplification mitigation. | their clients) for amplification mitigation. | |||
| 2.6. Updated Amplification Mitigation Requirements for Servers | 2.6. Updated Amplification Mitigation Requirements for Servers | |||
| This section updates the amplification mitigation requirements for | This section updates the amplification mitigation requirements for | |||
| servers in [RFC7252] to recommend use of the Echo option to mitigate | servers in [RFC7252] to recommend the use of the Echo option to | |||
| amplification attacks. The requirements for clients are not updated. | mitigate amplification attacks. The requirements for clients are not | |||
| Section 11.3 of [RFC7252] is updated by adding the following text: | updated. Section 11.3 of [RFC7252] is updated by adding the | |||
| following text: | ||||
| A CoAP server SHOULD mitigate potential amplification attacks by | | A CoAP server SHOULD mitigate potential amplification attacks by | |||
| responding to unauthenticated clients with 4.01 Unauthorized | | responding to unauthenticated clients with 4.01 (Unauthorized) | |||
| including an Echo option, as described in Section 2.4 item 3 of | | including an Echo option, as described in item 3 in Section 2.4 of | |||
| [[this document]]. | | RFC 9175. | |||
| 3. Protecting Message Bodies using Request Tags | 3. Protecting Message Bodies Using Request Tags | |||
| 3.1. Fragmented Message Body Integrity | 3.1. Fragmented Message Body Integrity | |||
| CoAP was designed to work over unreliable transports, such as UDP, | CoAP was designed to work over unreliable transports, such as UDP, | |||
| and includes a lightweight reliability feature to handle messages | and includes a lightweight reliability feature to handle messages | |||
| which are lost or arrive out of order. In order for a security | that are lost or arrive out of order. In order for a security | |||
| protocol to support CoAP operations over unreliable transports, it | protocol to support CoAP operations over unreliable transports, it | |||
| must allow out-of-order delivery of messages. | must allow out-of-order delivery of messages. | |||
| The block-wise transfer mechanism [RFC7959] extends CoAP by defining | The block-wise transfer mechanism [RFC7959] extends CoAP by defining | |||
| the transfer of a large resource representation (CoAP message body) | the transfer of a large resource representation (CoAP message body) | |||
| as a sequence of blocks (CoAP message payloads). The mechanism uses | as a sequence of blocks (CoAP message payloads). The mechanism uses | |||
| a pair of CoAP options, Block1 and Block2, pertaining to the request | a pair of CoAP options, Block1 and Block2, pertaining to the request | |||
| and response payload, respectively. The block-wise functionality | and response payload, respectively. The block-wise functionality | |||
| does not support the detection of interchanged blocks between | does not support the detection of interchanged blocks between | |||
| different message bodies to the same resource having the same block | different message bodies to the same resource having the same block | |||
| number. This remains true even when CoAP is used together with a | number. This remains true even when CoAP is used together with a | |||
| security protocol such as DTLS or OSCORE, within the replay window | security protocol (such as DTLS or OSCORE) within the replay window | |||
| ([I-D.mattsson-core-coap-attacks]), which is a vulnerability of CoAP | [COAP-ATTACKS], which is a vulnerability of the block-wise | |||
| when using RFC7959. | functionality of CoAP [RFC7959]. | |||
| A straightforward mitigation of mixing up blocks from different | A straightforward mitigation of mixing up blocks from different | |||
| messages is to use unique identifiers for different message bodies, | messages is to use unique identifiers for different message bodies, | |||
| which would provide equivalent protection to the case where the | which would provide equivalent protection to the case where the | |||
| complete body fits into a single payload. The ETag option [RFC7252], | complete body fits into a single payload. The ETag option [RFC7252], | |||
| set by the CoAP server, identifies a response body fragmented using | set by the CoAP server, identifies a response body fragmented using | |||
| the Block2 option. | the Block2 option. | |||
| 3.2. The Request-Tag Option | 3.2. The Request-Tag Option | |||
| This document defines the Request-Tag option for identifying request | This document defines the Request-Tag option for identifying request | |||
| bodies, similar to ETag, but ephemeral and set by the CoAP client. | bodies, similar to ETag, but ephemeral and set by the CoAP client. | |||
| The Request-Tag is intended for use as a short-lived identifier for | The Request-Tag is intended for use as a short-lived identifier for | |||
| keeping apart distinct block-wise request operations on one resource | keeping apart distinct block-wise request operations on one resource | |||
| from one client, addressing the issue described in Section 3.1. It | from one client, addressing the issue described in Section 3.1. It | |||
| enables the receiving server to reliably assemble request payloads | enables the receiving server to reliably assemble request payloads | |||
| (blocks) to their message bodies, and, if it chooses to support it, | (blocks) to their message bodies and, if it chooses to support it, to | |||
| to reliably process simultaneous block-wise request operations on a | reliably process simultaneous block-wise request operations on a | |||
| single resource. The requests must be integrity protected if they | single resource. The requests must be integrity protected if they | |||
| should protect against interchange of blocks between different | should protect against interchange of blocks between different | |||
| message bodies. The Request-Tag option is only used in requests that | message bodies. The Request-Tag option is mainly used in requests | |||
| carry the Block1 option, and in Block2 requests following these. | that carry the Block1 option and in Block2 requests following these. | |||
| In essence, it is an implementation of the "proxy-safe elective | In essence, it is an implementation of the "proxy-safe elective | |||
| option" used just to "vary the cache key" as suggested in [RFC7959] | option" used just to "vary the cache key", as suggested in [RFC7959], | |||
| Section 2.4. | Section 2.4. | |||
| 3.2.1. Request-Tag Option Format | 3.2.1. Request-Tag Option Format | |||
| The Request-Tag option is not critical, is safe to forward, | The Request-Tag option is elective, safe to forward, repeatable, and | |||
| repeatable, and part of the cache key, see Figure 4, which extends | part of the cache key (see Table 2, which extends Table 4 of | |||
| Table 4 of [RFC7252]). | [RFC7252]). | |||
| +--------+---+---+---+---+-------------+--------+------+---------+ | +=====+===+===+===+===+=============+========+========+=========+ | |||
| | No. | C | U | N | R | Name | Format | Len. | Default | | | No. | C | U | N | R | Name | Format | Length | Default | | |||
| +--------+---+---+---+---+-------------+--------+------+---------+ | +=====+===+===+===+===+=============+========+========+=========+ | |||
| | TBD292 | | | | x | Request-Tag | opaque | 0-8 | (none) | | | 292 | | | | x | Request-Tag | opaque | 0-8 | (none) | | |||
| +--------+---+---+---+---+-------------+--------+------+---------+ | +-----+---+---+---+---+-------------+--------+--------+---------+ | |||
| C = Critical, U = Unsafe, N = NoCacheKey, R = Repeatable | Table 2: Request-Tag Option Summary | |||
| Figure 4: Request-Tag Option Summary | C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable | |||
| Request-Tag, like the block options, is both a class E and a class U | Request-Tag, like the Block options, is both a class E and a class U | |||
| option in terms of OSCORE processing (see Section 4.1 of [RFC8613]): | option in terms of OSCORE processing (see Section 4.1 of [RFC8613]). | |||
| The Request-Tag MAY be an Inner or Outer option. It influences the | The Request-Tag MAY be an Inner or Outer option. It influences the | |||
| Inner or Outer block operation, respectively. The Inner and Outer | Inner or Outer block operations, respectively. The Inner and Outer | |||
| values are therefore independent of each other. The Inner option is | values are therefore independent of each other. The Inner option is | |||
| encrypted and integrity protected between client and server, and | encrypted and integrity protected between the client and server, and | |||
| provides message body identification in case of end-to-end | it provides message body identification in case of end-to-end | |||
| fragmentation of requests. The Outer option is visible to proxies | fragmentation of requests. The Outer option is visible to proxies | |||
| and labels message bodies in case of hop-by-hop fragmentation of | and labels message bodies in case of hop-by-hop fragmentation of | |||
| requests. | requests. | |||
| The Request-Tag option is only used in the request messages of block- | The Request-Tag option is only used in the request messages of block- | |||
| wise operations. | wise operations. | |||
| The Request-Tag mechanism can be applied independently on the server | The Request-Tag mechanism can be applied independently on the server | |||
| and client sides of CoAP-to-CoAP proxies as are the block options, | and client sides of CoAP-to-CoAP proxies, as are the Block options. | |||
| though given it is safe to forward, a proxy is free to just forward | However, given it is safe to forward, a proxy is free to just forward | |||
| it when processing an operation. CoAP-to-HTTP proxies and HTTP-to- | it when processing an operation. CoAP-to-HTTP proxies and HTTP-to- | |||
| CoAP proxies can use Request-Tag on their CoAP sides; it is not | CoAP proxies can use Request-Tag on their CoAP sides; it is not | |||
| applicable to HTTP requests. | applicable to HTTP requests. | |||
| 3.3. Request-Tag Processing by Servers | 3.3. Request-Tag Processing by Servers | |||
| The Request-Tag option does not require any particular processing on | The Request-Tag option does not require any particular processing on | |||
| the server side outside of the processing already necessary for any | the server side outside of the processing already necessary for any | |||
| unknown elective proxy-safe cache-key option: The option varies the | unknown elective proxy-safe cache-key option. The option varies the | |||
| properties that distinguish block-wise operations (which includes all | properties that distinguish block-wise operations (which includes all | |||
| options except elective NoCacheKey and except Block1/2), and thus the | options except Block1, Block2, and all operations that are elective | |||
| server cannot treat messages with a different list of Request-Tag | NoCacheKey). Thus, the server cannot treat messages with a different | |||
| options as belonging to the same operation. | list of Request-Tag options as belonging to the same operation. | |||
| To keep utilizing the cache, a server (including proxies) MAY discard | To keep utilizing the cache, a server (including proxies) MAY discard | |||
| the Request-Tag option from an assembled block-wise request when | the Request-Tag option from an assembled block-wise request when | |||
| consulting its cache, as the option relates to the operation-on-the- | consulting its cache, as the option relates to the operation on the | |||
| wire and not its semantics. For example, a FETCH request with the | wire and not its semantics. For example, a FETCH request with the | |||
| same body as an older one can be served from the cache if the older's | same body as an older one can be served from the cache if the older's | |||
| Max-Age has not expired yet, even if the second operation uses a | Max-Age has not expired yet, even if the second operation uses a | |||
| Request-Tag and the first did not. (This is similar to the situation | Request-Tag and the first did not. (This is similar to the situation | |||
| about ETag in that it is formally part of the cache key, but | about ETag in that it is formally part of the cache key, but | |||
| implementations that are aware of its meaning can cache more | implementations that are aware of its meaning can cache more | |||
| efficiently, see [RFC7252] Section 5.4.2). | efficiently (see [RFC7252], Section 5.4.2). | |||
| A server receiving a Request-Tag MUST treat it as opaque and make no | A server receiving a Request-Tag MUST treat it as opaque and make no | |||
| assumptions about its content or structure. | assumptions about its content or structure. | |||
| Two messages carrying the same Request-Tag is a necessary but not | Two messages carrying the same Request-Tag is a necessary but not | |||
| sufficient condition for being part of the same operation. For one, | sufficient condition for being part of the same operation. For one, | |||
| a server may still treat them as independent messages when it sends | a server may still treat them as independent messages when it sends | |||
| 2.01/2.04 responses for every block. Also, a client that lost | 2.01 (Created) and 2.04 (Changed) responses for every block. Also, a | |||
| interest in an old operation but wants to start over can overwrite | client that lost interest in an old operation but wants to start over | |||
| the server's old state with a new initial (num=0) Block1 request and | can overwrite the server's old state with a new initial (num=0) | |||
| the same Request-Tag under some circumstances. Likewise, that | Block1 request and the same Request-Tag under some circumstances. | |||
| results in the new message not being part of the old operation. | Likewise, that results in the new message not being part of the old | |||
| operation. | ||||
| As it has always been, a server that can only serve a limited number | As it has always been, a server that can only serve a limited number | |||
| of block-wise operations at the same time can delay the start of the | of block-wise operations at the same time can delay the start of the | |||
| operation by replying with 5.03 (Service unavailable) and a Max-Age | operation by replying with 5.03 (Service Unavailable) and a Max-Age | |||
| indicating how long it expects the existing operation to go on, or it | indicating how long it expects the existing operation to go on, or it | |||
| can forget about the state established with the older operation and | can forget about the state established with the older operation and | |||
| respond with 4.08 (Request Entity Incomplete) to later blocks on the | respond with 4.08 (Request Entity Incomplete) to later blocks on the | |||
| first operation. | first operation. | |||
| 3.4. Setting the Request-Tag | 3.4. Setting the Request-Tag | |||
| For each separate block-wise request operation, the client can choose | For each separate block-wise request operation, the client can choose | |||
| a Request-Tag value, or choose not to set a Request-Tag. It needs to | a Request-Tag value or choose not to set a Request-Tag. It needs to | |||
| be set to the same value (or unset) in all messages belonging to the | be set to the same value (or unset) in all messages belonging to the | |||
| same operation, as otherwise they are treated as separate operations | same operation; otherwise, they are treated as separate operations by | |||
| by the server. | the server. | |||
| Starting a request operation matchable to a previous operation and | Starting a request operation matchable to a previous operation and | |||
| even using the same Request-Tag value is called request tag | even using the same Request-Tag value is called "request tag | |||
| recycling. The absence of a Request-Tag option is viewed as a value | recycling". The absence of a Request-Tag option is viewed as a value | |||
| distinct from all values with a single Request-Tag option set; | distinct from all values with a single Request-Tag option set; | |||
| starting a request operation matchable to a previous operation where | starting a request operation matchable to a previous operation where | |||
| neither has a Request-Tag option therefore constitutes request tag | neither has a Request-Tag option therefore constitutes request tag | |||
| recycling just as well (also called "recycling the absent option"). | recycling just as well (also called "recycling the absent option"). | |||
| Clients that use Request-Tag for a particular purpose (like in | Clients that use Request-Tag for a particular purpose (like in | |||
| Section 3.5) MUST NOT recycle a request tag unless the first | Section 3.5) MUST NOT recycle a request tag unless the first | |||
| operation has concluded. What constitutes a concluded operation | operation has concluded. What constitutes a concluded operation | |||
| depends on the purpose, and is defined accordingly; see examples in | depends on the purpose and is defined accordingly; see examples in | |||
| Section 3.5. | Section 3.5. | |||
| When Block1 and Block2 are combined in an operation, the Request-Tag | When Block1 and Block2 are combined in an operation, the Request-Tag | |||
| of the Block1 phase is set in the Block2 phase as well for otherwise | of the Block1 phase is set in the Block2 phase as well; otherwise, | |||
| the request would have a different set of options and would not be | the request would have a different set of options and would not be | |||
| recognized any more. | recognized any more. | |||
| Clients are encouraged to generate compact messages. This means | Clients are encouraged to generate compact messages. This means | |||
| sending messages without Request-Tag options whenever possible, and | sending messages without Request-Tag options whenever possible and | |||
| using short values when the absent option cannot be recycled. | using short values when the absent option cannot be recycled. | |||
| Note that Request-Tag options can be present in request messages that | Note that Request-Tag options can be present in request messages that | |||
| carry no Block option (for example, because a Request-Tag unaware | carry no Block options (for example, because a proxy unaware of | |||
| proxy reassembled them), and MUST be ignored in those. | Request-Tag reassembled them). | |||
| The Request-Tag option MUST NOT be present in response messages. | The Request-Tag option MUST NOT be present in response messages. | |||
| 3.5. Applications of the Request-Tag Option | 3.5. Applications of the Request-Tag Option | |||
| 3.5.1. Body Integrity Based on Payload Integrity | 3.5.1. Body Integrity Based on Payload Integrity | |||
| When a client fragments a request body into multiple message | When a client fragments a request body into multiple message | |||
| payloads, even if the individual messages are integrity protected, it | payloads, even if the individual messages are integrity protected, it | |||
| is still possible for an attacker to maliciously replace a later | is still possible for an attacker to maliciously replace a later | |||
| operation's blocks with an earlier operation's blocks (see | operation's blocks with an earlier operation's blocks (see | |||
| Section 2.5 of [I-D.mattsson-core-coap-attacks]). Therefore, the | Section 2.5 of [COAP-ATTACKS]). Therefore, the integrity protection | |||
| integrity protection of each block does not extend to the operation's | of each block does not extend to the operation's request body. | |||
| request body. | ||||
| In order to gain that protection, use the Request-Tag mechanism as | In order to gain that protection, use the Request-Tag mechanism as | |||
| follows: | follows: | |||
| * The individual exchanges MUST be integrity protected end-to-end | * The individual exchanges MUST be integrity protected end to end | |||
| between client and server. | between the client and server. | |||
| * The client MUST NOT recycle a request tag in a new operation | * The client MUST NOT recycle a request tag in a new operation | |||
| unless the previous operation matchable to the new one has | unless the previous operation matchable to the new one has | |||
| concluded. | concluded. | |||
| If any future security mechanisms allow a block-wise transfer to | If any future security mechanisms allow a block-wise transfer to | |||
| continue after an endpoint's details (like the IP address) have | continue after an endpoint's details (like the IP address) have | |||
| changed, then the client MUST consider messages matchable if they | changed, then the client MUST consider messages matchable if they | |||
| were sent to _any_ endpoint address using the new operation's | were sent to any endpoint address using the new operation's | |||
| security context. | security context. | |||
| * The client MUST NOT regard a block-wise request operation as | * The client MUST NOT regard a block-wise request operation as | |||
| concluded unless all of the messages the client has sent in the | concluded unless all of the messages the client has sent in the | |||
| operation would be regarded as invalid by the server if they were | operation would be regarded as invalid by the server if they were | |||
| replayed. | replayed. | |||
| When security services are provided by OSCORE, these confirmations | When security services are provided by OSCORE, these confirmations | |||
| typically result either from the client receiving an OSCORE | typically result either from the client receiving an OSCORE | |||
| response message matching the request (an empty ACK is | response message matching the request (an empty Acknowledgement | |||
| insufficient), or because the message's sequence number is old | (ACK) is insufficient) or because the message's sequence number is | |||
| enough to be outside the server's receive window. | old enough to be outside the server's receive window. | |||
| When security services are provided by DTLS, this can only be | When security services are provided by DTLS, this can only be | |||
| confirmed if there was no CoAP retransmission of the request, the | confirmed if there was no CoAP retransmission of the request, the | |||
| request was responded to, and the server uses replay protection. | request was responded to, and the server uses replay protection. | |||
| Authors of other documents (e.g. applications of [RFC8613]) are | Authors of other documents (e.g., applications of [RFC8613]) are | |||
| invited to mandate this subsection's behavior for clients that | invited to mandate this subsection's behavior for clients that | |||
| execute block-wise interactions over secured transports. In this | execute block-wise interactions over secured transports. In this | |||
| way, the server can rely on a conforming client to set the Request- | way, the server can rely on a conforming client to set the Request- | |||
| Tag option when required, and thereby have confidence in the | Tag option when required and thereby have confidence in the integrity | |||
| integrity of the assembled body. | of the assembled body. | |||
| Note that this mechanism is implicitly implemented when the security | Note that this mechanism is implicitly implemented when the security | |||
| layer guarantees ordered delivery (e.g. CoAP over TLS [RFC8323]). | layer guarantees ordered delivery (e.g., CoAP over TLS [RFC8323]). | |||
| This is because with each message, any earlier message cannot be | This is because, with each message, any earlier message cannot be | |||
| replayed any more, so the client never needs to set the Request-Tag | replayed any more, so the client never needs to set the Request-Tag | |||
| option unless it wants to perform concurrent operations. | option unless it wants to perform concurrent operations. | |||
| Body integrity only makes sense in applications that have stateful | Body integrity only makes sense in applications that have stateful | |||
| block-wise transfers. On applications where all the state is in the | block-wise transfers. On applications where all the state is in the | |||
| application (e.g. because rather than POSTing a large representation | application (e.g., because rather than POSTing a large representation | |||
| to a collection in a stateful block-wise transfer, a collection item | to a collection in a stateful block-wise transfer, a collection item | |||
| is created first, then written to once and available when written | is created first, then written to once and available when written | |||
| completely), clients need not concern themselves with body integrity | completely), clients need not concern themselves with body integrity | |||
| and thus the Request-Tag. | and thus the Request-Tag. | |||
| Body integrity is largely independent from replay protection: When no | Body integrity is largely independent from replay protection. When | |||
| replay protection is available (it is optional in DTLS), a full | no replay protection is available (it is optional in DTLS), a full | |||
| block-wise operation may be replayed, but by adhering to the above, | block-wise operation may be replayed, but, by adhering to the above, | |||
| no operations will be mixed up. The only link between body integrity | no operations will be mixed up. The only link between body integrity | |||
| and replay protection is that without replay protection, recycling is | and replay protection is that, without replay protection, recycling | |||
| not possible. | is not possible. | |||
| 3.5.2. Multiple Concurrent Block-wise Operations | 3.5.2. Multiple Concurrent Block-Wise Operations | |||
| CoAP clients, especially CoAP proxies, may initiate a block-wise | CoAP clients, especially CoAP proxies, may initiate a block-wise | |||
| request operation to a resource, to which a previous one is already | request operation to a resource, to which a previous one is already | |||
| in progress, which the new request should not cancel. A CoAP proxy | in progress, which the new request should not cancel. A CoAP proxy | |||
| would be in such a situation when it forwards operations with the | would be in such a situation when it forwards operations with the | |||
| same cache-key options but possibly different payloads. | same cache-key options but possibly different payloads. | |||
| For those cases, Request-Tag is the proxy-safe elective option | For those cases, Request-Tag is the proxy-safe elective option | |||
| suggested in [RFC7959] Section 2.4 last paragraph. | suggested in the last paragraph of Section 2.4 of [RFC7959]. | |||
| When initializing a new block-wise operation, a client has to look at | When initializing a new block-wise operation, a client has to look at | |||
| other active operations: | other active operations: | |||
| * If any of them is matchable to the new one, and the client neither | * If any of them is matchable to the new one, and the client neither | |||
| wants to cancel the old one nor postpone the new one, it can pick | wants to cancel the old one nor postpone the new one, it can pick | |||
| a Request-Tag value (including the absent option) that is not in | a Request-Tag value (including the absent option) that is not in | |||
| use by the other matchable operations for the new operation. | use by the other matchable operations for the new operation. | |||
| * Otherwise, it can start the new operation without setting the | * Otherwise, it can start the new operation without setting the | |||
| Request-Tag option on it. | Request-Tag option on it. | |||
| 3.5.3. Simplified Block-Wise Handling for Constrained Proxies | 3.5.3. Simplified Block-Wise Handling for Constrained Proxies | |||
| The Block options were defined to be unsafe to forward because a | The Block options were defined to be unsafe to forward because a | |||
| proxy that would forward blocks as plain messages would risk mixing | proxy that would forward blocks as plain messages would risk mixing | |||
| up clients' requests. | up clients' requests. | |||
| In some cases, for example when forwarding block-wise request | In some cases, for example, when forwarding block-wise request | |||
| operations, appending a Request-Tag value unique to the client can | operations, appending a Request-Tag value unique to the client can | |||
| satisfy the requirements on the proxy that come from the presence of | satisfy the requirements on the proxy that come from the presence of | |||
| a block option. | a Block option. | |||
| This is particularly useful to proxies that strive for stateless | This is particularly useful to proxies that strive for stateless | |||
| operation as described in [RFC8974] Section 4. | operations, as described in [RFC8974], Section 4. | |||
| The precise classification of cases in which such a Request-Tag | The precise classification of cases in which such a Request-Tag | |||
| option is sufficient is not trivial, especially when both request and | option is sufficient is not trivial, especially when both request and | |||
| response body are fragmented, and out of scope for this document. | response body are fragmented, and is out of scope for this document. | |||
| 3.6. Rationale for the Option Properties | 3.6. Rationale for the Option Properties | |||
| The Request-Tag option can be elective, because to servers unaware of | The Request-Tag option can be elective, because to servers unaware of | |||
| the Request-Tag option, operations with differing request tags will | the Request-Tag option, operations with differing request tags will | |||
| not be matchable. | not be matchable. | |||
| The Request-Tag option can be safe to forward but part of the cache | The Request-Tag option can be safe to forward but part of the cache | |||
| key, because proxies unaware of the Request-Tag option will consider | key, because proxies unaware of the Request-Tag option will consider | |||
| operations with differing request tags unmatchable but can still | operations with differing request tags unmatchable but can still | |||
| forward them. | forward them. | |||
| The Request-Tag option is repeatable because this easily allows | The Request-Tag option is repeatable because this easily allows | |||
| several cascaded stateless proxies to each put in an origin address. | several cascaded stateless proxies to each put in an origin address. | |||
| They can perform the steps of Section 3.5.3 without the need to | They can perform the steps of Section 3.5.3 without the need to | |||
| create an option value that is the concatenation of the received | create an option value that is the concatenation of the received | |||
| option and their own value, and can simply add a new Request-Tag | option and their own value and can simply add a new Request-Tag | |||
| option unconditionally. | option unconditionally. | |||
| In draft versions of this document, the Request-Tag option used to be | In draft versions of this document, the Request-Tag option used to be | |||
| critical and unsafe to forward. That design was based on an | critical and unsafe to forward. That design was based on an | |||
| erroneous understanding of which blocks could be composed according | erroneous understanding of which blocks could be composed according | |||
| to [RFC7959]. | to [RFC7959]. | |||
| 3.7. Rationale for Introducing the Option | 3.7. Rationale for Introducing the Option | |||
| An alternative that was considered to the Request-Tag option for | An alternative that was considered to the Request-Tag option for | |||
| coping with the problem of fragmented message body integrity | coping with the problem of fragmented message body integrity | |||
| (Section 3.5.1) was to update [RFC7959] to say that blocks could only | (Section 3.5.1) was to update [RFC7959] to say that blocks could only | |||
| be assembled if their fragments' order corresponded to the sequence | be assembled if their fragments' order corresponded to the sequence | |||
| numbers. | numbers. | |||
| That approach would have been difficult to roll out reliably on DTLS | That approach would have been difficult to roll out reliably on DTLS, | |||
| where many implementations do not expose sequence numbers, and would | where many implementations do not expose sequence numbers, and would | |||
| still not prevent attacks like in [I-D.mattsson-core-coap-attacks] | still not prevent attacks like in Section 2.5.2 of [COAP-ATTACKS]. | |||
| Section 2.5.2. | ||||
| 3.8. Block2 / ETag Processing | 3.8. Block2 and ETag Processing | |||
| The same security properties as in Section 3.5.1 can be obtained for | The same security properties as in Section 3.5.1 can be obtained for | |||
| block-wise response operations. The threat model here does not | block-wise response operations. The threat model here does not | |||
| depend on an attacker: a client can construct a wrong representation | depend on an attacker; a client can construct a wrong representation | |||
| by assembling it from blocks from different resource states. That | by assembling it from blocks from different resource states. That | |||
| can happen when a resource is modified during a transfer, or when | can happen when a resource is modified during a transfer or when some | |||
| some blocks are still valid in the client's cache. | blocks are still valid in the client's cache. | |||
| Rules stating that response body reassembly is conditional on | Rules stating that response body reassembly is conditional on | |||
| matching ETag values are already in place from Section 2.4 of | matching ETag values are already in place from Section 2.4 of | |||
| [RFC7959]. | [RFC7959]. | |||
| To gain equivalent protection to Section 3.5.1, a server MUST use the | To gain protection equivalent to that described in Section 3.5.1, a | |||
| Block2 option in conjunction with the ETag option ([RFC7252], | server MUST use the Block2 option in conjunction with the ETag option | |||
| Section 5.10.6), and MUST NOT use the same ETag value for different | ([RFC7252], Section 5.10.6) and MUST NOT use the same ETag value for | |||
| representations of a resource. | different representations of a resource. | |||
| 4. Token Processing for Secure Request-Response Binding | 4. Token Processing for Secure Request-Response Binding | |||
| 4.1. Request-Response Binding | 4.1. Request-Response Binding | |||
| A fundamental requirement of secure REST operations is that the | A fundamental requirement of secure REST operations is that the | |||
| client can bind a response to a particular request. If this is not | client can bind a response to a particular request. If this is not | |||
| ensured, a client may erroneously associate the wrong response to a | ensured, a client may erroneously associate the wrong response to a | |||
| request. The wrong response may be an old response for the same | request. The wrong response may be an old response for the same | |||
| resource or a response for a completely different resource (see e.g. | resource or a response for a completely different resource (e.g., see | |||
| Section 2.3 of [I-D.mattsson-core-coap-attacks]). For example, a | Section 2.3 of [COAP-ATTACKS]). For example, a request for the alarm | |||
| request for the alarm status "GET /status" may be associated to a | status "GET /status" may be associated to a prior response "on", | |||
| prior response "on", instead of the correct response "off". | instead of the correct response "off". | |||
| In HTTP/1.1, this type of binding is always assured by the ordered | In HTTP/1.1, this type of binding is always assured by the ordered | |||
| and reliable delivery as well as mandating that the server sends | and reliable delivery, as well as mandating that the server sends | |||
| responses in the same order that the requests were received. The | responses in the same order that the requests were received. The | |||
| same is not true for CoAP where the server (or an attacker) can | same is not true for CoAP, where the server (or an attacker) can | |||
| return responses in any order and where there can be any number of | return responses in any order and where there can be any number of | |||
| responses to a request (see e.g. [RFC7641]). In CoAP, concurrent | responses to a request (e.g., see [RFC7641]). In CoAP, concurrent | |||
| requests are differentiated by their Token. Note that the CoAP | requests are differentiated by their Token. Note that the CoAP | |||
| Message ID cannot be used for this purpose since those are typically | Message ID cannot be used for this purpose since those are typically | |||
| different for REST request and corresponding response in case of | different for the REST request and corresponding response in case of | |||
| "separate response", see Section 2.2 of [RFC7252]. | "separate response" (see Section 2.2 of [RFC7252]). | |||
| CoAP [RFC7252] does not treat Token as a cryptographically important | CoAP [RFC7252] does not treat the Token as a cryptographically | |||
| value and does not give stricter guidelines than that the Tokens | important value and does not give stricter guidelines than that the | |||
| currently "in use" SHOULD (not SHALL) be unique. If used with a | Tokens currently "in use" SHOULD (not SHALL) be unique. If used with | |||
| security protocol not providing bindings between requests and | a security protocol not providing bindings between requests and | |||
| responses (e.g. DTLS and TLS) Token reuse may result in situations | responses (e.g., DTLS and TLS), Token reuse may result in situations | |||
| where a client matches a response to the wrong request. Note that | where a client matches a response to the wrong request. Note that | |||
| mismatches can also happen for other reasons than a malicious | mismatches can also happen for other reasons than a malicious | |||
| attacker, e.g. delayed delivery or a server sending notifications to | attacker, e.g., delayed delivery or a server sending notifications to | |||
| an uninterested client. | an uninterested client. | |||
| A straightforward mitigation is to mandate clients to not reuse | A straightforward mitigation is to mandate clients to not reuse | |||
| Tokens until the traffic keys have been replaced. The following | Tokens until the traffic keys have been replaced. The following | |||
| section formalizes that. | section formalizes that. | |||
| 4.2. Updated Token Processing Requirements for Clients | 4.2. Updated Token Processing Requirements for Clients | |||
| As described in Section 4.1, the client must be able to verify that a | As described in Section 4.1, the client must be able to verify that a | |||
| response corresponds to a particular request. This section updates | response corresponds to a particular request. This section updates | |||
| the Token processing requirements for clients in [RFC7252] to always | the Token processing requirements for clients in [RFC7252] to always | |||
| assure a cryptographically secure binding of responses to requests | assure a cryptographically secure binding of responses to requests | |||
| for secure REST operations like "coaps". The Token processing for | for secure REST operations like "coaps". The Token processing for | |||
| servers is not updated. Token processing in Section 5.3.1 of | servers is not updated. Token processing in Section 5.3.1 of | |||
| [RFC7252] is updated by adding the following text: | [RFC7252] is updated by adding the following text: | |||
| When CoAP is used with a security protocol not providing bindings | | When CoAP is used with a security protocol not providing bindings | |||
| between requests and responses, the Tokens have cryptographic | | between requests and responses, the Tokens have cryptographic | |||
| importance. The client MUST make sure that Tokens are not used in a | | importance. The client MUST make sure that Tokens are not used in | |||
| way so that responses risk being associated with the wrong request. | | a way so that responses risk being associated with the wrong | |||
| | request. | ||||
| One easy way to accomplish this is to implement the Token (or part of | | | |||
| the Token) as a sequence number starting at zero for each new or | | One easy way to accomplish this is to implement the Token (or part | |||
| rekeyed secure connection. This approach SHOULD be followed. | | of the Token) as a sequence number, starting at zero for each new | |||
| | or rekeyed secure connection. This approach SHOULD be followed. | ||||
| 5. Security Considerations | 5. Security Considerations | |||
| The freshness assertion of the Echo option comes from the client | The freshness assertion of the Echo option comes from the client | |||
| reproducing the same value of the Echo option in a request as it | reproducing the same value of the Echo option in a request as it | |||
| received in a previous response. If the Echo value is a large random | received in a previous response. If the Echo option value is a large | |||
| number then there is a high probability that the request is generated | random number, then there is a high probability that the request is | |||
| after having seen the response. If the Echo value of the response | generated after having seen the response. If the Echo option value | |||
| can be guessed, e.g. if based on a small random number or a counter | of the response can be guessed, e.g., if based on a small random | |||
| (see Appendix A), then it is possible to compose a request with the | number or a counter (see Appendix A), then it is possible to compose | |||
| right Echo value ahead of time. Using guessable Echo values is only | a request with the right Echo option value ahead of time. Using | |||
| permissible in a narrow set of cases described in Section 2.5.2. | guessable Echo option values is only permissible in a narrow set of | |||
| Echo values MUST be set by the CoAP server such that the risk | cases described in Section 2.5.2. Echo option values MUST be set by | |||
| associated with unintended reuse can be managed. | the CoAP server such that the risk associated with unintended reuse | |||
| can be managed. | ||||
| If uniqueness of the Echo value is based on randomness, then the | If uniqueness of the Echo option value is based on randomness, then | |||
| availability of a secure pseudorandom number generator and truly | the availability of a secure pseudorandom number generator and truly | |||
| random seeds are essential for the security of the Echo option. If | random seeds are essential for the security of the Echo option. If | |||
| no true random number generator is available, a truly random seed | no true random number generator is available, a truly random seed | |||
| must be provided from an external source. As each pseudorandom | must be provided from an external source. As each pseudorandom | |||
| number must only be used once, an implementation needs to get a new | number must only be used once, an implementation needs to get a new | |||
| truly random seed after reboot, or continuously store state in | truly random seed after reboot or continuously store the state in | |||
| nonvolatile memory. See ([RFC8613], Appendix B.1.1) for issues and | nonvolatile memory. See [RFC8613], Appendix B.1.1 for issues and | |||
| approaches for writing to nonvolatile memory. | approaches for writing to nonvolatile memory. | |||
| A single active Echo value with 64 (pseudo-)random bits gives the | A single active Echo option value with 64 (pseudo)random bits gives | |||
| same theoretical security level as a 64-bit MAC (as used in e.g. | the same theoretical security level as a 64-bit MAC (as used in, | |||
| AES_128_CCM_8). If a random unique Echo value is intended, the Echo | e.g., AES_128_CCM_8). If a random unique Echo option value is | |||
| option value SHOULD contain 64 (pseudo-)random bits that are not | intended, the Echo option value SHOULD contain 64 (pseudo)random bits | |||
| predictable for any other party than the server. A server MAY use | that are not predictable for any other party than the server. A | |||
| different security levels for different uses cases (client aliveness, | server MAY use different security levels for different use cases | |||
| request freshness, state synchronization, network address | (client aliveness, request freshness, state synchronization, network | |||
| reachability, etc.). | address reachability, etc.). | |||
| The security provided by the Echo and Request-Tag options depends on | The security provided by the Echo and Request-Tag options depends on | |||
| the security protocol used. CoAP and HTTP proxies require (D)TLS to | the security protocol used. CoAP and HTTP proxies require (D)TLS to | |||
| be terminated at the proxies. The proxies are therefore able to | be terminated at the proxies. The proxies are therefore able to | |||
| manipulate, inject, delete, or reorder options or packets. The | manipulate, inject, delete, or reorder options or packets. The | |||
| security claims in such architectures only hold under the assumption | security claims in such architectures only hold under the assumption | |||
| that all intermediaries are fully trusted and have not been | that all intermediaries are fully trusted and have not been | |||
| compromised. | compromised. | |||
| Echo values without the protection of randomness or a MAC are limited | Echo option values without the protection of randomness or a MAC are | |||
| to cases when the client is the trusted source of all derived | limited to cases when the client is the trusted source of all derived | |||
| properties (as per Section 2.5.2). Using them needs per-application | properties (as per Section 2.5.2). Using them needs per-application | |||
| consideration of both the impact of a malicious client and of | consideration of both the impact of a malicious client and of | |||
| implementation errors in clients. These Echo values are the only | implementation errors in clients. These Echo option values are the | |||
| legitimate case for Echo values shorter than four bytes, which are | only legitimate case for Echo option values shorter than four bytes, | |||
| not necessarily secret. They MUST NOT be used unless the request | which are not necessarily secret. They MUST NOT be used unless the | |||
| Echo values are integrity protected as per Section 2.3. | Echo option values in the request are integrity protected, as per | |||
| Section 2.3. | ||||
| Servers SHOULD use a monotonic clock to generate timestamps and | Servers SHOULD use a monotonic clock to generate timestamps and | |||
| compute round-trip times. Use of non-monotonic clocks is not secure | compute round-trip times. Use of non-monotonic clocks is not secure, | |||
| as the server will accept expired Echo option values if the clock is | as the server will accept expired Echo option values if the clock is | |||
| moved backward. The server will also reject fresh Echo option values | moved backward. The server will also reject fresh Echo option values | |||
| if the clock is moved forward. Non-monotonic clocks MAY be used as | if the clock is moved forward. Non-monotonic clocks MAY be used as | |||
| long as they have deviations that are acceptable given the freshness | long as they have deviations that are acceptable given the freshness | |||
| requirements. If the deviations from a monotonic clock are known, it | requirements. If the deviations from a monotonic clock are known, it | |||
| may be possible to adjust the threshold accordingly. | may be possible to adjust the threshold accordingly. | |||
| An attacker may be able to affect the server's system time in various | An attacker may be able to affect the server's system time in various | |||
| ways such as setting up a fake NTP server or broadcasting false time | ways, such as setting up a fake NTP server or broadcasting false time | |||
| signals to radio-controlled clocks. | signals to radio-controlled clocks. | |||
| For the purpose of generating timestamps for Echo a server MAY set a | For the purpose of generating timestamps for the Echo option, a | |||
| timer at reboot and use the time since reboot, choosing the | server MAY set a timer at reboot and use the time since reboot, | |||
| granularity such that different requests arrive at different times. | choosing the granularity such that different requests arrive at | |||
| Servers MAY intermittently reset the timer and MAY generate a random | different times. Servers MAY intermittently reset the timer and MAY | |||
| offset applied to all timestamps. When resetting the timer, the | generate a random offset applied to all timestamps. When resetting | |||
| server MUST reject all Echo values that were created before the | the timer, the server MUST reject all Echo option values that were | |||
| reset. | created before the reset. | |||
| Servers that use the List of Cached Random Values and Timestamps | Servers that use the "List of Cached Random Values and Timestamps" | |||
| method described in Appendix A may be vulnerable to resource | method described in Appendix A may be vulnerable to resource | |||
| exhaustion attacks. One way to minimize state is to use the | exhaustion attacks. One way to minimize the state is to use the | |||
| Integrity Protected Timestamp method described in Appendix A. | "Integrity-Protected Timestamp" method described in Appendix A. | |||
| 5.1. Token reuse | 5.1. Token Reuse | |||
| Reusing Tokens in a way so that responses are guaranteed to not be | Reusing Tokens in a way so that responses are guaranteed to not be | |||
| associated with the wrong request is not trivial: The server may | associated with the wrong request is not trivial. The server may | |||
| process requests in any order, and send multiple responses to the | process requests in any order and send multiple responses to the same | |||
| same request. An attacker may block, delay, and reorder messages. | request. An attacker may block, delay, and reorder messages. The | |||
| The use of a sequence number is therefore recommended when CoAP is | use of a sequence number is therefore recommended when CoAP is used | |||
| used with a security protocol that does not provide bindings between | with a security protocol that does not provide bindings between | |||
| requests and responses such as DTLS or TLS. | requests and responses, such as DTLS or TLS. | |||
| For a generic response to a Confirmable request over DTLS, binding | For a generic response to a Confirmable request over DTLS, binding | |||
| can only be claimed without out-of-band knowledge if | can only be claimed without out-of-band knowledge if: | |||
| * the original request was never retransmitted, | * the original request was never retransmitted and | |||
| * the response was piggybacked in an Acknowledgement message (as a | * the response was piggybacked in an Acknowledgement message (as a | |||
| Confirmable or Non-confirmable response may have been transmitted | Confirmable or Non-confirmable response may have been transmitted | |||
| multiple times), and | multiple times). | |||
| * if observation was used, the same holds for the registration, all | If observation was used, the same holds for the registration, all | |||
| re-registrations, and the cancellation. | reregistrations, and the cancellation. | |||
| (In addition, for observations, any responses using that Token and a | (In addition, for observations, any responses using that Token and a | |||
| DTLS sequence number earlier than the cancellation Acknowledgement | DTLS sequence number earlier than the cancellation Acknowledgement | |||
| message need to be discarded. This is typically not supported in | message need to be discarded. This is typically not supported in | |||
| DTLS implementations.) | DTLS implementations.) | |||
| In some setups, Tokens can be reused without the above constraints, | In some setups, Tokens can be reused without the above constraints, | |||
| as a different component in the setup provides the associations: | as a different component in the setup provides the associations: | |||
| * In CoAP over TLS, retransmissions are not handled by the CoAP | * In CoAP over TLS, retransmissions are not handled by the CoAP | |||
| layer and behaves like a replay window size of 1. When a client | layer and behave like a replay window size of 1. When a client is | |||
| is sending TLS-protected requests without Observe to a single | sending TLS-protected requests without Observe to a single server, | |||
| server, the client can reuse a Token as soon as the previous | the client can reuse a Token as soon as the previous response with | |||
| response with that Token has been received. | that Token has been received. | |||
| * Requests whose responses are cryptographically bound to the | * Requests whose responses are cryptographically bound to the | |||
| requests (like in OSCORE) can reuse Tokens indefinitely. | requests (like in OSCORE) can reuse Tokens indefinitely. | |||
| In all other cases, a sequence number approach is RECOMMENDED as per | In all other cases, a sequence number approach is RECOMMENDED, as per | |||
| Section 4. | Section 4. | |||
| Tokens that cannot be reused need to be handled appropriately. This | Tokens that cannot be reused need to be handled appropriately. This | |||
| could be solved by increasing the Token as soon as the currently used | could be solved by increasing the Token as soon as the currently used | |||
| Token cannot be reused, or by keeping a list of all Tokens unsuitable | Token cannot be reused or by keeping a list of all Tokens unsuitable | |||
| for reuse. | for reuse. | |||
| When the Token (or part of the Token) contains a sequence number, the | When the Token (or part of the Token) contains a sequence number, the | |||
| encoding of the sequence number has to be chosen in a way to avoid | encoding of the sequence number has to be chosen in a way to avoid | |||
| any collisions. This is especially true when the Token contains more | any collisions. This is especially true when the Token contains more | |||
| information than just the sequence number, e.g. serialized state as | information than just the sequence number, e.g., the serialized | |||
| in [RFC8974]. | state, as in [RFC8974]. | |||
| 6. Privacy Considerations | 6. Privacy Considerations | |||
| Implementations SHOULD NOT put any privacy-sensitive information in | Implementations SHOULD NOT put any privacy-sensitive information in | |||
| the Echo or Request-Tag option values. Unencrypted timestamps could | the Echo or Request-Tag option values. Unencrypted timestamps could | |||
| reveal information about the server such as location or time since | reveal information about the server, such as location, time since | |||
| reboot, or that the server will accept expired certificates. | reboot, or that the server will accept expired certificates. | |||
| Timestamps MAY be used if Echo is encrypted between the client and | Timestamps MAY be used if the Echo option is encrypted between the | |||
| the server, e.g. in the case of DTLS without proxies or when using | client and the server, e.g., in the case of DTLS without proxies or | |||
| OSCORE with an Inner Echo option. | when using OSCORE with an Inner Echo option. | |||
| Like HTTP cookies, the Echo option could potentially be abused as a | Like HTTP cookies, the Echo option could potentially be abused as a | |||
| tracking mechanism that identifies a client across requests. This is | tracking mechanism that identifies a client across requests. This is | |||
| especially true for preemptive Echo values. Servers MUST NOT use the | especially true for preemptive Echo option values. Servers MUST NOT | |||
| Echo option to correlate requests for other purposes than freshness | use the Echo option to correlate requests for other purposes than | |||
| and reachability. Clients only send Echo values to the same server | freshness and reachability. Clients only send Echo option values to | |||
| from which the values were received. Compared to HTTP, CoAP clients | the same server from which the values were received. Compared to | |||
| are often authenticated and non-mobile, and servers can therefore | HTTP, CoAP clients are often authenticated and non-mobile, and | |||
| often correlate requests based on the security context, the client | servers can therefore often correlate requests based on the security | |||
| credentials, or the network address. Especially when the Echo option | context, the client credentials, or the network address. Especially | |||
| increases a server's ability to correlate requests, clients MAY | when the Echo option increases a server's ability to correlate | |||
| discard all preemptive Echo values. | requests, clients MAY discard all preemptive Echo option values. | |||
| Publicly visible generated identifiers, even when opaque (as all | Publicly visible generated identifiers, even when opaque (as all | |||
| defined in this document are), can leak information as described in | defined in this document are), can leak information as described in | |||
| [I-D.irtf-pearg-numeric-ids-generation]. To avoid effects described | [NUMERIC-IDS]. To avoid the effects described there, the absent | |||
| there, the absent Request-Tag option should be recycled as much as | Request-Tag option should be recycled as much as possible. (That is | |||
| possible. (That is generally possible as long as a security | generally possible as long as a security mechanism is in place -- | |||
| mechanism is in place - even in the case of OSCORE outer block-wise | even in the case of OSCORE outer block-wise transfers, as the OSCORE | |||
| transfers, as the OSCORE option's variation ensures that no matchable | option's variation ensures that no matchable requests are created by | |||
| requests are created by different clients). When an unprotected Echo | different clients.) When an unprotected Echo option is used to | |||
| option is used to demonstrate reachability, the recommended mechanism | demonstrate reachability, the recommended mechanism of Section 2.3 | |||
| of Section 2.3 keeps the effects to a minimum. | keeps the effects to a minimum. | |||
| 7. IANA Considerations | 7. IANA Considerations | |||
| IANA is requested to add the following option numbers to the "CoAP | IANA has added the following option numbers to the "CoAP Option | |||
| Option Numbers" registry defined by [RFC7252]: | Numbers" registry defined by [RFC7252]: | |||
| [ | ||||
| The editor is asked to suggest the numbers after TBD, as those | ||||
| satisfy the construction requirements set out in RFC7252: Echo is | ||||
| NoCacheKey but not Unsafe or Critical, so it needs to end with 11100 | ||||
| in binary representation; Request-Tag has no properties so it needs | ||||
| to end with 00 and not with 11100). | ||||
| Request-Tag was picked to not waste the precious space of less-than- | ||||
| one-byte options, but such that its offset from the Block1 option it | ||||
| regularly occurs with can still be expressed in an 1-byte offset (27 | ||||
| + (13 + 255) > 292). | ||||
| Echo was picked to be the shortest it can be in an empty message as a | ||||
| NoCacheKey option (11100 in binary does not fit in a nibble, and two | ||||
| lower ones are already taken), and as high as possible to keep room | ||||
| for other options that might typically occur in pairs and might still | ||||
| use optimization around low numbers. | ||||
| ] | ||||
| +--------+-------------+-------------------+ | +========+=============+===========+ | |||
| | Number | Name | Reference | | | Number | Name | Reference | | |||
| +--------+-------------+-------------------+ | +========+=============+===========+ | |||
| | TBD252 | Echo | [[this document]] | | | 252 | Echo | RFC 9175 | | |||
| | | | | | +--------+-------------+-----------+ | |||
| | TBD292 | Request-Tag | [[this document]] | | | 292 | Request-Tag | RFC 9175 | | |||
| +--------+-------------+-------------------+ | +--------+-------------+-----------+ | |||
| Figure 5: CoAP Option Numbers | Table 3: Additions to CoAP | |||
| Option Numbers Registry | ||||
| 8. References | 8. References | |||
| 8.1. Normative References | 8.1. Normative References | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://doi.org/10.17487/RFC2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer | [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer | |||
| Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, | Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, | |||
| January 2012, <https://doi.org/10.17487/RFC6347>. | January 2012, <https://www.rfc-editor.org/info/rfc6347>. | |||
| [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | |||
| Application Protocol (CoAP)", RFC 7252, | Application Protocol (CoAP)", RFC 7252, | |||
| DOI 10.17487/RFC7252, June 2014, | DOI 10.17487/RFC7252, June 2014, | |||
| <https://doi.org/10.17487/RFC7252>. | <https://www.rfc-editor.org/info/rfc7252>. | |||
| [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | |||
| the Constrained Application Protocol (CoAP)", RFC 7959, | the Constrained Application Protocol (CoAP)", RFC 7959, | |||
| DOI 10.17487/RFC7959, August 2016, | DOI 10.17487/RFC7959, August 2016, | |||
| <https://doi.org/10.17487/RFC7959>. | <https://www.rfc-editor.org/info/rfc7959>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://doi.org/10.17487/RFC8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early | |||
| Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September | |||
| 2018, <https://doi.org/10.17487/RFC8470>. | 2018, <https://www.rfc-editor.org/info/rfc8470>. | |||
| [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | |||
| "Object Security for Constrained RESTful Environments | "Object Security for Constrained RESTful Environments | |||
| (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, | (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, | |||
| <https://doi.org/10.17487/RFC8613>. | <https://www.rfc-editor.org/info/rfc8613>. | |||
| 8.2. Informative References | 8.2. Informative References | |||
| [I-D.ietf-core-groupcomm-bis] | [COAP-ATTACKS] | |||
| Preuß Mattsson, J., Fornehed, J., Selander, G., Palombini, | ||||
| F., and C. Amsüss, "Attacks on the Constrained Application | ||||
| Protocol (CoAP)", Work in Progress, Internet-Draft, draft- | ||||
| mattsson-core-coap-attacks-01, 27 July 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-mattsson- | ||||
| core-coap-attacks-01>. | ||||
| [GROUP-COAP] | ||||
| Dijk, E., Wang, C., and M. Tiloca, "Group Communication | Dijk, E., Wang, C., and M. Tiloca, "Group Communication | |||
| for the Constrained Application Protocol (CoAP)", Work in | for the Constrained Application Protocol (CoAP)", Work in | |||
| Progress, Internet-Draft, draft-ietf-core-groupcomm-bis- | Progress, Internet-Draft, draft-ietf-core-groupcomm-bis- | |||
| 04, 12 July 2021, <https://datatracker.ietf.org/doc/html/ | 05, 25 October 2021, | |||
| draft-ietf-core-groupcomm-bis-04>. | <https://datatracker.ietf.org/doc/html/draft-ietf-core- | |||
| groupcomm-bis-05>. | ||||
| [I-D.ietf-core-oscore-groupcomm] | [GROUP-OSCORE] | |||
| Tiloca, M., Selander, G., Palombini, F., Mattsson, J. P., | Tiloca, M., Selander, G., Palombini, F., Preuß Mattsson, | |||
| and J. Park, "Group OSCORE - Secure Group Communication | J., and J. Park, "Group OSCORE - Secure Group | |||
| for CoAP", Work in Progress, Internet-Draft, draft-ietf- | Communication for CoAP", Work in Progress, Internet-Draft, | |||
| core-oscore-groupcomm-12, 12 July 2021, | draft-ietf-core-oscore-groupcomm-13, 25 October 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-core- | <https://datatracker.ietf.org/doc/html/draft-ietf-core- | |||
| oscore-groupcomm-12>. | oscore-groupcomm-13>. | |||
| [I-D.irtf-pearg-numeric-ids-generation] | [NUMERIC-IDS] | |||
| Gont, F. and I. Arce, "On the Generation of Transient | Gont, F. and I. Arce, "On the Generation of Transient | |||
| Numeric Identifiers", Work in Progress, Internet-Draft, | Numeric Identifiers", Work in Progress, Internet-Draft, | |||
| draft-irtf-pearg-numeric-ids-generation-07, 2 February | draft-irtf-pearg-numeric-ids-generation-08, 31 January | |||
| 2021, <https://datatracker.ietf.org/doc/html/draft-irtf- | 2022, <https://datatracker.ietf.org/doc/html/draft-irtf- | |||
| pearg-numeric-ids-generation-07>. | pearg-numeric-ids-generation-08>. | |||
| [I-D.mattsson-core-coap-attacks] | ||||
| Mattsson, J. P., Fornehed, J., Selander, G., Palombini, | ||||
| F., and C. Amsüss, "CoAP Attacks", Work in Progress, | ||||
| Internet-Draft, draft-mattsson-core-coap-attacks-01, 27 | ||||
| July 2021, <https://datatracker.ietf.org/doc/html/draft- | ||||
| mattsson-core-coap-attacks-01>. | ||||
| [REST] Fielding, R., "Architectural Styles and the Design of | [REST] Fielding, R., "Architectural Styles and the Design of | |||
| Network-based Software Architectures", 2000, | Network-based Software Architectures", 2000, | |||
| <https://www.ics.uci.edu/~fielding/pubs/dissertation/ | <https://www.ics.uci.edu/~fielding/pubs/dissertation/ | |||
| fielding_dissertation.pdf>. | fielding_dissertation.pdf>. | |||
| [RFC7641] Hartke, K., "Observing Resources in the Constrained | [RFC7641] Hartke, K., "Observing Resources in the Constrained | |||
| Application Protocol (CoAP)", RFC 7641, | Application Protocol (CoAP)", RFC 7641, | |||
| DOI 10.17487/RFC7641, September 2015, | DOI 10.17487/RFC7641, September 2015, | |||
| <https://doi.org/10.17487/RFC7641>. | <https://www.rfc-editor.org/info/rfc7641>. | |||
| [RFC8323] Bormann, C., Lemay, S., Tschofenig, H., Hartke, K., | [RFC8323] Bormann, C., Lemay, S., Tschofenig, H., Hartke, K., | |||
| Silverajan, B., and B. Raymor, Ed., "CoAP (Constrained | Silverajan, B., and B. Raymor, Ed., "CoAP (Constrained | |||
| Application Protocol) over TCP, TLS, and WebSockets", | Application Protocol) over TCP, TLS, and WebSockets", | |||
| RFC 8323, DOI 10.17487/RFC8323, February 2018, | RFC 8323, DOI 10.17487/RFC8323, February 2018, | |||
| <https://doi.org/10.17487/RFC8323>. | <https://www.rfc-editor.org/info/rfc8323>. | |||
| [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://doi.org/10.17487/RFC8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| [RFC8974] Hartke, K. and M. Richardson, "Extended Tokens and | [RFC8974] Hartke, K. and M. Richardson, "Extended Tokens and | |||
| Stateless Clients in the Constrained Application Protocol | Stateless Clients in the Constrained Application Protocol | |||
| (CoAP)", RFC 8974, DOI 10.17487/RFC8974, January 2021, | (CoAP)", RFC 8974, DOI 10.17487/RFC8974, January 2021, | |||
| <https://doi.org/10.17487/RFC8974>. | <https://www.rfc-editor.org/info/rfc8974>. | |||
| [RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
| DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
| <https://doi.org/10.17487/RFC9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
| Appendix A. Methods for Generating Echo Option Values | Appendix A. Methods for Generating Echo Option Values | |||
| The content and structure of the Echo option value are implementation | The content and structure of the Echo option value are implementation | |||
| specific and determined by the server. Two simple mechanisms for | specific and determined by the server. Two simple mechanisms for | |||
| time-based freshness and one for event-based freshness are outlined | time-based freshness and one for event-based freshness are outlined | |||
| in this section, the first is RECOMMENDED in general, and the second | in this appendix. The "List of Cached Random Values and Timestamps" | |||
| is RECOMMENDED in case the Echo option is encrypted between the | mechanism is RECOMMENDED in general. The "Integrity-Protected | |||
| client and the server. | Timestamp" mechanism is RECOMMENDED in case the Echo option is | |||
| encrypted between the client and the server. | ||||
| Different mechanisms have different tradeoffs between the size of the | Different mechanisms have different trade-offs between the size of | |||
| Echo option value, the amount of server state, the amount of | the Echo option value, the amount of server state, the amount of | |||
| computation, and the security properties offered. A server MAY use | computation, and the security properties offered. A server MAY use | |||
| different methods and security levels for different uses cases | different methods and security levels for different use cases (client | |||
| (client aliveness, request freshness, state synchronization, network | aliveness, request freshness, state synchronization, network address | |||
| address reachability, etc.). | reachability, etc.). | |||
| 1. List of Cached Random Values and Timestamps. The Echo option | 1. List of Cached Random Values and Timestamps. The Echo option | |||
| value is a (pseudo-)random byte string called r. The server caches a | value is a (pseudo)random byte string called r. The server | |||
| list containing the random byte strings and their transmission times. | caches a list containing the random byte strings and their | |||
| Assuming 72-bit random values and 32-bit timestamps, the size of the | initial transmission times. Assuming 72-bit random values and | |||
| Echo option value is 9 bytes and the amount of server state is 13n | 32-bit timestamps, the size of the Echo option value is 9 bytes | |||
| bytes, where n is the number of active Echo Option values. The | and the amount of server state is 13n bytes, where n is the | |||
| security against an attacker guessing echo values is given by s = bit | number of active Echo option values. The security against an | |||
| length of r - log2(n). The length of r and the maximum allowed n | attacker guessing Echo option values is given by s = bit length | |||
| should be set so that the security level is harmonized with other | of r - log2(n). The length of r and the maximum allowed n should | |||
| parts of the deployment, e.g., s >= 64. If the server loses time | be set so that the security level is harmonized with other parts | |||
| continuity, e.g. due to reboot, the entries in the old list MUST be | of the deployment, e.g., s >= 64. If the server loses time | |||
| deleted. | continuity, e.g., due to reboot, the entries in the old list MUST | |||
| be deleted. | ||||
| Echo option value: random value r | Echo option value: random value r | |||
| Server State: random value r, timestamp t0 | ||||
| This method is suitable both for time- and for event-based freshness | Server State: random value r, timestamp t0 | |||
| (e.g. by clearing the cache when an event occurs), and independent of | ||||
| the client authority. | ||||
| 2. Integrity Protected Timestamp. The Echo option value is an | This method is suitable for both time-based and event-based | |||
| integrity protected timestamp. The timestamp can have different | freshness (e.g., by clearing the cache when an event occurs) and | |||
| resolution and range. A 32-bit timestamp can e.g. give a resolution | is independent of the client authority. | |||
| of 1 second with a range of 136 years. The (pseudo-)random secret | ||||
| key is generated by the server and not shared with any other party. | ||||
| The use of truncated HMAC-SHA-256 is RECOMMENDED. With a 32-bit | ||||
| timestamp and a 64-bit MAC, the size of the Echo option value is 12 | ||||
| bytes and the Server state is small and constant. The security | ||||
| against an attacker guessing echo values is given by the MAC length. | ||||
| If the server loses time continuity, e.g. due to reboot, the old key | ||||
| MUST be deleted and replaced by a new random secret key. Note that | ||||
| the privacy considerations in Section 6 may apply to the timestamp. | ||||
| Therefore, it might be important to encrypt it. Depending on the | ||||
| choice of encryption algorithms, this may require an initialization | ||||
| vector to be included in the Echo option value, see below. | ||||
| Echo option value: timestamp t0, MAC(k, t0) | 2. Integrity-Protected Timestamp. The Echo option value is an | |||
| Server State: secret key k | integrity-protected timestamp. The timestamp can have a | |||
| different resolution and range. A 32-bit timestamp can, e.g., | ||||
| give a resolution of 1 second with a range of 136 years. The | ||||
| (pseudo)random secret key is generated by the server and not | ||||
| shared with any other party. The use of truncated HMAC-SHA-256 | ||||
| is RECOMMENDED. With a 32-bit timestamp and a 64-bit MAC, the | ||||
| size of the Echo option value is 12 bytes, and the server state | ||||
| is small and constant. The security against an attacker guessing | ||||
| Echo option values is given by the MAC length. If the server | ||||
| loses time continuity, e.g., due to reboot, the old key MUST be | ||||
| deleted and replaced by a new random secret key. Note that the | ||||
| privacy considerations in Section 6 may apply to the timestamp. | ||||
| Therefore, it might be important to encrypt it. Depending on the | ||||
| choice of encryption algorithms, this may require an | ||||
| initialization vector to be included in the Echo option value | ||||
| (see below). | ||||
| This method is suitable both for time- and for event-based freshness | Echo option value: timestamp t0, MAC(k, t0) | |||
| (by the server remembering the time at which the event took place), | ||||
| and independent of the client authority. | ||||
| If this method is used to additionally obtain network reachability of | Server State: secret key k | |||
| the client, the server MUST use the client's network address too, | ||||
| e.g. as in MAC(k, t0, apparent network address). | This method is suitable for both time-based and event-based | |||
| freshness (by the server remembering the time at which the event | ||||
| took place) and independent of the client authority. | ||||
| If this method is used to additionally obtain network | ||||
| reachability of the client, the server MUST use the client's | ||||
| network address too, e.g., as in MAC(k, t0, claimed network | ||||
| address). | ||||
| 3. Persistent Counter. This can be used in OSCORE for sequence | 3. Persistent Counter. This can be used in OSCORE for sequence | |||
| number recovery per Appendix B.1.2 of [RFC8613]. The Echo option | number recovery, per Appendix B.1.2 of [RFC8613]. The Echo | |||
| value is a simple counter without integrity protection of its own, | option value is a simple counter without integrity protection of | |||
| serialized in uint format. The counter is incremented in a | its own, serialized in uint format. The counter is incremented | |||
| persistent way every time the state that needs to be synchronized is | in a persistent way every time the state that needs to be | |||
| changed (in the B.1.2 case: when a reboot indicates that volatile | synchronized is changed (in the case described in Appendix B.1.2 | |||
| state may have been lost). An example of how such a persistent | of [RFC8613], when a reboot indicates that volatile state may | |||
| counter can be implemented efficiently is the OSCORE server Sender | have been lost). An example of how such a persistent counter can | |||
| Sequence Number mechanism described in Appendix B.1.1 of [RFC8613]. | be implemented efficiently is the OSCORE server Sender Sequence | |||
| Number mechanism described in Appendix B.1.1 of [RFC8613]. | ||||
| Echo option value: counter | Echo option value: counter | |||
| Server State: counter | ||||
| This method is suitable only if the client is the authority over the | Server State: counter | |||
| synchronized property. Consequently, it cannot be used to show | ||||
| client aliveness. It provides statements from the client similar to | This method is suitable only if the client is the authority over | |||
| event based freshness (but without a proof of freshness). | the synchronized property. Consequently, it cannot be used to | |||
| show client aliveness. It provides statements from the client | ||||
| similar to event-based freshness (but without a proof of | ||||
| freshness). | ||||
| Other mechanisms complying with the security and privacy | Other mechanisms complying with the security and privacy | |||
| considerations may be used. The use of encrypted timestamps in the | considerations may be used. The use of encrypted timestamps in the | |||
| Echo option provides additional protection, but typically requires an | Echo option provides additional protection but typically requires an | |||
| initialization vector (a.k.a. nonce) as input to the encryption | initialization vector (a.k.a. nonce) as input to the encryption | |||
| algorithm, which adds a slight complication to the procedure as well | algorithm, which adds a slight complication to the procedure as well | |||
| as overhead. | as overhead. | |||
| Appendix B. Request-Tag Message Size Impact | Appendix B. Request-Tag Message Size Impact | |||
| In absence of concurrent operations, the Request-Tag mechanism for | In absence of concurrent operations, the Request-Tag mechanism for | |||
| body integrity (Section 3.5.1) incurs no overhead if no messages are | body integrity (Section 3.5.1) incurs no overhead if no messages are | |||
| lost (more precisely: in OSCORE, if no operations are aborted due to | lost (more precisely, in OSCORE, if no operations are aborted due to | |||
| repeated transmission failure; in DTLS, if no packets are lost and | repeated transmission failure and, in DTLS, if no packets are lost | |||
| replay protection is active), or when block-wise request operations | and replay protection is active) or when block-wise request | |||
| happen rarely (in OSCORE, if there is always only one request block- | operations happen rarely (in OSCORE, if there is always only one | |||
| wise operation in the replay window). | request block-wise operation in the replay window). | |||
| In those situations, no message has any Request-Tag option set, and | In those situations, no message has any Request-Tag option set, and | |||
| that can be recycled indefinitely. | the Request-Tag value can be recycled indefinitely. | |||
| When the absence of a Request-Tag option cannot be recycled any more | When the absence of a Request-Tag option cannot be recycled any more | |||
| within a security context, the messages with a present but empty | within a security context, the messages with a present but empty | |||
| Request-Tag option can be used (1 Byte overhead), and when that is | Request-Tag option can be used (1 byte overhead), and when that is | |||
| used-up, 256 values from one byte long options (2 Bytes overhead) are | used up, 256 values from 1-byte options (2 bytes overhead) are | |||
| available. | available. | |||
| In situations where those overheads are unacceptable (e.g. because | In situations where that overhead is unacceptable (e.g., because the | |||
| the payloads are known to be at a fragmentation threshold), the | payloads are known to be at a fragmentation threshold), the absent | |||
| absent Request-Tag value can be made usable again: | Request-Tag value can be made usable again: | |||
| * In DTLS, a new session can be established. | * In DTLS, a new session can be established. | |||
| * In OSCORE, the sequence number can be artificially increased so | * In OSCORE, the sequence number can be artificially increased so | |||
| that all lost messages are outside of the replay window by the | that all lost messages are outside of the replay window by the | |||
| time the first request of the new operation gets processed, and | time the first request of the new operation gets processed, and | |||
| all earlier operations can therefore be regarded as concluded. | all earlier operations can therefore be regarded as concluded. | |||
| Appendix C. Change Log | Acknowledgements | |||
| [ The editor is asked to remove this section before publication. ] | ||||
| * Changes since draft-ietf-core-echo-request-tag-13 | ||||
| - Minor editorial fixes. | ||||
| - Wording enhancements: | ||||
| o nonce -> initialization vector | ||||
| o information extracted by the sever -> information conveyed | ||||
| to the server | ||||
| - Acknowledgements updated. | ||||
| - Changelog for -13 added (previous upload just pointed to other | ||||
| resources). | ||||
| - Short title is "Echo, Request-Tag, and Token Processing" now | ||||
| instead of outdated acronym. | ||||
| - Informative reference to RFC 7390 is now to draft-ietf-core- | ||||
| groupcomm-bis | ||||
| * Changes since draft-ietf-core-echo-request-tag-12 (addressing | ||||
| comments from IESG review) | ||||
| See CoRE point-to-point responses at https://github.com/core-wg/ | ||||
| echo-request-tag/blob/master/point-to-point.md | ||||
| (https://github.com/core-wg/echo-request-tag/blob/master/point-to- | ||||
| point.md) and on CoRE mailing list. | ||||
| - Add subsection "Characterization of Echo Applications". | ||||
| o Changes in applications and appendices to use the newly | ||||
| introduced terms. | ||||
| o In particular, some of the legitimization for using short | ||||
| Echo values was drawn from the applications being event | ||||
| based; the concept of the client being the "Authority over | ||||
| [the] Used Information" now legitimizes these more | ||||
| precisely. | ||||
| - Add subsection "Updated Amplification Mitigation Requirements | ||||
| for Servers". It contains the normative text updating RFC 7252 | ||||
| w/rt recommended mitigation methods, which previously happened | ||||
| in passing. | ||||
| - Amplification mitigation: | ||||
| o Increase precision: Reachability check is performed once per | ||||
| endpoint (was: peer). | ||||
| o State that amplification factor applies to the sum of all | ||||
| (previously: "the size of the", implicitly, single) returned | ||||
| packets. | ||||
| o Fix odd wording around how the Echo value would "contain" | ||||
| the claimed address: was meant to contain in a cryptographic | ||||
| sense, now clarified in that a MAC is recommended | ||||
| - Define "preemptive Echo value" that was previously used without | ||||
| definition; another occurrence of the concept was simplified | ||||
| using the term. | ||||
| - Add considerations for the use of DTLS without replay | ||||
| protection. | ||||
| - Privacy considerations: Address concerns raised in various | ||||
| numeric-ids documents. | ||||
| - Explicitly state expected security modes for Echo applications | ||||
| and examples. | ||||
| - Fix of requirements for H-C proxies: They _MUST NOT_ relay | ||||
| unsafe requests. (Previously, it only said that they SHOULD | ||||
| use a particular method, but not clearly that some method is | ||||
| mandated.) | ||||
| - Clarify that state synchonization is an application of the | ||||
| freshness results in combination with some transported | ||||
| application data, and not an immediate result of using Echo | ||||
| alone. | ||||
| - Add text to tie together applications and suggested mechanisms | ||||
| - Restrict C-C proxy allowed behavior: Only safe requests | ||||
| (incorrectly said "idempotent") may be used to proactively | ||||
| populate the proxy's cache. | ||||
| - Justify some "SHOULD"s by outlining justification for different | ||||
| behavior. | ||||
| o Normatively require H-C proxies to process Echo if they're | ||||
| justified to do so, as no alternatives are available. | ||||
| - Reference updates: | ||||
| o QUIC is now RFC9000; precise section given as amplification | ||||
| reference. | ||||
| o Add note for RFC editor that RFC6347 can be upgraded to DTLS | ||||
| 1.3 if C321 overtakes C280 | ||||
| o Follow the core-coap-actuators to core-coap-attacks update | ||||
| o RFC8470 reference is now normative (as using what's defined | ||||
| there has been RECOMMENDED already) | ||||
| - Editorial fixes | ||||
| o Rewording of confusing sentences in amplification mitigation | ||||
| and inner-/outer Echo values | ||||
| o Replace "blacklist" terminology with "deny-list" where left | ||||
| after other changes | ||||
| o Removed sloppy use of Echo as a verb | ||||
| o Minor clarifications | ||||
| o Remove duplicate statements | ||||
| o Typography and spelling fixes | ||||
| - Fixes that are not editorial but minor | ||||
| o Freshness is about time, of which round-trip time | ||||
| (specialization now removed) is only a part. | ||||
| o Reference how HTTP _1.1_ does it when explaining token | ||||
| requirements, as that's an easily and widely understood | ||||
| baseline. | ||||
| * Changes since draft-ietf-core-echo-request-tag-11 (addressing | ||||
| GenART, TSVART, OpsDir comments) | ||||
| - Explain the size permissible for responses before amplification | ||||
| mitigation by referring to the QUIC draft for an OK factor, and | ||||
| giving the remaining numbers that led to it. The actual number | ||||
| is reduced from 152 to 136 because the more conservative case | ||||
| of the attacker not sending a token is considered now. | ||||
| - Added a definition for "freshness" | ||||
| - Give more concrete example values in figures 2 and 3 (based on | ||||
| the appendix suggestions), highlighting the differences between | ||||
| the figures by telling how they are processed in the examples. | ||||
| - Figure with option summary: E/U columns removed (for duplicate | ||||
| headers and generally not contributing) | ||||
| - MAY capitalization changed for consistency. | ||||
| - Editorial changes (IV acronym expanded, s/can not/cannot/g) | ||||
| - Draft ietf-core-stateless has become RFC8974 | ||||
| * Changes since draft-ietf-core-echo-request-tag-10 (Barry's | ||||
| comments) | ||||
| - Align terminology on attacker | ||||
| - A number of clarifications and editorial fixes | ||||
| - Promote DTLS and OSCORE to normative references | ||||
| - Add counter-based version to the Methods for Generating Echo | ||||
| Option Values appendix | ||||
| - Use 64-bit randomness recommendation throughout (but keep it as | ||||
| SHOULD so applications with strict requirements can reduce if | ||||
| if really needed) | ||||
| - Speling and Capitalization | ||||
| * Changes since draft-ietf-core-echo-request-tag-09: | ||||
| - Allow intermediaries to do Echo processing, provided they ask | ||||
| at least as much freshness as they forward | ||||
| - Emphasize that clients can forget Echo to further discourage | ||||
| abuse as cookies | ||||
| - Emphasize that RESTful application design can avoid the need | ||||
| for a Request-Tag | ||||
| - Align with core-oscore-groupcomm-09 | ||||
| - Add interaction with HTTP Early Data / 425 Too Early | ||||
| - Abstract: Explicitly mention both updates to 7252 | ||||
| - Change requested option number of Echo to 252 (previous | ||||
| property calculation was erroneous) | ||||
| * Changes since draft-ietf-core-echo-request-tag-08: | ||||
| - Make amplification attack mitigation by Echo an RFC7252 | ||||
| updating recommendation | ||||
| - Give some more concrete guidance to that use case in terms of | ||||
| sizes and message types | ||||
| - Allow short (1-3 byte) Echo values for deterministic cases, | ||||
| with according security considerations | ||||
| - Point out the tricky parts around Request-Tag for stateless | ||||
| proxies, and make that purely an outlook example with out-of- | ||||
| scope details | ||||
| - Lift ban on Request-Tag options without Block1 (as they can | ||||
| legitimately be generated by an unaware proxy) | ||||
| - Suggest concrete numbers for the options | ||||
| * Changes since draft-ietf-core-echo-request-tag-07 (largely | ||||
| addressing Francesca's review): | ||||
| - Request tag: Explicitly limit "MUST NOT recycle" requirement to | ||||
| particular applications | ||||
| - Token reuse: upper-case RECOMMEND sequence number approach | ||||
| - Structure: Move per-topic introductions to respective chapters | ||||
| (this avoids long jumps by the reader) | ||||
| - Structure: Group Block2 / ETag section inside new fragmentation | ||||
| (formerly Request-Tag) section | ||||
| - More precise references into other documents | ||||
| - "concurrent operations": Emphasise that all here only matters | ||||
| between endpoint pairs | ||||
| - Freshness: Generalize wording away from time-based freshness | ||||
| - Echo: Emphasise that no binding between any particular pair of | ||||
| responses and requests is established | ||||
| - Echo: Add event-based example | ||||
| - Echo: Clarify when protection is needed | ||||
| - Request tag: Enhance wording around "not sufficient condition" | ||||
| - Request tag: Explicitly state when a tag needs to be set | ||||
| - Request tag: Clarification about permissibility of leaving the | ||||
| option absent | ||||
| - Security considerations: wall clock time -> system time (and | ||||
| remove inaccurate explanations) | ||||
| - Token reuse: describe deny-listing in a more implementation- | ||||
| independent way | ||||
| * Changes since draft-ietf-core-echo-request-tag-06: | ||||
| - Removed visible comment that should not be visible in Token | ||||
| reuse considerations. | ||||
| * Changes since draft-ietf-core-echo-request-tag-05: | ||||
| - Add privacy considerations on cookie-style use of Echo values | ||||
| - Add security considerations for token reuse | ||||
| - Add note in security considerations on use of nonvolatile | ||||
| memory when dealing with pseudorandom numbers | ||||
| - Appendix on echo generation: add a few words on up- and | ||||
| downsides of the encrypted timestamp alternative | ||||
| - Clarifications around Outer Echo: | ||||
| o Could be generated by the origin server to prove network | ||||
| reachability (but for most applications it MUST be inner) | ||||
| o Could be generated by intermediaries | ||||
| o Is answered by the client to the endpoint from which it | ||||
| received it (ie. Outer if received as Outer) | ||||
| - Clarification that a server can send Echo preemtively | ||||
| - Refer to stateless to explain what "more information than just | ||||
| the sequence number" could be | ||||
| - Remove explanations around 0.00 empty messags | ||||
| - Rewordings: | ||||
| o the attack: from "forging" to "guessing" | ||||
| o "freshness tokens" to "freshness indicators" (to avoid | ||||
| confusion with the Token) | ||||
| - Editorial fixes: | ||||
| o Abstract and introduction mention what is updated in RFC7252 | ||||
| o Reference updates | ||||
| o Capitalization, spelling, terms from other documents | ||||
| * Changes since draft-ietf-core-echo-request-tag-04: | ||||
| - Editorial fixes | ||||
| o Moved paragraph on collision-free encoding of data in the | ||||
| Token to Security Considerations and rephrased it | ||||
| o "easiest" -> "one easy" | ||||
| * Changes since draft-ietf-core-echo-request-tag-03: | ||||
| - Mention Token processing changes in title | ||||
| - Abstract reworded | ||||
| - Clarify updates to Token processing | ||||
| - Describe security levels from Echo length | ||||
| - Allow non-monotonic clocks under certain conditions for | ||||
| freshness | ||||
| - Simplify freshness expressions | ||||
| - Describe when a Request-Tag can be set | ||||
| - Add note on application-level freshness mechanisms | ||||
| - Minor editorial changes | ||||
| * Changes since draft-ietf-core-echo-request-tag-02: | ||||
| - Define "freshness" | ||||
| - Note limitations of "aliveness" | ||||
| - Clarify proxy and OSCORE handling in presence of "echo" | ||||
| - Clarify when Echo values may be reused | ||||
| - Update security considerations | ||||
| - Various minor clarifications | ||||
| - Minor editorial changes | ||||
| * Major changes since draft-ietf-core-echo-request-tag-01: | ||||
| - Follow-up changes after the "relying on block-wise" change in | ||||
| -01: | ||||
| o Simplify the description of Request-Tag and matchability | ||||
| o Do not update RFC7959 any more | ||||
| - Make Request-Tag repeatable. | ||||
| - Add rationale on not relying purely on sequence numbers. | ||||
| * Major changes since draft-ietf-core-echo-request-tag-00: | ||||
| - Reworded the Echo section. | ||||
| - Added rules for Token processing. | ||||
| - Added security considerations. | ||||
| - Added actual IANA section. | ||||
| - Made Request-Tag optional and safe-to-forward, relying on | ||||
| block-wise to treat it as part of the cache-key | ||||
| - Dropped use case about OSCORE Outer-block-wise (the case went | ||||
| away when its Partial IV was moved into the Object-Security | ||||
| option) | ||||
| * Major changes since draft-amsuess-core-repeat-request-tag-00: | ||||
| - The option used for establishing freshness was renamed from | ||||
| "Repeat" to "Echo" to reduce confusion about repeatable | ||||
| options. | ||||
| - The response code that goes with Echo was changed from 4.03 to | ||||
| 4.01 because the client needs to provide better credentials. | ||||
| - The interaction between the new option and (cross) proxies is | ||||
| now covered. | ||||
| - Two messages being "Request-Tag matchable" was introduced to | ||||
| replace the older concept of having a request tag value with | ||||
| its slightly awkward equivalence definition. | ||||
| Acknowledgments | ||||
| The authors want to thank Carsten Bormann, Roman Danyliw, Benjamin | The authors want to thank Carsten Bormann, Roman Danyliw, Benjamin | |||
| Kaduk, Murray Kucherawy, Francesca Palombini and Jim Schaad for | Kaduk, Murray Kucherawy, Francesca Palombini, and Jim Schaad for | |||
| providing valuable input to the draft. | providing valuable input to the document. | |||
| Authors' Addresses | Authors' Addresses | |||
| Christian Amsüss | Christian Amsüss | |||
| Email: christian@amsuess.com | Email: christian@amsuess.com | |||
| John Preuß Mattsson | John Preuß Mattsson | |||
| Ericsson AB | Ericsson AB | |||
| Email: john.mattsson@ericsson.com | Email: john.mattsson@ericsson.com | |||
| Göran Selander | Göran Selander | |||
| Ericsson AB | Ericsson AB | |||
| Email: goran.selander@ericsson.com | Email: goran.selander@ericsson.com | |||
| End of changes. 220 change blocks. | ||||
| 1060 lines changed or deleted | 639 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||