diff options
Diffstat (limited to 'doc/rfc/rfc9175.txt')
-rw-r--r-- | doc/rfc/rfc9175.txt | 1483 |
1 files changed, 1483 insertions, 0 deletions
diff --git a/doc/rfc/rfc9175.txt b/doc/rfc/rfc9175.txt new file mode 100644 index 0000000..aa4bcec --- /dev/null +++ b/doc/rfc/rfc9175.txt @@ -0,0 +1,1483 @@ + + + + +Internet Engineering Task Force (IETF) C. Amsüss +Request for Comments: 9175 +Updates: 7252 J. Preuß Mattsson +Category: Standards Track G. Selander +ISSN: 2070-1721 Ericsson AB + February 2022 + + + Constrained Application Protocol (CoAP): Echo, Request-Tag, and Token + Processing + +Abstract + + This document specifies enhancements to the Constrained Application + Protocol (CoAP) that mitigate security issues in particular use + 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 + claimed network address. The Request-Tag option allows the CoAP + server to match block-wise message fragments belonging to the same + request. This document updates RFC 7252 with respect to the + following: processing requirements for client Tokens, forbidding non- + secure reuse of Tokens to ensure response-to-request binding when + CoAP is used with a security protocol, and amplification mitigation + (where the use of the Echo option is now recommended). + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + 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 (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 1.1. Terminology + 2. Request Freshness and the Echo Option + 2.1. Request Freshness + 2.2. The Echo Option + 2.2.1. Echo Option Format + 2.3. Echo Processing + 2.4. Applications of the Echo Option + 2.5. Characterization of Echo Applications + 2.5.1. Time-Based versus Event-Based Freshness + 2.5.2. Authority over Used Information + 2.5.3. Protection by a Security Protocol + 2.6. Updated Amplification Mitigation Requirements for Servers + 3. Protecting Message Bodies Using Request Tags + 3.1. Fragmented Message Body Integrity + 3.2. The Request-Tag Option + 3.2.1. Request-Tag Option Format + 3.3. Request-Tag Processing by Servers + 3.4. Setting the Request-Tag + 3.5. Applications of the Request-Tag Option + 3.5.1. Body Integrity Based on Payload Integrity + 3.5.2. Multiple Concurrent Block-Wise Operations + 3.5.3. Simplified Block-Wise Handling for Constrained Proxies + 3.6. Rationale for the Option Properties + 3.7. Rationale for Introducing the Option + 3.8. Block2 and ETag Processing + 4. Token Processing for Secure Request-Response Binding + 4.1. Request-Response Binding + 4.2. Updated Token Processing Requirements for Clients + 5. Security Considerations + 5.1. Token Reuse + 6. Privacy Considerations + 7. IANA Considerations + 8. References + 8.1. Normative References + 8.2. Informative References + Appendix A. Methods for Generating Echo Option Values + Appendix B. Request-Tag Message Size Impact + Acknowledgements + Authors' Addresses + +1. Introduction + + The initial suite of specifications for the Constrained Application + Protocol (CoAP) ([RFC7252], [RFC7641], and [RFC7959]) was designed + with the assumption that security could be provided on a separate + layer, in particular, by using DTLS [RFC6347]. However, for some use + cases, additional functionality or extra processing is needed to + support secure CoAP operations. This document specifies security + enhancements to CoAP. + + This document specifies two CoAP options, the Echo option and the + Request-Tag option. The Echo option enables a CoAP server to verify + the freshness of a request, which can be used to synchronize state, + or to force a client to demonstrate reachability at its claimed + network address. The Request-Tag option allows the CoAP server to + match message fragments belonging to the same request, fragmented + using the CoAP block-wise transfer mechanism, which mitigates attacks + and enables concurrent block-wise operations. These options in + themselves do not replace the need for a security protocol; they + specify the format and processing of data that, when integrity + protected using, e.g., DTLS [RFC6347], TLS [RFC8446], or Object + Security for Constrained RESTful Environments (OSCORE) [RFC8613], + provide the additional security features. + + This document updates [RFC7252] with a recommendation that servers + use the Echo option to mitigate amplification attacks. + + The document also updates the Token processing requirements for + clients specified in [RFC7252]. The updated processing forbids non- + secure reuse of Tokens to ensure binding of responses to requests + when CoAP is used with security, thus mitigating error cases and + attacks where the client may erroneously associate the wrong response + to a request. + + Each of the following sections provides a more-detailed introduction + to the topic at hand in its first subsection. + +1.1. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + Like [RFC7252], this document relies on the Representational State + Transfer [REST] architecture of the Web. + + Unless otherwise specified, the terms "client" and "server" refer to + "CoAP client" and "CoAP server", respectively, as defined in + [RFC7252]. + + A message's "freshness" is a measure of when a message was sent on a + timescale of the recipient. A server that receives a request can + either verify that the request is fresh or determine that it cannot + be verified that the request is fresh. What is considered a fresh + message is application dependent; exemplary uses are "no more than 42 + seconds ago" or "after this server's last reboot". + + 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 + (REST) "operation". An operation fragmented using [RFC7959] is + called a "block-wise operation". A block-wise operation that is + fragmenting the request body is called a "block-wise request + operation". A block-wise operation that is fragmenting the response + body is called a "block-wise response operation". + + 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 + options, with the exception that elective NoCacheKey options and + options involved in block-wise transfer (Block1, Block2, and Request- + Tag) need not be the same. Two blockwise request operations are said + to be matchable if their request messages are matchable. + + Two matchable block-wise request operations are said to be + "concurrent" if a block of the second request is exchanged even + though the client still intends to exchange further blocks in the + first operation. (Concurrent block-wise request operations from a + single endpoint are impossible with the options of [RFC7959] -- see + the last paragraphs of Sections 2.4 and 2.5 -- because the second + operation's block overwrites any state of the first exchange.) + + The Echo and Request-Tag options are defined in this document. + +2. Request Freshness and the Echo Option + +2.1. Request Freshness + + 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 + if the request was protected with a security protocol, such as DTLS. + This makes CoAP requests vulnerable to certain delay attacks that are + particularly perilous in the case of actuators [COAP-ATTACKS]. Some + attacks can be mitigated by establishing fresh session keys, e.g., + performing a DTLS handshake for each request, but, in general, this + is not a solution suitable for constrained environments, for example, + due to increased message overhead and latency. Additionally, if + there are proxies, fresh DTLS session keys between the server and the + proxy do not say anything about when the client made the request. In + a general hop-by-hop setting, freshness may need to be verified in + each hop. + + A straightforward mitigation of potential delayed requests is that + 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 + point in time. + +2.2. The Echo Option + + This document defines the Echo option, a lightweight challenge- + 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 + exceeded the freshness requirements set by the server. The freshness + requirements are application specific and may vary based on resource, + method, and parameters outside of CoAP, such as policies. The Echo + 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 + requests. + + This mechanism is not only important in the case of actuators, or + other use cases where the CoAP operations require freshness of + requests, but also in general for synchronizing state between a CoAP + client and server, cryptographically verifying the aliveness of the + client or forcing a client to demonstrate reachability at its claimed + network address. The same functionality can be provided by echoing + freshness indicators in CoAP payloads, but this only works for + methods and response codes defined to have a payload. The Echo + option provides a convention to transfer freshness indicators that + works for all methods and response codes. + +2.2.1. Echo Option Format + + The Echo option is elective, safe to forward, not part of the cache- + key, and not repeatable (see Table 1, which extends Table 4 of + [RFC7252]). + + +=====+===+===+===+===+======+========+========+=========+ + | No. | C | U | N | R | Name | Format | Length | Default | + +=====+===+===+===+===+======+========+========+=========+ + | 252 | | | x | | Echo | opaque | 1-40 | (none) | + +-----+---+---+---+---+------+--------+--------+---------+ + + Table 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 + structure are implementation specific. Different methods for + generating Echo option values are outlined in Appendix A. Clients + and intermediaries MUST treat an Echo option value as opaque and make + no assumptions about its content or structure. + + 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 + or some other party that the server trusts and (b) fulfills the + freshness requirements of the application. Depending on the + freshness requirements, the server may verify exactly when the Echo + option value was generated (time-based freshness) or verify that the + Echo option was generated after a specific event (event-based + freshness). As the request is bound to the Echo option value, the + server can determine that the request is not older than the Echo + option value. + + When the Echo option is used with OSCORE [RFC8613], it MAY be an + Inner or Outer option, and the Inner and Outer values are + independent. OSCORE servers MUST only produce Inner Echo options + unless they are merely testing for reachability of the client (the + same as proxies may do). The Inner option is encrypted and integrity + protected between the endpoints, whereas the Outer option is not + protected by OSCORE. As always with OSCORE, Outer options are + visible to (and may be acted on by) all proxies and are visible on + all links where no additional encryption (like TLS between client and + proxy) is used. + +2.3. Echo Processing + + The Echo option MAY be included in any request or response (see + Section 2.4 for different applications). + + The application decides under what conditions a CoAP request to a + resource is required to be fresh. These conditions can, for example, + include what resource is requested, the request method and other data + in the request, and conditions in the environment, such as the state + of the server or the time of the day. + + 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 + freshness of the request in some other way, the server MUST NOT + process the request further and SHOULD send a 4.01 (Unauthorized) + response with an Echo option. The server MAY include the same Echo + option value in several different response messages and to different + clients. Examples of this could be time-based freshness (when + several responses are sent closely after each other) or event-based + freshness (with no event taking place between the responses). + + The server may use request freshness provided by the Echo option to + 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 + demonstrate reachability at its claimed network address. Note that + the Echo option does not bind a request to any particular previous + response but provides an indication that the client had access to the + previous response at the time when it created the request. + + Upon receiving a 4.01 (Unauthorized) response with the Echo option, + the client SHOULD resend the original request with the addition of an + Echo option with the received Echo option value. The client MAY send + a different request compared to the original request. Upon receiving + 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 + include the same Echo option value in several different requests to + the server or discard it at any time (especially to avoid tracking; + see Section 6). + + A client MUST only send Echo option values to endpoints it received + them from (where, as defined in Section 1.2 of [RFC7252], the + security association is part of the endpoint). In OSCORE processing, + that means sending Echo option values from Outer options (or from + non-OSCORE responses) back in Outer options and sending those from + Inner options in Inner options in the same security context. + + 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 + 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 + 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 + not processed further, and an error message MAY be sent. The error + message SHOULD include a new Echo option. + + One way for the server to verify freshness is to bind the Echo option + value to a specific point in time and verify that the request is not + older than a certain threshold T. The server can verify this by + checking that (t1 - t0) < T, where t1 is the request receive time and + t0 is the time when the Echo option value was generated. An example + message flow over DTLS is shown Figure 1. + + Client Server + | | + +------>| Code: 0.03 (PUT) + | PUT | Token: 0x41 + | | Uri-Path: lock + | | Payload: 0 (Unlock) + | | + |<------+ Code: 4.01 (Unauthorized) + | 4.01 | Token: 0x41 + | | Echo: 0x00000009437468756c687521 (t0 = 9, +MAC) + | | + | ... | The round trips take 1 second, time is now t1 = 10. + | | + +------>| Code: 0.03 (PUT) + | PUT | Token: 0x42 + | | Uri-Path: lock + | | Echo: 0x00000009437468756c687521 (t0 = 9, +MAC) + | | Payload: 0 (Unlock) + | | + | | Verify MAC, compare t1 - t0 = 1 < T => permitted. + | | + |<------+ Code: 2.04 (Changed) + | 2.04 | Token: 0x42 + | | + + Figure 1: Example Message Flow for Time-Based Freshness Using the + 'Integrity-Protected Timestamp' Construction of Appendix A + + 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 + 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 each event, a new value is written into the cache. The cache + values MUST be different or chosen in a way so the probability for + collisions is negligible. The server verifies freshness by checking + that e0 equals e1, where e0 is the cached value when the Echo option + value was generated, and e1 is the cached value at the reception of + the request. An example message flow over DTLS is shown in Figure 2. + + Client Server + | | + +------>| Code: 0.03 (PUT) + | PUT | Token: 0x41 + | | Uri-Path: lock + | | Payload: 0 (Unlock) + | | + |<------+ Code: 4.01 (Unauthorized) + | 4.01 | Token: 0x41 + | | Echo: 0x05 (e0 = 5, number of total lock + | | operations performed) + | | + | ... | No alterations happen to the lock state, e1 has the + | | same value e1 = 5. + | | + +------>| Code: 0.03 (PUT) + | PUT | Token: 0x42 + | | Uri-Path: lock + | | Echo: 0x05 + | | Payload: 0 (Unlock) + | | + | | Compare e1 = e0 => permitted. + | | + |<------+ Code: 2.04 (Changed) + | 2.04 | Token: 0x42 + | | Echo: 0x06 (e2 = 6, to allow later locking + | | without more round trips) + | | + + Figure 2: Example Message Flow for Event-Based Freshness Using + the 'Persistent Counter' Construction of Appendix A + + When used to serve freshness requirements (including client aliveness + and state synchronizing), the Echo option value MUST be integrity + protected between the intended endpoints, e.g., using DTLS, TLS, or + an OSCORE Inner option [RFC8613]. When used to demonstrate + reachability at a claimed network address, the Echo option SHOULD be + a Message Authentication Code (MAC) of the claimed address but MAY be + unprotected. Combining different Echo applications can necessitate + different choices; see Appendix A, item 2 for an example. + + An Echo option MAY be sent with a successful response, i.e., even + though the request satisfied any freshness requirements on the + operation. This is called a "preemptive" Echo option value and is + useful when the server anticipates that the client will need to + 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 + 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 + option it recognizes as one generated by itself on follow-up + requests. When it receives an Echo option in a response, it MAY + forward it to the client (and, not recognizing it as its own in + future requests, relay it in the other direction as well) or process + it on its own. If it does so, it MUST ensure that the client's + request was generated (or is regenerated) after the Echo option value + used to send to the server was first seen. (In most cases, this + 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, + 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 + scope for this document. The CoAP client side of HTTP-to-CoAP + proxies MUST respond to Echo challenges itself if the proxy knows + from the recent establishing of the connection that the HTTP request + is fresh. Otherwise, it MUST NOT repeat an unsafe request and SHOULD + respond with a 503 (Service Unavailable) with a Retry-After value of + 0 seconds and terminate any underlying Keep-Alive connection. If the + HTTP request arrived in early data, the proxy SHOULD use a 425 (Too + Early) response instead (see [RFC8470]). The proxy MAY also use + other mechanisms to establish freshness of the HTTP request that are + not specified here. + +2.4. Applications of the Echo Option + + Unless otherwise noted, all these applications require a security + protocol to be used and the Echo option to be protected by it. + + 1. Actuation requests often require freshness guarantees to avoid + accidental or malicious delayed actuator actions. In general, + all unsafe methods (e.g., POST, PUT, and DELETE) may require + freshness guarantees for secure operation. + + * The same Echo option value may be used for multiple actuation + requests to the same server, as long as the total time since + the Echo option value was generated is below the freshness + threshold. + + * For actuator applications with low delay tolerance, to avoid + additional round trips for multiple requests in rapid + sequence, the server may send preemptive Echo option values in + successful requests, irrespectively of whether or not the + request contained an Echo option. The client then uses the + Echo option with the new value in the next actuation request, + and the server compares the receive time accordingly. + + 2. A server may use the Echo option to synchronize properties (such + as state or time) with a requesting client. A server MUST NOT + synchronize a property with a client that is not the authority of + the property being synchronized. For example, if access to a + server resource is dependent on time, then the server MUST NOT + synchronize time with a client requesting access unless the + client is a time authority for the server. + + Note that the state to be synchronized is not carried inside the + Echo option. Any explicit state information needs to be carried + along in the messages the Echo option value is sent in; the Echo + mechanism only provides a partial order on the messages' + processing. + + * If a server reboots during operation, it may need to + synchronize state or time before continuing the interaction. + For example, with OSCORE, it is possible to reuse a partly + persistently stored security context by synchronizing the + Partial IV (sequence number) using the Echo option, as + specified in Section 7.5 of [RFC8613]. + + * A device joining a CoAP group communication [GROUP-COAP] + protected with OSCORE [GROUP-OSCORE] may be required to + initially synchronize its replay window state with a client by + using the Echo option in a unicast response to a multicast + request. The client receiving the response with the Echo + option includes the Echo option value in a subsequent unicast + request to the responding server. + + 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 + sending the request to a resource with a large amplification + factor. The amplification factor is the ratio between the size + of the request and the total size of the response(s) to that + request. A server that provides a large amplification factor to + an unauthenticated peer SHOULD mitigate amplification attacks, as + described in Section 11.3 of [RFC7252]. One way to mitigate such + attacks is for the server to respond to the alleged source + address of the request with an Echo option in a short response + message (e.g., 4.01 (Unauthorized)), thereby requesting the + client to verify its source address. This needs to be done only + once per endpoint and limits the range of potential victims from + the general Internet to endpoints that have been previously in + contact with the server. For this application, the Echo option + can be used in messages that are not integrity protected, for + example, during discovery. (This is formally recommended in + Section 2.6.) + + * In the presence of a proxy, a server will not be able to + distinguish different origin client endpoints, i.e., the + 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 attacks. The proxy SHOULD use the Echo option + to verify origin reachability, as described in Section 2.3. + The proxy MAY forward safe requests immediately to have a + cached result available when the client's repeated request + arrives. + + * Amplification mitigation is a trade-off between giving + leverage to an attacker and causing overhead. An + amplification factor of 3 (i.e., don't send more than three + times the number of bytes received until the peer's address is + confirmed) is considered acceptable for unconstrained + applications in [RFC9000], Section 8. + + When that limit is applied and no further context is + available, a safe default is sending initial responses no + larger than 136 bytes in CoAP serialization. (The number is + assuming Ethernet, IP, and UDP headers of 14, 40, and 8 bytes, + respectively, with 4 bytes added for the CoAP header. Triple + that minus the non-CoAP headers gives the 136 bytes.) Given + the token also takes up space in the request, responding with + 132 bytes after the token is safe as well. + + * When an Echo response is sent to mitigate amplification, it + MUST be sent as a piggybacked or Non-confirmable response, + never as a separate one (which would cause amplification due + to retransmission). + + 4. A server may want to use the request freshness provided by the + Echo option to verify the aliveness of a client. Note that, in a + deployment with hop-by-hop security and proxies, the server can + only verify aliveness of the closest proxy. + +2.5. Characterization of Echo Applications + + Use cases for the Echo option can be characterized by several + criteria that help determine the required properties of the Echo + option value. These criteria apply both to those listed in + Section 2.4 and any novel applications. They provide rationale for + the statements in the former and guidance for the latter. + +2.5.1. Time-Based versus Event-Based Freshness + + The property a client demonstrates by sending an Echo option value is + that the request was sent after a certain point in time or after some + event happened on the server. + + When events are counted, they form something that can be used as a + monotonic but very non-uniform time line. With highly regular events + and low-resolution time, the distinction between time-based and + event-based freshness can be blurred: "no longer than a month ago" is + similar to "since the last full moon". + + In an extreme form of event-based freshness, the server can place an + event whenever an Echo option value is used. This makes the Echo + option value effectively single use. + + Event-based and time-based freshness can be combined in a single Echo + option value, e.g., by encrypting a timestamp with a key that changes + with every event to obtain semantics in the style of "usable once but + only for 5 minutes". + +2.5.2. Authority over Used Information + + Information conveyed to the server in the request Echo option value + has different authority depending on the application. Understanding + who or what is the authoritative source of that information helps the + server implementor decide the necessary protection of the Echo option + value. + + If all that is conveyed to the server is information that the client + is authorized to provide arbitrarily (which is another way of saying + that the server has to trust the client on whatever the Echo option + is being used for), then the server can issue Echo option values that + do not need to be protected on their own. They still need to be + covered by the security protocol that covers the rest of the message, + but the Echo option value can be just short enough to be unique + between this server and client. + + For example, the client's OSCORE Sender Sequence Number (as used in + [RFC8613], Appendix B.1.2) is such information. + + In most other cases, there is information conveyed for which the + 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 + even involve the network (as when performing amplification + mitigation). In these cases, the Echo option value itself needs to + be protected against forgery by the client, e.g., by using a + 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 + also act as the authority (e.g., when using time-based freshness + purely to mitigate request delay attacks); these need careful case- + by-case evaluation. + + To issue Echo option values without integrity protection of its own, + the server needs to trust the client to never produce requests with + attacker-controlled Echo option values. The provisions of + Section 2.3 (saying that an Echo option value may only be sent as + received from the same server) allow that. The requirement stated + 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, + the server can still use time or events to issue new Echo option + values. Then, the request's Echo option value not so much proves the + indicated freshness to the server but reflects the client's intention + to indicate reception of responses containing that value when sending + the later ones. + + Note that a single Echo option value can be used for multiple + purposes (e.g., to both get the sequence number information and + perform amplification mitigation). In this case, the stricter + protection requirements apply. + +2.5.3. Protection by a Security Protocol + + For meaningful results, the Echo option needs to be used in + combination with a security protocol in almost all applications. + + 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 + also be used without a security protocol (in case of OSCORE, as an + Outer option). + + The only known application satisfying this requirement is network + address reachability, where unprotected Echo option values are used + both by servers (e.g., during setup of a security context) and + proxies (which do not necessarily have a security association with + their clients) for amplification mitigation. + +2.6. Updated Amplification Mitigation Requirements for Servers + + This section updates the amplification mitigation requirements for + servers in [RFC7252] to recommend the use of the Echo option to + mitigate amplification attacks. The requirements for clients are not + updated. Section 11.3 of [RFC7252] is updated by adding the + following text: + + | A CoAP server SHOULD mitigate potential amplification attacks by + | responding to unauthenticated clients with 4.01 (Unauthorized) + | including an Echo option, as described in item 3 in Section 2.4 of + | RFC 9175. + +3. Protecting Message Bodies Using Request Tags + +3.1. Fragmented Message Body Integrity + + CoAP was designed to work over unreliable transports, such as UDP, + and includes a lightweight reliability feature to handle messages + that are lost or arrive out of order. In order for a security + protocol to support CoAP operations over unreliable transports, it + must allow out-of-order delivery of messages. + + The block-wise transfer mechanism [RFC7959] extends CoAP by defining + the transfer of a large resource representation (CoAP message body) + as a sequence of blocks (CoAP message payloads). The mechanism uses + a pair of CoAP options, Block1 and Block2, pertaining to the request + and response payload, respectively. The block-wise functionality + does not support the detection of interchanged blocks between + different message bodies to the same resource having the same block + number. This remains true even when CoAP is used together with a + security protocol (such as DTLS or OSCORE) within the replay window + [COAP-ATTACKS], which is a vulnerability of the block-wise + functionality of CoAP [RFC7959]. + + A straightforward mitigation of mixing up blocks from different + messages is to use unique identifiers for different message bodies, + which would provide equivalent protection to the case where the + complete body fits into a single payload. The ETag option [RFC7252], + set by the CoAP server, identifies a response body fragmented using + the Block2 option. + +3.2. The Request-Tag Option + + This document defines the Request-Tag option for identifying request + 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 + keeping apart distinct block-wise request operations on one resource + from one client, addressing the issue described in Section 3.1. It + enables the receiving server to reliably assemble request payloads + (blocks) to their message bodies and, if it chooses to support it, to + reliably process simultaneous block-wise request operations on a + single resource. The requests must be integrity protected if they + should protect against interchange of blocks between different + message bodies. The Request-Tag option is mainly used in requests + that carry the Block1 option and in Block2 requests following these. + + In essence, it is an implementation of the "proxy-safe elective + option" used just to "vary the cache key", as suggested in [RFC7959], + Section 2.4. + +3.2.1. Request-Tag Option Format + + The Request-Tag option is elective, safe to forward, repeatable, and + part of the cache key (see Table 2, which extends Table 4 of + [RFC7252]). + + +=====+===+===+===+===+=============+========+========+=========+ + | No. | C | U | N | R | Name | Format | Length | Default | + +=====+===+===+===+===+=============+========+========+=========+ + | 292 | | | | x | Request-Tag | opaque | 0-8 | (none) | + +-----+---+---+---+---+-------------+--------+--------+---------+ + + Table 2: 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 + 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 + Inner or Outer block operations, respectively. The Inner and Outer + values are therefore independent of each other. The Inner option is + encrypted and integrity protected between the client and server, and + it provides message body identification in case of end-to-end + fragmentation of requests. The Outer option is visible to proxies + and labels message bodies in case of hop-by-hop fragmentation of + requests. + + The Request-Tag option is only used in the request messages of block- + wise operations. + + The Request-Tag mechanism can be applied independently on the server + and client sides of CoAP-to-CoAP proxies, as are the Block options. + 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- + CoAP proxies can use Request-Tag on their CoAP sides; it is not + applicable to HTTP requests. + +3.3. Request-Tag Processing by Servers + + The Request-Tag option does not require any particular processing on + the server side outside of the processing already necessary for any + unknown elective proxy-safe cache-key option. The option varies the + properties that distinguish block-wise operations (which includes all + options except Block1, Block2, and all operations that are elective + NoCacheKey). Thus, the server cannot treat messages with a different + list of Request-Tag options as belonging to the same operation. + + To keep utilizing the cache, a server (including proxies) MAY discard + the Request-Tag option from an assembled block-wise request when + consulting its cache, as the option relates to the operation on 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 + 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 + about ETag in that it is formally part of the cache key, but + implementations that are aware of its meaning can cache more + efficiently (see [RFC7252], Section 5.4.2). + + A server receiving a Request-Tag MUST treat it as opaque and make no + assumptions about its content or structure. + + Two messages carrying the same Request-Tag is a necessary but not + sufficient condition for being part of the same operation. For one, + a server may still treat them as independent messages when it sends + 2.01 (Created) and 2.04 (Changed) responses for every block. Also, a + client that lost interest in an old operation but wants to start over + can overwrite the server's old state with a new initial (num=0) + Block1 request and the same Request-Tag under some circumstances. + 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 + 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 + indicating how long it expects the existing operation to go on, or it + can forget about the state established with the older operation and + respond with 4.08 (Request Entity Incomplete) to later blocks on the + first operation. + +3.4. Setting the Request-Tag + + 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 + be set to the same value (or unset) in all messages belonging to the + same operation; otherwise, they are treated as separate operations by + the server. + + Starting a request operation matchable to a previous operation and + even using the same Request-Tag value is called "request tag + recycling". The absence of a Request-Tag option is viewed as a value + distinct from all values with a single Request-Tag option set; + starting a request operation matchable to a previous operation where + neither has a Request-Tag option therefore constitutes request tag + recycling just as well (also called "recycling the absent option"). + + Clients that use Request-Tag for a particular purpose (like in + Section 3.5) MUST NOT recycle a request tag unless the first + operation has concluded. What constitutes a concluded operation + depends on the purpose and is defined accordingly; see examples in + Section 3.5. + + When Block1 and Block2 are combined in an operation, the Request-Tag + 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 + recognized any more. + + Clients are encouraged to generate compact messages. This means + sending messages without Request-Tag options whenever possible and + using short values when the absent option cannot be recycled. + + Note that Request-Tag options can be present in request messages that + carry no Block options (for example, because a proxy unaware of + Request-Tag reassembled them). + + The Request-Tag option MUST NOT be present in response messages. + +3.5. Applications of the Request-Tag Option + +3.5.1. Body Integrity Based on Payload Integrity + + When a client fragments a request body into multiple message + payloads, even if the individual messages are integrity protected, it + is still possible for an attacker to maliciously replace a later + operation's blocks with an earlier operation's blocks (see + Section 2.5 of [COAP-ATTACKS]). Therefore, the integrity protection + of each block does not extend to the operation's request body. + + In order to gain that protection, use the Request-Tag mechanism as + follows: + + * The individual exchanges MUST be integrity protected end to end + between the client and server. + + * The client MUST NOT recycle a request tag in a new operation + unless the previous operation matchable to the new one has + concluded. + + If any future security mechanisms allow a block-wise transfer to + continue after an endpoint's details (like the IP address) have + changed, then the client MUST consider messages matchable if they + were sent to any endpoint address using the new operation's + security context. + + * The client MUST NOT regard a block-wise request operation as + concluded unless all of the messages the client has sent in the + operation would be regarded as invalid by the server if they were + replayed. + + When security services are provided by OSCORE, these confirmations + typically result either from the client receiving an OSCORE + response message matching the request (an empty Acknowledgement + (ACK) is insufficient) or because the message's sequence number is + old enough to be outside the server's receive window. + + When security services are provided by DTLS, this can only be + confirmed if there was no CoAP retransmission of the request, the + request was responded to, and the server uses replay protection. + + Authors of other documents (e.g., applications of [RFC8613]) are + invited to mandate this subsection's behavior for clients that + execute block-wise interactions over secured transports. In this + way, the server can rely on a conforming client to set the Request- + Tag option when required and thereby have confidence in the integrity + of the assembled body. + + Note that this mechanism is implicitly implemented when the security + layer guarantees ordered delivery (e.g., CoAP over TLS [RFC8323]). + This is because, with each message, any earlier message cannot be + replayed any more, so the client never needs to set the Request-Tag + option unless it wants to perform concurrent operations. + + Body integrity only makes sense in applications that have stateful + block-wise transfers. On applications where all the state is in the + application (e.g., because rather than POSTing a large representation + to a collection in a stateful block-wise transfer, a collection item + is created first, then written to once and available when written + completely), clients need not concern themselves with body integrity + and thus the Request-Tag. + + Body integrity is largely independent from replay protection. When + no replay protection is available (it is optional in DTLS), a full + block-wise operation may be replayed, but, by adhering to the above, + no operations will be mixed up. The only link between body integrity + and replay protection is that, without replay protection, recycling + is not possible. + +3.5.2. Multiple Concurrent Block-Wise Operations + + CoAP clients, especially CoAP proxies, may initiate a block-wise + request operation to a resource, to which a previous one is already + in progress, which the new request should not cancel. A CoAP proxy + would be in such a situation when it forwards operations with the + same cache-key options but possibly different payloads. + + For those cases, Request-Tag is the proxy-safe elective option + suggested in the last paragraph of Section 2.4 of [RFC7959]. + + When initializing a new block-wise operation, a client has to look at + other active operations: + + * 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 + a Request-Tag value (including the absent option) that is not in + use by the other matchable operations for the new operation. + + * Otherwise, it can start the new operation without setting the + Request-Tag option on it. + +3.5.3. Simplified Block-Wise Handling for Constrained Proxies + + The Block options were defined to be unsafe to forward because a + proxy that would forward blocks as plain messages would risk mixing + up clients' requests. + + In some cases, for example, when forwarding block-wise request + operations, appending a Request-Tag value unique to the client can + satisfy the requirements on the proxy that come from the presence of + a Block option. + + This is particularly useful to proxies that strive for stateless + operations, as described in [RFC8974], Section 4. + + The precise classification of cases in which such a Request-Tag + option is sufficient is not trivial, especially when both request and + response body are fragmented, and is out of scope for this document. + +3.6. Rationale for the Option Properties + + The Request-Tag option can be elective, because to servers unaware of + the Request-Tag option, operations with differing request tags will + not be matchable. + + 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 + operations with differing request tags unmatchable but can still + forward them. + + The Request-Tag option is repeatable because this easily allows + 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 + 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 unconditionally. + + In draft versions of this document, the Request-Tag option used to be + critical and unsafe to forward. That design was based on an + erroneous understanding of which blocks could be composed according + to [RFC7959]. + +3.7. Rationale for Introducing the Option + + An alternative that was considered to the Request-Tag option for + coping with the problem of fragmented message body integrity + (Section 3.5.1) was to update [RFC7959] to say that blocks could only + be assembled if their fragments' order corresponded to the sequence + numbers. + + That approach would have been difficult to roll out reliably on DTLS, + where many implementations do not expose sequence numbers, and would + still not prevent attacks like in Section 2.5.2 of [COAP-ATTACKS]. + +3.8. Block2 and ETag Processing + + The same security properties as in Section 3.5.1 can be obtained for + block-wise response operations. The threat model here does not + depend on an attacker; a client can construct a wrong representation + by assembling it from blocks from different resource states. That + can happen when a resource is modified during a transfer or when some + blocks are still valid in the client's cache. + + Rules stating that response body reassembly is conditional on + matching ETag values are already in place from Section 2.4 of + [RFC7959]. + + To gain protection equivalent to that described in Section 3.5.1, a + server MUST use the Block2 option in conjunction with the ETag option + ([RFC7252], Section 5.10.6) and MUST NOT use the same ETag value for + different representations of a resource. + +4. Token Processing for Secure Request-Response Binding + +4.1. Request-Response Binding + + A fundamental requirement of secure REST operations is that the + client can bind a response to a particular request. If this is not + ensured, a client may erroneously associate the wrong response to a + request. The wrong response may be an old response for the same + resource or a response for a completely different resource (e.g., see + Section 2.3 of [COAP-ATTACKS]). For example, a request for the alarm + status "GET /status" may be associated to a prior response "on", + instead of the correct response "off". + + 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 + responses in the same order that the requests were received. The + 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 + responses to a request (e.g., see [RFC7641]). In CoAP, concurrent + requests are differentiated by their Token. Note that the CoAP + Message ID cannot be used for this purpose since those are typically + different for the REST request and corresponding response in case of + "separate response" (see Section 2.2 of [RFC7252]). + + CoAP [RFC7252] does not treat the Token as a cryptographically + important value and does not give stricter guidelines than that the + Tokens currently "in use" SHOULD (not SHALL) be unique. If used with + a security protocol not providing bindings between requests and + responses (e.g., DTLS and TLS), Token reuse may result in situations + where a client matches a response to the wrong request. Note that + mismatches can also happen for other reasons than a malicious + attacker, e.g., delayed delivery or a server sending notifications to + an uninterested client. + + A straightforward mitigation is to mandate clients to not reuse + Tokens until the traffic keys have been replaced. The following + section formalizes that. + +4.2. Updated Token Processing Requirements for Clients + + As described in Section 4.1, the client must be able to verify that a + response corresponds to a particular request. This section updates + the Token processing requirements for clients in [RFC7252] to always + assure a cryptographically secure binding of responses to requests + for secure REST operations like "coaps". The Token processing for + servers is not updated. Token processing in Section 5.3.1 of + [RFC7252] is updated by adding the following text: + + | When CoAP is used with a security protocol not providing bindings + | between requests and responses, the Tokens have cryptographic + | importance. The client MUST make sure that Tokens are not used in + | 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 rekeyed secure connection. This approach SHOULD be followed. + +5. Security Considerations + + The freshness assertion of the Echo option comes from the client + reproducing the same value of the Echo option in a request as it + received in a previous response. If the Echo option value is a large + random number, then there is a high probability that the request is + generated after having seen the response. If the Echo option value + of the response can be guessed, e.g., if based on a small random + number or a counter (see Appendix A), then it is possible to compose + a request with the right Echo option value ahead of time. Using + guessable Echo option values is only permissible in a narrow set of + cases described in Section 2.5.2. Echo option values MUST be set by + the CoAP server such that the risk associated with unintended reuse + can be managed. + + If uniqueness of the Echo option value is based on randomness, then + the availability of a secure pseudorandom number generator and truly + random seeds are essential for the security of the Echo option. If + no true random number generator is available, a truly random seed + must be provided from an external source. As each pseudorandom + number must only be used once, an implementation needs to get a new + truly random seed after reboot or continuously store the state in + nonvolatile memory. See [RFC8613], Appendix B.1.1 for issues and + approaches for writing to nonvolatile memory. + + A single active Echo option value with 64 (pseudo)random bits gives + the same theoretical security level as a 64-bit MAC (as used in, + e.g., AES_128_CCM_8). If a random unique Echo option value is + intended, the Echo option value SHOULD contain 64 (pseudo)random bits + that are not predictable for any other party than the server. A + server MAY use different security levels for different use cases + (client aliveness, request freshness, state synchronization, network + address reachability, etc.). + + The security provided by the Echo and Request-Tag options depends on + the security protocol used. CoAP and HTTP proxies require (D)TLS to + be terminated at the proxies. The proxies are therefore able to + manipulate, inject, delete, or reorder options or packets. The + security claims in such architectures only hold under the assumption + that all intermediaries are fully trusted and have not been + compromised. + + Echo option values without the protection of randomness or a MAC are + 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 + consideration of both the impact of a malicious client and of + implementation errors in clients. These Echo option values are the + only legitimate case for Echo option values shorter than four bytes, + which are not necessarily secret. They MUST NOT be used unless the + Echo option values in the request are integrity protected, as per + Section 2.3. + + Servers SHOULD use a monotonic clock to generate timestamps and + 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 + moved backward. The server will also reject fresh Echo option values + if the clock is moved forward. Non-monotonic clocks MAY be used as + long as they have deviations that are acceptable given the freshness + requirements. If the deviations from a monotonic clock are known, it + may be possible to adjust the threshold accordingly. + + 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 + signals to radio-controlled clocks. + + For the purpose of generating timestamps for the Echo option, a + server MAY set a timer at reboot and use the time since reboot, + choosing the granularity such that different requests arrive at + different times. Servers MAY intermittently reset the timer and MAY + generate a random offset applied to all timestamps. When resetting + the timer, the server MUST reject all Echo option values that were + created before the reset. + + Servers that use the "List of Cached Random Values and Timestamps" + method described in Appendix A may be vulnerable to resource + exhaustion attacks. One way to minimize the state is to use the + "Integrity-Protected Timestamp" method described in Appendix A. + +5.1. Token Reuse + + Reusing Tokens in a way so that responses are guaranteed to not be + associated with the wrong request is not trivial. The server may + process requests in any order and send multiple responses to the same + request. An attacker may block, delay, and reorder messages. The + use of a sequence number is therefore recommended when CoAP is used + with a security protocol that does not provide bindings between + requests and responses, such as DTLS or TLS. + + For a generic response to a Confirmable request over DTLS, binding + can only be claimed without out-of-band knowledge if: + + * the original request was never retransmitted and + + * the response was piggybacked in an Acknowledgement message (as a + Confirmable or Non-confirmable response may have been transmitted + multiple times). + + If observation was used, the same holds for the registration, all + reregistrations, and the cancellation. + + (In addition, for observations, any responses using that Token and a + DTLS sequence number earlier than the cancellation Acknowledgement + message need to be discarded. This is typically not supported in + DTLS implementations.) + + In some setups, Tokens can be reused without the above constraints, + as a different component in the setup provides the associations: + + * In CoAP over TLS, retransmissions are not handled by the CoAP + layer and behave like a replay window size of 1. When a client is + sending TLS-protected requests without Observe to a single server, + the client can reuse a Token as soon as the previous response with + that Token has been received. + + * Requests whose responses are cryptographically bound to the + requests (like in OSCORE) can reuse Tokens indefinitely. + + In all other cases, a sequence number approach is RECOMMENDED, as per + Section 4. + + Tokens that cannot be reused need to be handled appropriately. This + 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 + for reuse. + + 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 + any collisions. This is especially true when the Token contains more + information than just the sequence number, e.g., the serialized + state, as in [RFC8974]. + +6. Privacy Considerations + + Implementations SHOULD NOT put any privacy-sensitive information in + the Echo or Request-Tag option values. Unencrypted timestamps could + reveal information about the server, such as location, time since + reboot, or that the server will accept expired certificates. + Timestamps MAY be used if the Echo option is encrypted between the + client and the server, e.g., in the case of DTLS without proxies or + when using OSCORE with an Inner Echo option. + + Like HTTP cookies, the Echo option could potentially be abused as a + tracking mechanism that identifies a client across requests. This is + especially true for preemptive Echo option values. Servers MUST NOT + use the Echo option to correlate requests for other purposes than + freshness and reachability. Clients only send Echo option values to + the same server from which the values were received. Compared to + HTTP, CoAP clients are often authenticated and non-mobile, and + servers can therefore often correlate requests based on the security + context, the client credentials, or the network address. Especially + when the Echo option increases a server's ability to correlate + requests, clients MAY discard all preemptive Echo option values. + + Publicly visible generated identifiers, even when opaque (as all + defined in this document are), can leak information as described in + [NUMERIC-IDS]. To avoid the effects described there, the absent + Request-Tag option should be recycled as much as possible. (That is + generally possible as long as a security mechanism is in place -- + even in the case of OSCORE outer block-wise transfers, as the OSCORE + option's variation ensures that no matchable requests are created by + different clients.) When an unprotected Echo option is used to + demonstrate reachability, the recommended mechanism of Section 2.3 + keeps the effects to a minimum. + +7. IANA Considerations + + IANA has added the following option numbers to the "CoAP Option + Numbers" registry defined by [RFC7252]: + + +========+=============+===========+ + | Number | Name | Reference | + +========+=============+===========+ + | 252 | Echo | RFC 9175 | + +--------+-------------+-----------+ + | 292 | Request-Tag | RFC 9175 | + +--------+-------------+-----------+ + + Table 3: Additions to CoAP + Option Numbers Registry + +8. References + +8.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC6347] Rescorla, E. and N. Modadugu, "Datagram Transport Layer + Security Version 1.2", RFC 6347, DOI 10.17487/RFC6347, + January 2012, <https://www.rfc-editor.org/info/rfc6347>. + + [RFC7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained + Application Protocol (CoAP)", RFC 7252, + DOI 10.17487/RFC7252, June 2014, + <https://www.rfc-editor.org/info/rfc7252>. + + [RFC7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in + the Constrained Application Protocol (CoAP)", RFC 7959, + DOI 10.17487/RFC7959, August 2016, + <https://www.rfc-editor.org/info/rfc7959>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8470] Thomson, M., Nottingham, M., and W. Tarreau, "Using Early + Data in HTTP", RFC 8470, DOI 10.17487/RFC8470, September + 2018, <https://www.rfc-editor.org/info/rfc8470>. + + [RFC8613] Selander, G., Mattsson, J., Palombini, F., and L. Seitz, + "Object Security for Constrained RESTful Environments + (OSCORE)", RFC 8613, DOI 10.17487/RFC8613, July 2019, + <https://www.rfc-editor.org/info/rfc8613>. + +8.2. Informative References + + [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 + for the Constrained Application Protocol (CoAP)", Work in + Progress, Internet-Draft, draft-ietf-core-groupcomm-bis- + 05, 25 October 2021, + <https://datatracker.ietf.org/doc/html/draft-ietf-core- + groupcomm-bis-05>. + + [GROUP-OSCORE] + Tiloca, M., Selander, G., Palombini, F., Preuß Mattsson, + J., and J. Park, "Group OSCORE - Secure Group + Communication for CoAP", Work in Progress, Internet-Draft, + draft-ietf-core-oscore-groupcomm-13, 25 October 2021, + <https://datatracker.ietf.org/doc/html/draft-ietf-core- + oscore-groupcomm-13>. + + [NUMERIC-IDS] + Gont, F. and I. Arce, "On the Generation of Transient + Numeric Identifiers", Work in Progress, Internet-Draft, + draft-irtf-pearg-numeric-ids-generation-08, 31 January + 2022, <https://datatracker.ietf.org/doc/html/draft-irtf- + pearg-numeric-ids-generation-08>. + + [REST] Fielding, R., "Architectural Styles and the Design of + Network-based Software Architectures", 2000, + <https://www.ics.uci.edu/~fielding/pubs/dissertation/ + fielding_dissertation.pdf>. + + [RFC7641] Hartke, K., "Observing Resources in the Constrained + Application Protocol (CoAP)", RFC 7641, + DOI 10.17487/RFC7641, September 2015, + <https://www.rfc-editor.org/info/rfc7641>. + + [RFC8323] Bormann, C., Lemay, S., Tschofenig, H., Hartke, K., + Silverajan, B., and B. Raymor, Ed., "CoAP (Constrained + Application Protocol) over TCP, TLS, and WebSockets", + RFC 8323, DOI 10.17487/RFC8323, February 2018, + <https://www.rfc-editor.org/info/rfc8323>. + + [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol + Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, + <https://www.rfc-editor.org/info/rfc8446>. + + [RFC8974] Hartke, K. and M. Richardson, "Extended Tokens and + Stateless Clients in the Constrained Application Protocol + (CoAP)", RFC 8974, DOI 10.17487/RFC8974, January 2021, + <https://www.rfc-editor.org/info/rfc8974>. + + [RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based + Multiplexed and Secure Transport", RFC 9000, + DOI 10.17487/RFC9000, May 2021, + <https://www.rfc-editor.org/info/rfc9000>. + +Appendix A. Methods for Generating Echo Option Values + + The content and structure of the Echo option value are implementation + specific and determined by the server. Two simple mechanisms for + time-based freshness and one for event-based freshness are outlined + in this appendix. The "List of Cached Random Values and Timestamps" + mechanism is RECOMMENDED in general. The "Integrity-Protected + Timestamp" mechanism is RECOMMENDED in case the Echo option is + encrypted between the client and the server. + + Different mechanisms have different trade-offs between the size of + the Echo option value, the amount of server state, the amount of + computation, and the security properties offered. A server MAY use + different methods and security levels for different use cases (client + aliveness, request freshness, state synchronization, network address + reachability, etc.). + + 1. List of Cached Random Values and Timestamps. The Echo option + value is a (pseudo)random byte string called r. The server + caches a list containing the random byte strings and their + initial transmission times. Assuming 72-bit random values and + 32-bit timestamps, the size of the Echo option value is 9 bytes + and the amount of server state is 13n bytes, where n is the + number of active Echo option values. The security against an + attacker guessing Echo option values is given by s = bit length + of r - log2(n). The length of r and the maximum allowed n should + be set so that the security level is harmonized with other parts + of the deployment, e.g., s >= 64. If the server loses time + continuity, e.g., due to reboot, the entries in the old list MUST + be deleted. + + Echo option value: random value r + + Server State: random value r, timestamp t0 + + This method is suitable for both time-based and event-based + freshness (e.g., by clearing the cache when an event occurs) and + is independent of the client authority. + + 2. Integrity-Protected Timestamp. The Echo option value is an + 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). + + Echo option value: timestamp t0, MAC(k, t0) + + Server State: secret key k + + 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 + number recovery, per Appendix B.1.2 of [RFC8613]. The Echo + option value is a simple counter without integrity protection of + its own, serialized in uint format. The counter is incremented + in a persistent way every time the state that needs to be + synchronized is changed (in the case described in Appendix B.1.2 + of [RFC8613], when a reboot indicates that volatile state may + have been lost). An example of how such a persistent counter can + be implemented efficiently is the OSCORE server Sender Sequence + Number mechanism described in Appendix B.1.1 of [RFC8613]. + + Echo option value: counter + + Server State: counter + + This method is suitable only if the client is the authority over + 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 + considerations may be used. The use of encrypted timestamps in the + Echo option provides additional protection but typically requires an + initialization vector (a.k.a. nonce) as input to the encryption + algorithm, which adds a slight complication to the procedure as well + as overhead. + +Appendix B. Request-Tag Message Size Impact + + In absence of concurrent operations, the Request-Tag mechanism for + 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 + repeated transmission failure and, in DTLS, if no packets are lost + and replay protection is active) or when block-wise request + operations happen rarely (in OSCORE, if there is always only one + request block-wise operation in the replay window). + + In those situations, no message has any Request-Tag option set, and + the Request-Tag value can be recycled indefinitely. + + When the absence of a Request-Tag option cannot be recycled any more + within a security context, the messages with a present but empty + Request-Tag option can be used (1 byte overhead), and when that is + used up, 256 values from 1-byte options (2 bytes overhead) are + available. + + In situations where that overhead is unacceptable (e.g., because the + payloads are known to be at a fragmentation threshold), the absent + Request-Tag value can be made usable again: + + * In DTLS, a new session can be established. + + * In OSCORE, the sequence number can be artificially increased so + that all lost messages are outside of the replay window by the + time the first request of the new operation gets processed, and + all earlier operations can therefore be regarded as concluded. + +Acknowledgements + + The authors want to thank Carsten Bormann, Roman Danyliw, Benjamin + Kaduk, Murray Kucherawy, Francesca Palombini, and Jim Schaad for + providing valuable input to the document. + +Authors' Addresses + + Christian Amsüss + Email: christian@amsuess.com + + + John Preuß Mattsson + Ericsson AB + Email: john.mattsson@ericsson.com + + + Göran Selander + Ericsson AB + Email: goran.selander@ericsson.com |