| rfc9018xml2.original.xml | rfc9018.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | ||||
| <rfc number="9018" version="3" ipr="trust200902" docName="draft-ietf-dnsop-serve | ||||
| r-cookies-05" symRefs="true" submissionType="IETF" tocInclude="true" category="s | ||||
| td" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" updates="7873" cons | ||||
| ensus="true" sortRefs="true"> | ||||
| <front> | ||||
| <title abbrev="server-cookies">Interoperable Domain Name System (DNS) Server Coo | ||||
| kies</title> | ||||
| <seriesInfo value="9018" name="RFC"/> | ||||
| <author initials="O." surname="Sury" fullname="Ondrej | ||||
| Sury"><organization>Internet Systems | ||||
| Consortium</organization><address><postal><street></street> | ||||
| <country>CZ</country> | ||||
| </postal><email>ondrej@isc.org</email> | ||||
| </address></author> | ||||
| <author initials="W." surname="Toorop" fullname="Willem Toorop"><organization>NL | ||||
| net Labs</organization><address><postal><street>Science Park 400</street> | ||||
| <city>Amsterdam</city> | ||||
| <code>1098 XH</code> | ||||
| <country>Netherlands</country> | ||||
| </postal><email>willem@nlnetlabs.nl</email> | ||||
| </address></author> | ||||
| <author initials="D." surname="Eastlake 3rd" fullname="Donald E. Eastlake 3rd">< | ||||
| organization>Futurewei Technologies</organization><address><postal><street>2386 | ||||
| Panoramic Circle</street> | ||||
| <city>Apopka</city> | ||||
| <code>FL 32703</code> | ||||
| <country>United States of America</country> | ||||
| </postal><phone>+1-508-333-2270</phone> | ||||
| <email>d3e3e3@gmail.com</email> | ||||
| </address></author> | ||||
| <author initials="M." surname="Andrews" fullname="Mark Andrews"><organization>In | ||||
| ternet Systems Consortium</organization><address><postal><street>950 Charter Str | ||||
| eet</street> | ||||
| <city>Redwood City</city> | ||||
| <code>CA 94063</code> | ||||
| <country>United States of America</country> | ||||
| </postal><email>marka@isc.org</email> | ||||
| </address></author> | ||||
| <date year="2021" month="April"></date> | ||||
| <area>Internet</area> | ||||
| <workgroup>DNSOP Working Group</workgroup> | ||||
| <keyword>Client</keyword> | ||||
| <keyword>Hash</keyword> | ||||
| <abstract> | ||||
| <t>DNS Cookies, as specified in RFC 7873, are a | ||||
| lightweight DNS transaction security mechanism that provide limited protection | ||||
| to DNS servers and clients against a variety of denial-of-service | ||||
| amplification, forgery, or cache-poisoning attacks by off-path attackers.</t> | ||||
| <t>This document updates RFC 7873 with precise directions for creating Server | ||||
| Cookies so that an anycast server set including diverse implementations will | ||||
| interoperate with standard clients, with suggestions for constructing Client Coo | ||||
| kies | ||||
| in a privacy-preserving fashion, and with suggestions on how to update a Server | ||||
| Secret. An IANA registry listing the methods and associated pseudorandom | ||||
| function suitable for creating DNS Server Cookies has been created with the meth | ||||
| od | ||||
| described in this document as the first and, as of the time of publication, only | ||||
| entry.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <middle> | ||||
| <section anchor="introduction"><name>Introduction</name> | ||||
| <t>DNS Cookies, as specified in <xref target="RFC7873"></xref>, are a | ||||
| lightweight DNS transaction security mechanism that provide limited protection | ||||
| to DNS servers and clients against a variety of denial-of-service | ||||
| amplification, forgery, or cache-poisoning attacks by off-path attackers. This | ||||
| document specifies a means of producing interoperable cookies so that an | ||||
| anycast server set including diverse implementations can be easily configured | ||||
| to interoperate with standard clients. Also, single-implementation or | ||||
| non-anycast services can benefit from a well-studied standardized algorithm | ||||
| for which the behavioral and security characteristics are more widely | ||||
| known.</t> | ||||
| <t>The threats considered for DNS Cookies and the properties of the DNS | ||||
| Security features other than DNS Cookies are discussed in <xref target="RFC7873" | ||||
| ></xref>.</t> | ||||
| <t>In <xref target="RFC7873" sectionFormat="of" section="6"/>, for simplicity, i | ||||
| t is | ||||
| "<bcp14>RECOMMENDED</bcp14> that the same Server Secret be used by | ||||
| each DNS server in a set of anycast servers." However, how precisely a | ||||
| Server Cookie is calculated from this Server Secret is left to the | ||||
| implementation.</t> | ||||
| <t>This guidance has led to a gallimaufry of DNS Cookie implementations, | ||||
| calculating the Server Cookie in different ways. As a result, DNS Cookies | ||||
| are impractical to deploy on multi-vendor anycast networks because even | ||||
| when all DNS Software shares the same secret, as <bcp14>RECOMMENDED</bcp14> in < | ||||
| xref target="RFC7873" sectionFormat="of" section="6"></xref>, the Server Cookie | ||||
| constructed by one implementation | ||||
| cannot generally be validated by another.</t> | ||||
| <t>There is no need for DNS client (resolver) Cookies to be interoperable | ||||
| across different implementations. Each client need only be able to recognize | ||||
| its own cookies. However, this document does contain recommendations for | ||||
| constructing Client Cookies in a client-protecting fashion.</t> | ||||
| <section anchor="terminology-and-definitions"><name>Terminology and Definitions< | ||||
| /name> | ||||
| <t> | ||||
| The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | ||||
| IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | ||||
| NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | ||||
| RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
| be interpreted as | ||||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
| when, and only when, they appear in all capitals, as shown here. | ||||
| </t> | ||||
| <t>Note: "IP address" is used herein as a length-independent term cove | ||||
| ring | ||||
| both IPv4 and IPv6 addresses.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="changes"><name>Changes to RFC 7873</name> | ||||
| <t>Appendices <xref target="RFC7873" sectionFormat="bare" section="A.1"/> and <x | ||||
| ref target="RFC7873" sectionFormat="bare" section="B.1" /> of <xref target="RFC7 | ||||
| 873"></xref> provide | ||||
| example "simple" algorithms for computing Client and Server Cookies, | ||||
| respectively. These algorithms <bcp14>MUST NOT</bcp14> be used as the | ||||
| resulting cookies are too weak when evaluated against modern security | ||||
| standards.</t> | ||||
| <t><xref target="RFC7873" section="B.2"></xref> provides an example "more c | ||||
| omplex" server | ||||
| algorithm. This algorithm is replaced by the interoperable specification in | ||||
| <xref target="serverCookie"></xref> of this document, which <bcp14>MUST</bcp14> | ||||
| be used by Server Cookie | ||||
| implementations.</t> | ||||
| <t>This document has suggestions on Client Cookie construction in <xref target=" | ||||
| clientCookie"></xref>. | ||||
| The previous example in <xref target="RFC7873" section="A.2"/> is <bcp14>NOT REC | ||||
| OMMENDED</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="clientCookie"><name>Constructing a Client Cookie</name> | ||||
| <t>The Client Cookie acts as an identifier for a given client and its IP | ||||
| address and needs to be unguessable. In order to provide minimal | ||||
| authentication of the targeted server, a client <bcp14>MUST</bcp14> use a | ||||
| different Client Cookie for each different Server IP address. This complicates | ||||
| a server's ability to spoof answers for other DNS servers. The Client Cookie | ||||
| <bcp14>SHOULD</bcp14> have 64 bits of entropy.</t> | ||||
| <t>When a server does not support DNS Cookies, the client <bcp14>MUST NOT</bcp14 | ||||
| > send the same | ||||
| Client Cookie to that same server again. Instead, it is recommended that the | ||||
| client does not send a Client Cookie to that server for a certain period | ||||
| (for example, five minutes) before it retries with a new Client Cookie.</t> | ||||
| <t>When a server does support DNS Cookies, the client should store the Client | ||||
| Cookie alongside the Server Cookie it registered for that server.</t> | ||||
| <t>Except for when the Client IP address changes, there is no need to change the | ||||
| Client Cookie often. It is then reasonable to change the Client Cookie only if | ||||
| it has been compromised or after a relatively long implementation-defined | ||||
| period of time. The time period should be no longer than a year, and in any | ||||
| case, Client Cookies are not expected to survive a program restart.</t> | ||||
| <sourcecode type="">Client-Cookie = 64 bits of entropy | ||||
| </sourcecode> | ||||
| <t>Previously, the recommended algorithm to compute the Client Cookie included | ||||
| the Client IP address as an input to a hashing function. However, when implement | ||||
| ing | ||||
| the DNS Cookies, several DNS vendors found it impractical to include the Client | ||||
| IP | ||||
| as the Client Cookie is typically computed before the Client IP address is | ||||
| known. Therefore, the requirement to put the Client IP address as input was | ||||
| removed.</t> | ||||
| <t>However, for privacy reasons, in order to prevent tracking of devices across | ||||
| links and to not circumvent IPv6 Privacy Extensions <xref target="RFC4941"></xre | ||||
| f>, clients <bcp14>MUST | ||||
| NOT</bcp14> reuse a Client or Server Cookie after the Client IP address has chan | ||||
| ged.</t> | ||||
| <t>One way to satisfy this requirement for non-reuse is to register the Client I | ||||
| P | ||||
| address alongside the Server Cookie when it receives the Server Cookie. In | ||||
| subsequent queries to the server with that Server Cookie, the socket <bcp14>MUST | ||||
| </bcp14> be | ||||
| bound to the Client IP address that was also used (and registered) when it | ||||
| received the Server Cookie. Failure to bind <bcp14>MUST</bcp14> then result in | ||||
| a new Client | ||||
| Cookie.</t> | ||||
| </section> | ||||
| <section anchor="serverCookie"><name>Constructing a Server Cookie</name> | ||||
| <t>The Server Cookie is effectively a Message Authentication Code (MAC). The | ||||
| Server Cookie, when it occurs in a COOKIE option in a request, is intended to | ||||
| weakly assure the server that the request came from a client that is both at | ||||
| the source IP address of the request and using the Client Cookie included in | ||||
| the option. | ||||
| This assurance is provided by the Server Cookie that the server (or any other | ||||
| server from the anycast set) sent to that client in an earlier response and | ||||
| that appears as the Server Cookie field in the weakly authenticated request | ||||
| (see <xref sectionFormat="of" section="5.2" target="RFC7873"/>).</t> | ||||
| <t>DNS Cookies do not provide protection against "on-path" | ||||
| adversaries (see <xref sectionFormat="of" section="9" target="RFC7873"/>). An | ||||
| on-path observer that has seen a Server Cookie for a client can abuse that | ||||
| Server Cookie to spoof request for that client within the time span a Server | ||||
| Cookie is valid (see <xref target="timestampField"></xref>).</t> | ||||
| <t> | ||||
| The Server Cookie is calculated from the Client Cookie, a series of | ||||
| Sub-Fields specified below, the Client IP address, and a Server | ||||
| Secret that is known only to the server or only to the set of servers | ||||
| at the same anycast address. | ||||
| </t> | ||||
| <t>For calculation of the Server Cookie, a pseudorandom function is | ||||
| <bcp14>RECOMMENDED</bcp14> with the property that an attacker that does not | ||||
| know the Server Secret, cannot find (any information about) the Server Secret, | ||||
| and cannot create a Server Cookie for any combination of the Client Cookie, | ||||
| the series of Sub-Fields specified below, and the client IP address, for which | ||||
| it has not seen a Server Cookie before. | ||||
| Because DNS servers need to use the pseudorandom function in order to verify | ||||
| Server Cookies, it is <bcp14>RECOMMENDED</bcp14> that it be efficient to | ||||
| calculate. | ||||
| The pseudorandom function described in <xref target="SipHash-2-4"></xref> and | ||||
| introduced in <xref target="hashField"></xref> of this document fits these | ||||
| recommendations.</t> | ||||
| <t>Changing the Server Secret regularly is <bcp14>RECOMMENDED</bcp14> but, | ||||
| when a secure pseudorandom function is used, it need not be changed too | ||||
| frequently. Once a month, for example, would be adequate. See <xref | ||||
| target="rollingSecret"></xref> on operator and implementation guidelines for | ||||
| updating a Server Secret.</t> | ||||
| <t>The 128-bit Server Cookie consists of the following Sub-Fields: a 1-octet Ver | ||||
| sion Sub-Field, | ||||
| a 3-octet Reserved Sub-Field, a 4-octet Timestamp Sub-Field, and an 8-octet Hash | ||||
| Sub-Field.</t> | ||||
| <artwork type="ascii-art"> 0 1 2 | ||||
| 3 | ||||
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Version | Reserved | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Timestamp | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | Hash | | ||||
| | | | ||||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| </artwork> | ||||
| <section anchor="the-version-sub-field"><name>The Version Sub-Field</name> | ||||
| <t>The Version Sub-Field prescribes the structure and Hash calculation formula. | ||||
| This document defines Version 1 to be the structure and way to calculate the | ||||
| Hash Sub-Field as defined in this section.</t> | ||||
| </section> | ||||
| <section anchor="the-reserved-sub-field"><name>The Reserved Sub-Field</name> | ||||
| <t>The value of the Reserved Sub-Field is reserved for future versions of | ||||
| server-side cookie construction. On construction, it <bcp14>MUST</bcp14> be | ||||
| set to zero octets. On Server Cookie verification, the server <bcp14>MUST | ||||
| NOT</bcp14> enforce those fields to be zero, and the Hash should be computed | ||||
| with the received value as described in <xref target="hashField"></xref>.</t> | ||||
| </section> | ||||
| <section anchor="timestampField"><name>The Timestamp Sub-Field</name> | ||||
| <t>The Timestamp value prevents Replay Attacks and <bcp14>MUST</bcp14> be | ||||
| checked by the server to be within a defined period of time. The DNS server | ||||
| <bcp14>SHOULD</bcp14> allow cookies within a 1-hour period in the past and a | ||||
| 5-minute period into the future to allow operation of low-volume clients and | ||||
| some limited time skew between the DNS servers in the anycast set.</t> | ||||
| <t>The Timestamp value specifies a date and time in the form of a 32-bit | ||||
| <strong>unsigned</strong> number of seconds elapsed since 1 January 1970 | ||||
| 00:00:00 UTC, ignoring leap seconds, in network byte order. All comparisons | ||||
| involving these fields <bcp14>MUST</bcp14> use "Serial number | ||||
| arithmetic", as defined in <xref target="RFC1982"></xref>. <xref | ||||
| target="RFC1982"></xref> specifies how the differences should be handled. This | ||||
| handles any relative time window less than 68 years, at any time in the future | ||||
| (2038, 2106, 2256, 22209, or later.)</t> | ||||
| <t>The DNS server <bcp14>SHOULD</bcp14> generate a new Server Cookie at least if | ||||
| the received | ||||
| Server Cookie from the client is more than half an hour old, but it <bcp14>MAY</ | ||||
| bcp14> | ||||
| generate a new cookie more often than that.</t> | ||||
| </section> | ||||
| <section anchor="hashField"><name>The Hash Sub-Field</name> | ||||
| <t>It's important that all the DNS servers use the same algorithm for computing | ||||
| the Server Cookie. This document defines the Version 1 of the server-side | ||||
| algorithm to be:</t> | ||||
| <sourcecode type="">Hash = SipHash-2-4( | ||||
| Client Cookie | Version | Reserved | Timestamp | Client-IP, | ||||
| Server Secret ) | ||||
| </sourcecode> | ||||
| <t>where "|" indicates concatenation.</t> | ||||
| <t>Notice that Client-IP is used for hash generation even though it is not | ||||
| included in the cookie value itself. Client-IP can be either 4 bytes for IPv4 | ||||
| or 16 bytes for IPv6. The length of all the concatenated elements (the input | ||||
| into <xref target="SipHash-2-4"></xref>) <bcp14>MUST</bcp14> be either precisely | ||||
| 20 bytes in case of an IPv4 | ||||
| Client-IP or precisely 32 bytes in case of an IPv6 Client-IP.</t> | ||||
| <t>When a DNS server receives a Server Cookie version 1 for validation, the leng | ||||
| th | ||||
| of the received COOKIE option <bcp14>MUST</bcp14> be precisely 24 bytes: 8 bytes | ||||
| for the | ||||
| Client Cookie plus 16 bytes for the Server Cookie. Verification of the length | ||||
| of the received COOKIE option is <bcp14>REQUIRED</bcp14> to guarantee the length | ||||
| of the input | ||||
| into <xref target="SipHash-2-4"></xref> to be precisely 20 bytes in the case of | ||||
| an IPv4 Client-IP and | ||||
| precisely 32 bytes in the case of an IPv6 Client-IP. This ensures that the input | ||||
| into <xref target="SipHash-2-4"></xref> is an injective function of the elements | ||||
| making up the | ||||
| input, and thereby prevents data substitution attacks. More specifically, this | ||||
| prevents a 36-byte COOKIE option coming from an IPv4 Client-IP to be validated | ||||
| as if it were coming from an IPv6 Client-IP.</t> | ||||
| <t>The Server Secret <bcp14>MUST</bcp14> be configurable to make sure that serve | ||||
| rs in an anycast | ||||
| network return consistent results.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="rollingSecret"><name>Updating the Server Secret</name> | ||||
| <t>Changing the Server Secret regularly is <bcp14>RECOMMENDED</bcp14>. All serv | ||||
| ers in an anycast | ||||
| set must be able to verify the Server Cookies constructed by all other servers | ||||
| in that anycast set at all times. Therefore, it is vital that the Server Secret | ||||
| is shared among all servers before it is used to generate Server Cookies on any | ||||
| server.</t> | ||||
| <t>Also, to maximize maintaining established relationships between clients and | ||||
| servers, an old Server Secret should be valid for verification purposes for a | ||||
| specific period.</t> | ||||
| <t>To facilitate this, deployment of a new Server Secret <bcp14>MUST</bcp14> be | ||||
| done in three | ||||
| stages:</t> | ||||
| <dl newline="true"> | ||||
| <dt>Stage 1</dt> | ||||
| <dd><t> | ||||
| The new Server Secret is deployed on all the servers in an anycast set by | ||||
| the operator.</t> | ||||
| <t>Each server learns the new Server Secret but keeps using the previous Server | ||||
| Secret to generate Server Cookies.</t> | ||||
| <t>Server Cookies constructed with both the new Server Secret and the previous | ||||
| Server Secret are considered valid when verifying.</t> | ||||
| <t>After stage 1 is completed, all the servers in the anycast set have learned t | ||||
| he | ||||
| new Server Secret and can verify Server Cookies constructed with it, but keep | ||||
| generating Server Cookies with the old Server Secret.</t></dd> | ||||
| <dt>Stage 2</dt> | ||||
| <dd><t> | ||||
| This stage is initiated by the operator after the Server Cookie is present | ||||
| on all members in the anycast set.</t> | ||||
| <t>When entering Stage 2, servers start generating Server Cookies with the new | ||||
| Server Secret. The previous Server Secret is not yet removed/forgotten.</t> | ||||
| <t>Server Cookies constructed with both the new Server Secret and the | ||||
| previous Server Secret are considered valid when verifying.</t></dd> | ||||
| <dt>Stage 3</dt> | ||||
| <dd><t> | ||||
| This stage is initiated by the operator when it can be assumed that most | ||||
| clients have obtained a Server Cookie derived from the new Server Secret.</t> | ||||
| <t>With this stage, the previous Server Secret can be removed and <bcp14>MUST NO | ||||
| T</bcp14> be | ||||
| used anymore for verifying.</t> | ||||
| <t>It is <bcp14>RECOMMENDED</bcp14> that the operator wait, after initiating Sta | ||||
| ge 2 | ||||
| and before initiating Stage 3, at least a period of time equal to | ||||
| the longest TTL in the zones served by the server plus 1 hour. | ||||
| </t> | ||||
| <t>The operator <bcp14>SHOULD</bcp14> wait at least longer than the period clien | ||||
| ts are allowed | ||||
| to use the same Server Cookie, which <bcp14>SHOULD</bcp14> be 1 hour (see <xref | ||||
| target="timestampField"></xref>).</t></dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="cookieAlgorithms"><name>Cookie Algorithms</name> | ||||
| <t><xref target="SipHash-2-4"></xref> is a pseudorandom function suitable as a M | ||||
| essage Authentication | ||||
| Code. It is <bcp14>REQUIRED</bcp14> that a compliant DNS server use SipHash-2-4 | ||||
| as a | ||||
| mandatory and default algorithm for DNS Cookies to ensure interoperability | ||||
| between the DNS Implementations.</t> | ||||
| <t>The construction method and pseudorandom function used in calculating and | ||||
| verifying the Server Cookies are determined by the initial version byte and by | ||||
| the length of the Server Cookie. Additional pseudorandom or construction | ||||
| algorithms for Server Cookies might be added in the future.</t> | ||||
| </section> | ||||
| <section anchor="ianaConsiderations"><name>IANA Considerations</name> | ||||
| <t>IANA has created a registry under the "Domain Name System (DNS) Paramete | ||||
| rs" heading as follows:</t> | ||||
| <dl> | ||||
| <dt>Registry Name: | ||||
| </dt> | ||||
| <dd>DNS Server Cookie Methods | ||||
| </dd> | ||||
| <dt>Assignment Policy: | ||||
| </dt> | ||||
| <dd>Expert Review | ||||
| </dd> | ||||
| <dt>Reference: | ||||
| </dt> | ||||
| <dd>[RFC9018], <xref target="RFC7873"/> | ||||
| </dd> | ||||
| <dt>Note: | ||||
| </dt> | ||||
| <dd>A Server Cookie method (construction and pseudorandom algorithm) is | ||||
| determined by the Version in the first byte of the cookie and by the cookie | ||||
| size. Server Cookie size is limited to the inclusive range of 8 to 32 bytes. | ||||
| </dd> | ||||
| </dl> | ||||
| <table> | ||||
| <name>DNS Server Cookie Methods</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="right">Version</th> | ||||
| <th align="right">Size</th> | ||||
| <th align="left">Method</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">8-32</td> | ||||
| <td align="left">Reserved</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">1</td> | ||||
| <td align="right">8-15</td> | ||||
| <td align="left">Unassigned</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">1</td> | ||||
| <td align="right">16</td> | ||||
| <td align="left">SipHash-2-4 [RFC9018] <xref target="serverCookie"></xref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">1</td> | ||||
| <td align="right">17-32</td> | ||||
| <td align="left">Unassigned</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">2-239</td> | ||||
| <td align="right">8-32</td> | ||||
| <td align="left">Unassigned</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">240-254</td> | ||||
| <td align="right">8-32</td> | ||||
| <td align="left">Reserved for Private Use</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">255</td> | ||||
| <td align="right">8-32</td> | ||||
| <td align="left">Reserved</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| <section anchor="securityConsiderations"><name>Security and Privacy Consideratio | ||||
| ns</name> | ||||
| <t>DNS Cookies provide limited protection to DNS servers and clients against a | ||||
| variety of denial-of-service amplification, forgery, or cache-poisoning attacks | ||||
| by off-path attackers. They provide no protection against on-path adversaries | ||||
| that can observe the plaintext DNS traffic. An on-path adversary that can | ||||
| observe a Server Cookie for a client and server interaction can use that | ||||
| Server Cookie for denial-of-service amplification, forgery, or cache-poisoning | ||||
| attacks directed at that client for the lifetime of the Server Cookie.</t> | ||||
| <section anchor="client-cookie-construction"><name>Client Cookie Construction</n | ||||
| ame> | ||||
| <t>In <xref target="RFC7873"></xref>, it was <bcp14>RECOMMENDED</bcp14> to const | ||||
| ruct a Client Cookie by using a | ||||
| pseudorandom function of the Client IP address, the Server IP address, and a | ||||
| secret quantity known only to the client. The Client IP address was included to | ||||
| ensure that a client could not be tracked if its IP address changes due to | ||||
| privacy mechanisms or otherwise.</t> | ||||
| <t>In this document, we changed Client Cookie construction to be just 64 bits of | ||||
| entropy newly created for each new upstream server the client connects to. | ||||
| As a consequence, additional care needs to be taken to prevent tracking of | ||||
| clients. To prevent tracking, a new Client Cookie for a server <bcp14>MUST</bcp | ||||
| 14> be created | ||||
| whenever the Client IP address changes.</t> | ||||
| <t>Unfortunately, tracking Client IP address changes is impractical with servers | ||||
| that do not support DNS Cookies. To prevent tracking of clients with non-DNS | ||||
| Cookie-supporting servers, a client <bcp14>MUST NOT</bcp14> send a previously se | ||||
| nt Client | ||||
| Cookie to a server not known to support DNS Cookies. To prevent the creation of | ||||
| a new Client Cookie for each query to a non-DNS Cookie-supporting server, it | ||||
| is <bcp14>RECOMMENDED</bcp14> to not send a Client Cookie to that server for a c | ||||
| ertain period, | ||||
| for example five minutes.</t> | ||||
| <t>Summarizing:</t> | ||||
| <ul> | ||||
| <li><t>In order to provide minimal authentication, a client <bcp14>MUST</bcp14> | ||||
| use a | ||||
| different Client Cookie for each different Server IP address.</t> | ||||
| </li> | ||||
| <li><t>To prevent tracking of clients, a new Client Cookie <bcp14>MUST</bcp14> b | ||||
| e created | ||||
| when the Client IP address changes.</t> | ||||
| </li> | ||||
| <li><t>To prevent tracking of clients by a non-DNS Cookie-supporting server, | ||||
| a client <bcp14>MUST NOT</bcp14> send a previously sent Client Cookie to a serve | ||||
| r in the | ||||
| absence of an associated Server Cookie.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Note that it is infeasible for a client to detect a change in the public IP | ||||
| address when the client is behind a routing device performing Network Address | ||||
| Translation (NAT). A server may track the public IP address of that routing | ||||
| device performing the NAT. Preventing tracking of the public IP of a | ||||
| NAT-performing routing device is beyond the scope of this document.</t> | ||||
| </section> | ||||
| <section anchor="server-cookie-construction"><name>Server Cookie Construction</n | ||||
| ame> | ||||
| <t><xref target="RFC7873"></xref> did not give a precise recipe for constructing | ||||
| Server Cookies, but | ||||
| it did recommend usage of a pseudorandom function strong enough to prevent | ||||
| the guessing of cookies. In this document, SipHash-2-4 is assigned as the | ||||
| pseudorandom function to be used for version 1 Server Cookies. SipHash-2-4 is | ||||
| considered sufficiently strong for the immediate future, but predictions about | ||||
| future development in cryptography and cryptanalysis are beyond the scope of | ||||
| this document.</t> | ||||
| <t>The precise structure of version 1 Server Cookies is defined in this | ||||
| document. A portion of the structure is made up of unhashed data elements | ||||
| that are exposed in cleartext to an on-path observer. These unhashed data | ||||
| elements are taken along as input to the SipHash-2-4 function of which the | ||||
| result is the other portion of the Server Cookie, so the unhashed portion of | ||||
| the Server Cookie cannot be changed by an on-path attacker without also | ||||
| recalculating the hashed portion for which the Server Secret needs to be | ||||
| known. | ||||
| </t> | ||||
| <t>One of the elements in the unhashed portion of version 1 Server Cookies is | ||||
| a Timestamp used to prevent Replay Attacks. Servers verifying version 1 | ||||
| Server Cookies need to have access to a reliable time value, one that cannot | ||||
| be altered by an attacker, to compare with the Timestamp value. Furthermore, | ||||
| all servers participating in an anycast set that validate version 1 Server | ||||
| Cookies need to have their clocks synchronized.</t> | ||||
| <t> | ||||
| For an on-path adversary observing a Server Cookie (as mentioned in the first | ||||
| paragraph of <xref target="securityConsiderations"/>), the cleartext Timestamp d | ||||
| ata element reveals the | ||||
| lifetime during which the observed Server Cookie can be used to attack the | ||||
| client. | ||||
| </t> | ||||
| <t>In addition to the Security Considerations in this section, the Security | ||||
| Considerations section of <xref target="RFC7873"></xref> still applies.</t> | ||||
| </section> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <references><name>References</name> | ||||
| <references><name>Normative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1982. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3339. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7873. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | ||||
| xml"/> | ||||
| <reference anchor="SipHash-2-4" target="https://doi.org/10.1007/978-3-642-34931- | ||||
| 7_28"> | ||||
| <front> | ||||
| <title>SipHash: A Fast Short-Input PRF</title> | ||||
| <author fullname="Jean-Philippe Aumasson" initials="J." surname="Aumasson">< | ||||
| /author> | ||||
| <author fullname="Daniel J. Bernstein" initials="D. J." surname="Bernstein"> | ||||
| </author> | ||||
| <date year="2012" month="December"/> | ||||
| </front> | ||||
| <refcontent>Progress in Cryptology - INDOCRYPT 2012</refcontent> | ||||
| <refcontent>Lecture Notes in Computer Science, vol. 7668</refcontent> | ||||
| </reference> | ||||
| </references> | ||||
| <references><name>Informative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4941. | ||||
| xml"/> | ||||
| </references> | ||||
| </references> | ||||
| <section anchor="testVectors"><name>Test Vectors</name> | ||||
| <section anchor="learning-a-new-server-cookie"><name>Learning a New Server Cooki | ||||
| e</name> | ||||
| <t>A resolver (client) sending from IPv4 address 198.51.100.100 sends a query fo | ||||
| r | ||||
| <tt>example.com</tt> to an authoritative server listening on 192.0.2.53 from | ||||
| which it has not yet learned the server cookie.</t> | ||||
| <t>The DNS requests and replies shown in this appendix are in a "dig"- | ||||
| like format. | ||||
| The content of the DNS COOKIE Option is shown in hexadecimal format after | ||||
| <tt>; COOKIE:</tt>.</t> | ||||
| <sourcecode type="">;; Sending: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57406 | ||||
| ;; flags:; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: 2464c4abcf10c957 | ||||
| ;; QUESTION SECTION: | ||||
| ;example.com. IN A | ||||
| ;; QUERY SIZE: 52 | ||||
| </sourcecode> | ||||
| <t>The authoritative nameserver (server) is configured with the following secret | ||||
| : | ||||
| e5e973e5a6b2a43f48e7dc849e37bfcf (as hex data).</t> | ||||
| <t>It receives the query on Wed Jun 5 10:53:05 UTC 2019.</t> | ||||
| <t>The content of the DNS COOKIE Option that the server will return is shown | ||||
| below in hexadecimal format after <tt>; COOKIE:</tt>.</t> | ||||
| <t>The Timestamp field <xref target="timestampField"></xref> in the returned Ser | ||||
| ver Cookie has value | ||||
| 1559731985. In the format described in <xref target="RFC3339"></xref>, this is 2 | ||||
| 019-06-05 10:53:05+00:00.</t> | ||||
| <sourcecode type="">;; Got answer: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57406 | ||||
| ;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: 2464c4abcf10c957010000005cf79f111f8130c3eee29480 (good) | ||||
| ;; QUESTION SECTION: | ||||
| ;example.com. IN A | ||||
| ;; ANSWER SECTION: | ||||
| example.com. 86400 IN A 192.0.2.34 | ||||
| ;; Query time: 6 msec | ||||
| ;; SERVER: 192.0.2.53#53(192.0.2.53) | ||||
| ;; WHEN: Wed Jun 5 10:53:05 UTC 2019 | ||||
| ;; MSD SIZE rcvd: 84 | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section anchor="the-same-client-learning-a-renewed-fresh-server-cookie"><name>T | ||||
| he Same Client Learning a Renewed (Fresh) Server Cookie</name> | ||||
| <t>40 minutes later, the same resolver (client) queries the same server for | ||||
| <tt>example.org</tt>. It reuses the Server Cookie it learned in the previous | ||||
| query.</t> | ||||
| <t>The Timestamp field in that previously learned Server Cookie, which is now se | ||||
| nt | ||||
| along in the request, was and is 1559731985. In the format of <xref target="RFC3 | ||||
| 339"></xref>, this is | ||||
| 2019-06-05 10:53:05+00:00.</t> | ||||
| <sourcecode type="">;; Sending: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50939 | ||||
| ;; flags:; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: 2464c4abcf10c957010000005cf79f111f8130c3eee29480 | ||||
| ;; QUESTION SECTION: | ||||
| ;example.org. IN A | ||||
| ;; QUERY SIZE: 52 | ||||
| </sourcecode> | ||||
| <t>The authoritative nameserver (server) now generates a new Server Cookie. | ||||
| The server <bcp14>SHOULD</bcp14> do this because it can see the Server Cookie | ||||
| sent by the client is older than half an hour (<xref | ||||
| target="timestampField"></xref>), but it is also fine for a server to generate | ||||
| a new Server Cookie sooner or even for every answer.</t> | ||||
| <t>The Timestamp field in the returned new Server Cookie has value 1559734385, | ||||
| which, in the format of <xref target="RFC3339"></xref>, is 2019-06-05 11:33:05+0 | ||||
| 0:00.</t> | ||||
| <sourcecode type="">;; Got answer: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50939 | ||||
| ;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: 2464c4abcf10c957010000005cf7a871d4a564a1442aca77 (good) | ||||
| ;; QUESTION SECTION: | ||||
| ;example.org. IN A | ||||
| ;; ANSWER SECTION: | ||||
| example.org. 86400 IN A 192.0.2.34 | ||||
| ;; Query time: 6 msec | ||||
| ;; SERVER: 192.0.2.53#53(192.0.2.53) | ||||
| ;; WHEN: Wed Jun 5 11:33:05 UTC 2019 | ||||
| ;; MSD SIZE rcvd: 84 | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section anchor="another-client-learning-a-renewed-server-cookie"><name>Another | ||||
| Client Learning a Renewed Server Cookie</name> | ||||
| <t>Another resolver (client) with IPv4 address 203.0.113.203 sends a request to | ||||
| the same server with a valid Server Cookie that it learned before | ||||
| (on Wed Jun 5 09:46:25 UTC 2019).</t> | ||||
| <t>The Timestamp field of the Server Cookie in the request has value 1559727985, | ||||
| which, in the format of <xref target="RFC3339"></xref>, is 2019-06-05 09:46:25+0 | ||||
| 0:00.</t> | ||||
| <t>Note that the Server Cookie has Reserved bytes set but is still valid with th | ||||
| e | ||||
| configured secret; the Hash part is calculated taking along the Reserved bytes.< | ||||
| /t> | ||||
| <sourcecode type="">;; Sending: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34736 | ||||
| ;; flags:; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: fc93fc62807ddb8601abcdef5cf78f71a314227b6679ebf5 | ||||
| ;; QUESTION SECTION: | ||||
| ;example.com. IN A | ||||
| ;; QUERY SIZE: 52 | ||||
| </sourcecode> | ||||
| <t>The authoritative nameserver (server) replies with a freshly generated Server | ||||
| Cookie for this client conformant with this specification, i.e., with the Reserv | ||||
| ed | ||||
| bits set to zero.</t> | ||||
| <t>The Timestamp field in the returned new Server Cookie has value 1559734700, | ||||
| which, in the format of <xref target="RFC3339"></xref>, is 2019-06-05 11:38:20+0 | ||||
| 0:00.</t> | ||||
| <sourcecode type="">;; Got answer: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34736 | ||||
| ;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: fc93fc62807ddb86010000005cf7a9acf73a7810aca2381e (good) | ||||
| ;; QUESTION SECTION: | ||||
| ;example.com. IN A | ||||
| ;; ANSWER SECTION: | ||||
| example.com. 86400 IN A 192.0.2.34 | ||||
| ;; Query time: 6 msec | ||||
| ;; SERVER: 192.0.2.53#53(192.0.2.53) | ||||
| ;; WHEN: Wed Jun 5 11:38:20 UTC 2019 | ||||
| ;; MSD SIZE rcvd: 84 | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section anchor="ipv6-query-with-rolled-over-secret"><name>IPv6 Query with Rolle | ||||
| d Over Secret</name> | ||||
| <t>The query below is from a client with IPv6 address 2001:db8:220:1:59de:d0f4:8 | ||||
| 769:82b8 to a server | ||||
| with IPv6 address 2001:db8:8f::53. The client has learned a valid Server Cookie | ||||
| before (on Wed Jun 5 13:36:57 UTC 2019) when the Server had the secret: | ||||
| dd3bdf9344b678b185a6f5cb60fca715. The server now uses a new secret, but it can | ||||
| still validate | ||||
| the Server Cookie provided by the client as the old secret has not expired yet.< | ||||
| /t> | ||||
| <t>The Timestamp field in the Server Cookie in the request has value | ||||
| 1559741817, which, in the format of <xref target="RFC3339"></xref>, is 2019-06-0 | ||||
| 5 13:36:57+00:00.</t> | ||||
| <sourcecode type="">;; Sending: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6774 | ||||
| ;; flags:; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: 22681ab97d52c298010000005cf7c57926556bd0934c72f8 | ||||
| ;; QUESTION SECTION: | ||||
| ;example.net. IN A | ||||
| ;; QUERY SIZE: 52 | ||||
| </sourcecode> | ||||
| <t>The authoritative nameserver (server) replies with a freshly generated server | ||||
| cookie for this client with its new secret: 445536bcd2513298075a5d379663c962.</t | ||||
| > | ||||
| <t>The Timestamp field in the returned new Server Cookie has value 1559741961, | ||||
| which, in the format of <xref target="RFC3339"></xref>, is | ||||
| 2019-06-05 13:39:21+00:00.</t> | ||||
| <sourcecode type="">;; Got answer: | ||||
| ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6774 | ||||
| ;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 | ||||
| ;; OPT PSEUDOSECTION: | ||||
| ; EDNS: version: 0, flags:; udp: 4096 | ||||
| ; COOKIE: 22681ab97d52c298010000005cf7c609a6bb79d16625507a (good) | ||||
| ;; QUESTION SECTION: | ||||
| ;example.net. IN A | ||||
| ;; ANSWER SECTION: | ||||
| example.net. 86400 IN A 192.0.2.34 | ||||
| ;; Query time: 6 msec | ||||
| ;; SERVER: 2001:db8:8f::53#53(2001:db8:8f::53) | ||||
| ;; WHEN: Wed Jun 5 13:36:57 UTC 2019 | ||||
| ;; MSD SIZE rcvd: 84 | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="implementation-status"><name>Implementation Status</name> | ||||
| <t>At the time of writing, BIND from version 9.16 and Knot DNS from version 2.9. | ||||
| 0 | ||||
| create Server Cookies according to the recipe described in this document. Unboun | ||||
| d | ||||
| and NSD have a Proof-of-Concept implementation that has been tested for | ||||
| interoperability during the hackathon at IETF 104 in Prague. Construction | ||||
| of privacy maintaining Client Cookies according to the directions in this docume | ||||
| nt | ||||
| have been implemented in the getdns library and will be in the upcoming | ||||
| getdns-1.6.1 release and in Stubby version 0.3.1.</t> | ||||
| </section> | ||||
| <section anchor="acknowledgements" numbered="false"><name>Acknowledgements</name | ||||
| > | ||||
| <t>Thanks to <contact fullname="Witold Krecicki"/> and <contact | ||||
| fullname="Pieter Lexis"/> for valuable input, suggestions, text, and above | ||||
| all for implementing a prototype of an interoperable DNS Cookie in Bind9, Knot, | ||||
| and PowerDNS during the hackathon at IETF 104 in Prague. Thanks for valuable | ||||
| input and suggestions go to <contact fullname="Ralph Dolmans"/>, <contact | ||||
| fullname="Bob Harold"/>, <contact fullname="Daniel Salzman"/>, <contact | ||||
| fullname="Martin Hoffmann"/>, <contact fullname="Mukund Sivaraman"/>, <contact | ||||
| fullname="Petr Spacek"/>, <contact fullname="Loganaden Velvindron"/>, <contact | ||||
| fullname="Bob Harold"/>, <contact fullname="Philip Homburg"/>, <contact | ||||
| fullname="Tim Wicinski"/>, and <contact fullname="Brian Dickson"/>.</t> | ||||
| </section> | ||||
| </back> | ||||
| </rfc> | ||||
| End of changes. 1 change blocks. | ||||
| lines changed or deleted | 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/ | ||||