rfc9824.original.xml | rfc9824.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="utf-8"?> | |||
<!DOCTYPE rfc> | ||||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<!-- used by XSLT processors --> | ||||
<!-- For a complete list and description of processing instructions (PIs), | ||||
please see http://xml.resource.org/authoring/README.html. --> | ||||
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds | ||||
might want to use. | ||||
(Here they are set differently than their defaults in xml2rfc v1.32) --> | ||||
<?rfc strict="yes" ?> | ||||
<!-- give errors regarding ID-nits and DTD validation --> | ||||
<!-- control the table of contents (ToC) --> | ||||
<?rfc toc="yes"?> | ||||
<!-- generate a ToC --> | ||||
<?rfc tocdepth="4"?> | ||||
<!-- the number of levels of subsections in ToC. default: 3 --> | ||||
<!-- control references --> | ||||
<?rfc symrefs="yes"?> | ||||
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] --> | ||||
<?rfc sortrefs="yes" ?> | ||||
<!-- sort the reference entries alphabetically --> | ||||
<!-- control vertical white space | ||||
(using these PIs as follows is recommended by the RFC Editor) --> | ||||
<?rfc compact="yes" ?> | ||||
<!-- do not start each main section on a new page --> | ||||
<?rfc subcompact="no" ?> | ||||
<!-- keep one blank line between list items --> | ||||
<!-- end of list of popular I-D processing instructions --> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" | <!DOCTYPE rfc [ | |||
category="std" consensus="true" | <!ENTITY nbsp " "> | |||
docName="draft-ietf-dnsop-compact-denial-of-existence-07" | <!ENTITY zwsp "​"> | |||
ipr="trust200902" updates="4034, 4035" obsoletes="" | <!ENTITY nbhy "‑"> | |||
submissionType="IETF" xml:lang="en" | <!ENTITY wj "⁠"> | |||
tocInclude="true" tocDepth="4" | ]> | |||
symRefs="true" sortRefs="true" version="3"> | ||||
<!-- ***** FRONT MATTER ***** --> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" consensus="true" docName="draft-ietf-dnsop-compact-denial-of-existence-07" number="9824" ipr="tru st200902" updates="4034, 4035" obsoletes="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" version="3"> | |||
<front> | <front> | |||
<title abbrev="Compact Denial of Existence in DNSSEC">Compact Denial of Exis | ||||
<title abbrev="Compact Denial of Existence in DNSSEC"> | tence in DNSSEC</title> | |||
Compact Denial of Existence in DNSSEC | <seriesInfo name="RFC" value="9824"/> | |||
</title> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-dnsop-compact-denial-of- | ||||
existence-07"/> | ||||
<author fullname="Shumon Huque" initials="S." surname="Huque"> | <author fullname="Shumon Huque" initials="S." surname="Huque"> | |||
<organization>Salesforce</organization> | <organization>Salesforce</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>415 Mission Street, 3rd Floor</street> | <street>415 Mission Street, 3rd Floor</street> | |||
<city>San Francisco</city> | <city>San Francisco</city> | |||
<region>CA</region> | <region>CA</region> | |||
<code>94105</code> | <code>94105</code> | |||
<country>United States of America</country> | <country>United States of America</country> | |||
skipping to change at line 77 ¶ | skipping to change at line 45 ¶ | |||
<city>San Francisco</city> | <city>San Francisco</city> | |||
<region>CA</region> | <region>CA</region> | |||
<code>94107</code> | <code>94107</code> | |||
<country>United States of America</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<email>elmerot@cloudflare.com</email> | <email>elmerot@cloudflare.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson"> | <author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson"> | |||
<organization>Retired / Unaffiliated</organization> | <organization>Retired/Unaffiliated</organization> | |||
<address> | <address> | |||
<email>ogud@ogud.com</email> | <email>ogud@ogud.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date day="27" month="02" year="2025"/> | <date month="August" year="2025"/> | |||
<!-- Meta-data Declarations --> | ||||
<area>OPS</area> | ||||
<workgroup>dnsop</workgroup> | ||||
<area>General</area> | ||||
<workgroup>Internet Engineering Task Force</workgroup> | ||||
<keyword>Internet-Draft</keyword> | ||||
<keyword>DNS</keyword> | <keyword>DNS</keyword> | |||
<keyword>DNSSEC</keyword> | <keyword>DNSSEC</keyword> | |||
<keyword>Denial of Existence</keyword> | <keyword>Denial of Existence</keyword> | |||
<keyword>Compact Denial of Existence</keyword> | <keyword>Compact Denial of Existence</keyword> | |||
<keyword>Compact Answers</keyword> | <keyword>Compact Answers</keyword> | |||
<keyword>Black Lies</keyword> | <keyword>Black Lies</keyword> | |||
<keyword>NXDOMAIN</keyword> | <keyword>NXDOMAIN</keyword> | |||
<keyword>NODATA</keyword> | <keyword>NODATA</keyword> | |||
<keyword>Empty Non-Terminal</keyword> | <keyword>Empty Non-Terminal</keyword> | |||
skipping to change at line 100 ¶ | skipping to change at line 67 ¶ | |||
<keyword>DNSSEC</keyword> | <keyword>DNSSEC</keyword> | |||
<keyword>Denial of Existence</keyword> | <keyword>Denial of Existence</keyword> | |||
<keyword>Compact Denial of Existence</keyword> | <keyword>Compact Denial of Existence</keyword> | |||
<keyword>Compact Answers</keyword> | <keyword>Compact Answers</keyword> | |||
<keyword>Black Lies</keyword> | <keyword>Black Lies</keyword> | |||
<keyword>NXDOMAIN</keyword> | <keyword>NXDOMAIN</keyword> | |||
<keyword>NODATA</keyword> | <keyword>NODATA</keyword> | |||
<keyword>Empty Non-Terminal</keyword> | <keyword>Empty Non-Terminal</keyword> | |||
<abstract> | <abstract> | |||
<t> | <t> | |||
This document describes a technique to generate a signed DNS response | This document describes a technique to generate a signed DNS response | |||
on demand for a non-existent name by claiming that the name exists | on demand for a nonexistent name by claiming that the name exists | |||
but doesn't have any data for the queried record type. Such answers | but doesn't have any data for the queried record type. Such responses | |||
require only one minimally covering NSEC or NSEC3 record, allow online | require only one minimally covering NSEC or NSEC3 record, allow online | |||
signing servers to minimize signing operations and response sizes, | signing servers to minimize signing operations and response sizes, | |||
and prevent zone content disclosure. | and prevent zone content disclosure. | |||
</t> | </t> | |||
<t> | <t> | |||
This document updates RFC 4034 and 4035. | This document updates RFCs 4034 and 4035. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
<note removeInRFC="true"> | ||||
<name>Discussion Venues</name> | ||||
<t>Source for this draft and an issue tracker can be found at | ||||
<eref target="https://github.com/shuque/id-dnssec-compact-lies"/>.</t> | ||||
</note> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="intro" numbered="true" toc="default"> | <section anchor="intro"> | |||
<name>Introduction and Motivation</name> | <name>Introduction and Motivation</name> | |||
<t> | <t> | |||
One of the functions of the Domain Name System Security Extensions | One of the functions of DNS Security Extensions | |||
(DNSSEC) <xref target="RFC9364" /> is | (DNSSEC) <xref target="RFC9364" /> is | |||
"Authenticated Denial of Existence", | "authenticated denial of existence", | |||
i.e., proving that a DNS name or record type does not exist. | i.e., proving that a DNS name or record type does not exist. | |||
Normally, this is done by means of signed NSEC or NSEC3 records. | Normally, this is done by means of signed NSEC or NSEC3 records. | |||
In the precomputed signature model, these records chain together | In the precomputed signature model, these records chain together | |||
existing names, or cryptographic hashes of them in the zone. In | existing names, or cryptographic hashes of them, in the zone. In | |||
the online signing model, described in NSEC and NSEC3 "White Lies" | the online signing model, described for NSEC in <xref target="RFC4470" / | |||
<xref target="RFC4470" /> <xref target="RFC7129" />, | > and for NSEC3 White Lies in | |||
<xref target="RFC7129" />, | ||||
they are used to dynamically compute an epsilon | they are used to dynamically compute an epsilon | |||
function around the queried name. A "Type Bit Maps" field in the data | function around the QNAME. The Type Bit Maps field in the data | |||
of the NSEC or NSEC3 record asserts which resource record types are | of the NSEC or NSEC3 record asserts which resource record (RR) types are | |||
present at the name. | present at the name. | |||
</t> | </t> | |||
<t> | <t> | |||
The response for a non-existent name requires up to 2 signed NSEC | The response for a nonexistent name requires up to two signed NSEC | |||
records or up to 3 signed NSEC3 records (and for online signers, | records or up to three signed NSEC3 records (and for online signers, | |||
the associated cryptographic computation), to prove that (1) the | the associated cryptographic computation) to prove that (1) the | |||
name did not explicitly exist in the zone, and (2) that it could | name did not explicitly exist in the zone and (2) it could | |||
not have been synthesized by a wildcard. | not have been synthesized by a wildcard. | |||
</t> | </t> | |||
<t> | <t> | |||
This document describes an alternative technique, "Compact Denial | This document describes an alternative technique, "Compact Denial | |||
of Existence" or "Compact Answers", | of Existence" or "Compact Answers", | |||
to generate a signed DNS response on demand for a non-existent | to generate a signed DNS response on demand for a nonexistent | |||
name by claiming that the name exists but has no resource records | name by claiming that the name exists but has no resource record sets | |||
associated with the queried type, i.e., it returns a NODATA response | associated with the queried type, i.e., it returns a NODATA response | |||
rather than an NXDOMAIN response. A NODATA response, which has a | rather than an NXDOMAIN response. A NODATA response, which has a | |||
response code (RCODE) of NOERROR and an empty ANSWER section, | response code (RCODE) of NOERROR and an empty ANSWER section, | |||
requires only one NSEC or NSEC3 record matching the queried name. | requires only one NSEC or NSEC3 record matching the QNAME. | |||
This has two advantages: the DNS response size is smaller, and it | This has two advantages: The DNS response size is smaller, and it | |||
reduces the online cryptographic work involved in generating the | reduces the online cryptographic work involved in generating the | |||
response. | response. | |||
</t> | </t> | |||
<t> | <t> | |||
The use of minimally covering NSEC or NSEC3 records also prevents | The use of minimally covering NSEC or NSEC3 records also prevents | |||
adversaries from enumerating the entire contents of DNS zones | adversaries from enumerating the entire contents of DNS zones | |||
by walking the NSEC chain, or by performing an offline dictionary | by walking the NSEC chain or performing an offline dictionary | |||
attack on the hashes in the NSEC3 chain. | attack on the hashes in the NSEC3 chain. | |||
</t> | </t> | |||
<t> | <t> | |||
This document assumes a reasonable level of familiarity with DNS | This document assumes a reasonable level of familiarity with DNS | |||
operations and protocol terms. Much of the terminology is explained | operations and protocol terms. Much of the terminology is explained | |||
in further detail in "DNS Terminology" <xref target="RFC9499" />. | in further detail in "DNS Terminology" <xref target="RFC9499" />. | |||
</t> | </t> | |||
<section anchor="reserved-words"><name>Requirements Language</name> | <section anchor="reserved-words"><name>Requirements Language</name> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED&qu | <t> | |||
ot;, "SHALL", "SHALL NOT", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NO | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
T RECOMMENDED", "MAY", | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
and "OPTIONAL" in this document are to be interpreted as described | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
and only when, they | be interpreted as | |||
appear in all capitals, as shown here.</t> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="distinguish" numbered="true" toc="default"> | <section anchor="distinguish"> | |||
<name>Distinguishing non-existent names</name> | <name>Distinguishing Nonexistent Names</name> | |||
<t> | <t> | |||
This method generates NODATA responses for non-existent names | This method generates NODATA responses for nonexistent names | |||
that don't match a DNS wildcard. Since there are clearly no | that don't match a DNS wildcard. Since there are clearly no | |||
record types for such names, the NSEC Type Bit Maps field in | record types for such names, the NSEC Type Bit Maps field in | |||
the response will only contain the "NSEC" and "RRSIG" types | the response will only contain the NSEC and RRSIG types | |||
(and in the case of NSEC3 the Type Bit Maps field will be empty). | (and in the case of NSEC3, the Type Bit Maps field will be empty). | |||
Tools that need to accurately identify non-existent names in | Tools that need to accurately identify nonexistent names in | |||
responses cannot rely on this specific type bitmap because Empty | responses cannot rely on this specific type bitmap because Empty | |||
Non-Terminal (ENT) names (which positively exist) also have no | Non-Terminal (ENT) names (which positively exist) also have no | |||
record types at the name and will return exactly the same Type | record types at the name and will return exactly the same Type | |||
Bit Maps field. | Bit Maps field. | |||
</t> | </t> | |||
<t> | <t> | |||
This specification defines the use of a synthetic Resource Record | This specification defines the use of NXNAME (128), a synthetic RR | |||
type to signal the presence of a non-existent name. The | type to signal the presence of a nonexistent name. See <xref target="ian | |||
mnemonic for this RR type is "NXNAME", chosen to clearly | a"/>. The | |||
mnemonic for this RR type is NXNAME, chosen to clearly | ||||
distinguish it from the response code mnemonic NXDOMAIN. | distinguish it from the response code mnemonic NXDOMAIN. | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
Type Value Meaning | ||||
NXNAME 128 NXDOMAIN indicator for Compact Denial of Existence | ||||
]]></artwork> | ||||
<t> | <t> | |||
This RR type is added to the NSEC Type Bit Maps field for responses | This RR type is added to the NSEC Type Bit Maps field for responses | |||
to non-existent names, in addition to the required RRSIG and | to nonexistent names, in addition to the required RRSIG and | |||
NSEC types. If NSEC3 is being used, this RR type is the sole | NSEC types. If NSEC3 is being used, this RR type is the sole | |||
entry in the Type Bit Maps field. It is a "Meta-Type", as defined in | entry in the Type Bit Maps field. It is a "Meta-TYPE", as defined in | |||
<xref target="RFC6895" />, stores no data in a DNS zone, and | <xref target="RFC6895" />, and it stores no data in a DNS zone and | |||
cannot be usefully queried. <xref target="response-nxname"/> | cannot be usefully queried. <xref target="response-nxname"/> | |||
describes what a DNS resolver or authoritative server should | describes what a DNS resolver or authoritative server should | |||
do if it receives an explicit query for NXNAME. | do if it receives an explicit query for NXNAME. | |||
</t> | </t> | |||
<t> | <t> | |||
No special handling of this RR type is required on the part of | No special handling of this RR type is required on the part of | |||
DNS resolvers. However, resolvers may optionally implement the | DNS resolvers. However, resolvers may optionally implement the | |||
behavior described in <xref target="signaled-rcode"/> | behavior described in <xref target="signaled-rcode"/> ("Signaled Respons | |||
(Response Code Restoration) to better restore NXDOMAIN visibility | e Code Restoration") | |||
to better restore NXDOMAIN visibility | ||||
to various applications that may remain oblivious to the new | to various applications that may remain oblivious to the new | |||
NXNAME signal. | NXNAME signal. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="responses" numbered="true" toc="default"> | <section anchor="responses"> | |||
<name>Generating Responses with NSEC</name> | <name>Generating Responses with NSEC</name> | |||
<t> | <t> | |||
This section describes various types of answers generated by | This section describes various types of answers generated by | |||
authoritative servers implementing Compact Denial of Existence | authoritative servers implementing Compact Denial of Existence | |||
using NSEC. <xref target="nsec3" /> describes changes needed to | using NSEC. <xref target="nsec3" /> describes changes needed to | |||
support NSEC3. | support NSEC3. | |||
</t> | </t> | |||
<section anchor="response-nxd" numbered="true" toc="default"> | <section anchor="response-nxd"> | |||
<name>Responses for Non-Existent Names</name> | <name>Responses for Nonexistent Names</name> | |||
<t> | <t> | |||
When the authoritative server receives a query for a non-existent | When the authoritative server receives a query for a nonexistent | |||
name in a zone that it serves, a NODATA response (response code | name in a zone that it serves, a NODATA response (response code | |||
NOERROR, empty Answer section) is generated with a dynamically | NOERROR, empty Answer section) is generated with a dynamically | |||
constructed NSEC record with the owner name matching the queried | constructed NSEC record with the owner name matching the | |||
name (QNAME) placed in the Authority section. | QNAME placed in the Authority section. | |||
</t> | </t> | |||
<t> | <t> | |||
The Next Domain Name field SHOULD be set to the immediate | The Next Domain Name field <bcp14>SHOULD</bcp14> be set to the immediate | |||
lexicographic successor of the QNAME. This is accomplished by | lexicographic successor of the QNAME. This is accomplished by | |||
adding a leading label with a single null (zero-value) octet. | adding a leading label with a single null (zero-value) octet. | |||
The Type Bit Maps field MUST only have the bits set for the | The Type Bit Maps field <bcp14>MUST</bcp14> only have the bits set for t he | |||
following RR Types: RRSIG, NSEC, and NXNAME. | following RR Types: RRSIG, NSEC, and NXNAME. | |||
</t> | </t> | |||
<t> | <t> | |||
For example, a request for the non-existing name "a.example.com." | For example, a request for the nonexistent name "a.example.com." | |||
would result in the following NSEC record to be generated (in DNS | would result in the generation of the following NSEC record (in DNS | |||
presentation format): | presentation format): | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type=""><![CDATA[ | |||
a.example.com. 3600 IN NSEC \000.a.example.com. RRSIG NSEC NXNAME | a.example.com. 3600 IN NSEC \000.a.example.com. RRSIG NSEC NXNAME | |||
]]></artwork> | ]]></sourcecode> | |||
<t> | <t> | |||
The NSEC record MUST have corresponding RRSIGs generated. | The NSEC record <bcp14>MUST</bcp14> have corresponding RRSIGs generated. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="response-nodata" numbered="true" toc="default"> | <section anchor="response-nodata"> | |||
<name>Responses for Non-Existent Types</name> | <name>Responses for Nonexistent Types</name> | |||
<t> | <t> | |||
When the authoritative server receives a query for a name | When the authoritative server receives a query for a name | |||
that exists, but has no resource record sets associated with | that exists but has no resource record sets associated with | |||
the queried type, it generates a NODATA response, with | the queried type, it generates a NODATA response with | |||
a dynamically constructed signed NSEC record in the Authority | a dynamically constructed signed NSEC record in the Authority | |||
Section. The owner name of the NSEC record matches the queried | section. The owner name of the NSEC record matches the QNAME. | |||
name. The Next Domain Name field is set to the immediate lexicographic | The Next Domain Name field is set to the immediate lexicographic | |||
successor of the QNAME. The Type Bit Maps field lists the available | successor of the QNAME. The Type Bit Maps field lists the available | |||
Resource Record types at the name. | RR types at the name. | |||
</t> | </t> | |||
<t> | <t> | |||
An Empty Non-Terminal is a special subset of this category, | An ENT is a special subset of this category, | |||
where the name has no resource record sets of any type (but | where the name has no resource record sets of any type (but | |||
has descendant names that do). For a query for an Empty | has descendant names that do). For a query for an ENT, | |||
Non-Terminal, the NSEC Type Bit Maps field will only contain RRSIG | the NSEC Type Bit Maps field will only contain RRSIG | |||
and NSEC. (Note that this is substantially different than the | and NSEC. (Note that this is substantially different than the | |||
ENT response in precomputed NSEC, where the NSEC record has the | ENT response in precomputed NSEC, where the NSEC record has the | |||
same type bitmap, but "covers" rather than matches the ENT, and | same type bitmap but "covers" rather than matches the ENT and | |||
has the Next Domain Name field set to the next lexicographic | has the Next Domain Name field set to the next lexicographic | |||
descendent of the ENT in the zone.) | descendant of the ENT in the zone.) | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="response-wildcard" numbered="true" toc="default"> | <section anchor="response-wildcard"> | |||
<name>Responses for Wildcard Matches</name> | <name>Responses for Wildcard Matches</name> | |||
<t> | <t> | |||
For wildcard matches, the authoritative server will provide | For wildcard matches, the authoritative server will provide | |||
a dynamically signed response that claims that the queried | a dynamically signed response that claims that the QNAME | |||
name exists explicitly. Specifically, the answer RR set will | exists explicitly. Specifically, the answer RRset will | |||
have an RRSIG record demonstrating an exact match (i.e., the | have an RRSIG record demonstrating an exact match (i.e., the | |||
label count in the RRSIG RDATA will be equal to the number of | label count in the RRSIG RDATA will be equal to the number of | |||
labels in the query name minus the root label). This obviates | labels in the query name minus the root label). This obviates | |||
the need to include an NSEC record in the Authority section | the need to include an NSEC record in the Authority section | |||
of the response that shows that no closer match than the wildcard | of the response that shows that no closer match than the wildcard | |||
was possible. | was possible. | |||
</t> | </t> | |||
<t> | <t> | |||
For a Wildcard NODATA match (where the queried name matches | For a wildcard NODATA match (where the QNAME matches | |||
a wildcard but no data for the queried type exists), a response | a wildcard but no data for the queried type exists), a response | |||
akin to a non-wildcard NODATA is returned. The Answer section | akin to a non-wildcard NODATA is returned. The Answer section | |||
is empty, and the Authority section contains a single NSEC | is empty, and the Authority section contains a single NSEC | |||
record that matches the query name with a Type Bit Maps field | record that matches the query name with a Type Bit Maps field | |||
representing the list of types available at the wildcard. | representing the list of types available at the wildcard. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="response-referral" numbered="true" toc="default"> | <section anchor="response-referral"> | |||
<name>Responses for Unsigned Referrals</name> | <name>Responses for Unsigned Referrals</name> | |||
<t> | <t> | |||
Per the DNSSEC protocol, a referral to an unsigned subzone | Per the DNSSEC protocol, a referral to an unsigned subzone | |||
includes an NSEC record whose Owner Name matches the subzone, | includes an NSEC record whose owner name matches the subzone | |||
and which proves the delegation is unsigned by the absence of | and proves the delegation is unsigned by the absence of | |||
the DS RRtype bit in the Type Bit Maps field. | the Delegation Signer (DS) RR type bit in the Type Bit Maps field. | |||
</t> | </t> | |||
<t> | <t> | |||
With Compact Denial of Existence, the Next Domain Name field | With Compact Denial of Existence, the Next Domain Name field | |||
for this NSEC record is computed with a slightly different | for this NSEC record is computed with a slightly different | |||
epsilon function than the immediate lexicographic successor of | epsilon function than the immediate lexicographic successor of | |||
the Owner Name, as that name would then fall under the delegated | the owner name, as that name would then fall under the delegated | |||
subzone. Instead, the Next Domain Name field is formed by appending | subzone. Instead, the Next Domain Name field is formed by appending | |||
a zero octet to the first label of the Owner Name. | a zero octet to the first label of the owner name. | |||
</t> | </t> | |||
<t> | <t> | |||
For example, a referral response for the subzone sub.example.com | For example, a referral response for the subzone sub.example.com | |||
would include an NSEC record like the following: | would include an NSEC record like the following: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type=""><![CDATA[ | |||
sub.example.com. 3600 IN NSEC sub\000.example.com. NS RRSIG NSEC | sub.example.com. 3600 IN NSEC sub\000.example.com. NS RRSIG NSEC | |||
]]></artwork> | ]]></sourcecode> | |||
</section> | </section> | |||
<section anchor="response-nxname" numbered="true" toc="default"> | <section anchor="response-nxname"> | |||
<name>Responses to explicit queries for NXNAME</name> | <name>Responses to Explicit Queries for NXNAME</name> | |||
<t> | <t> | |||
NXNAME is a meta type which should not appear anywhere in | NXNAME is a Meta-TYPE that should not appear anywhere in | |||
a DNS message apart from the NSEC type bitmap of a Compact | a DNS message apart from the NSEC type bitmap of a Compact | |||
Answer response for a non-existent name. If however a DNS | Answer response for a nonexistent name. However, if a DNS | |||
server implementing this specification receives an explicit | server implementing this specification receives an explicit | |||
query for the NXNAME RR type, this section describes what the | query for the NXNAME RR type, this section describes what the | |||
response should be. | response should be. | |||
</t> | </t> | |||
<t> | <t> | |||
If an explicit query for the NXNAME RR type is received, the | If an explicit query for the NXNAME RR type is received, the | |||
DNS server MUST return a Format Error (response code FORMERR). | DNS server <bcp14>MUST</bcp14> return a Format Error (response code FORM ERR). | |||
A resolver should not forward these queries upstream or attempt | A resolver should not forward these queries upstream or attempt | |||
iterative resolution. Many DNS server implementations already | iterative resolution. Many DNS server implementations already | |||
return errors for all types in the meta and q-type range except | return errors for all types in the range for Meta-TYPEs and QTYPEs, exce pt | |||
those types that are already defined to support queries. | those types that are already defined to support queries. | |||
</t> | </t> | |||
<t> | <t> | |||
Optionally, a DNS server MAY also include the following | Optionally, a DNS server <bcp14>MAY</bcp14> also include the following | |||
<xref target="RFC8914" /> Extended DNS Error (EDE) Code in the | Extended DNS Error (EDE) code <xref target="RFC8914" /> in the | |||
response: | response: 30 (Invalid Query Type). See <xref target="iana" />. | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
INFO-CODE Purpose | ||||
30 Invalid Query Type | ||||
]]></artwork> | ||||
<t> | <t> | |||
Note that this EDE code is generally applicable to any | Note that this EDE code is generally applicable to any | |||
RR type that should not appear in DNS queries. | RR type that should not appear in DNS queries. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="nsec3" numbered="true" toc="default"> | <section anchor="nsec3"> | |||
<name>Generating Responses with NSEC3</name> | <name>Generating Responses with NSEC3</name> | |||
<t> | <t> | |||
The NSEC3 protocol <xref target="RFC5155" /> uses hashed names to | NSEC3 <xref target="RFC5155" /> uses hashed names to | |||
provide zone enumeration defense. This protection is already better | provide zone enumeration defense. This protection is already better | |||
provided by minimally covering NSEC records. NSEC3's Opt-Out feature | provided by minimally covering NSEC records. NSEC3's Opt-Out feature | |||
also provides no specific benefit for online signing implementations | also provides no specific benefit for online signing implementations | |||
(minimally covering NSEC3 records provide no useful Opt-Out span). | (minimally covering NSEC3 records provide no useful Opt-Out span). | |||
Hence, there is no known advantage to implementing Compact Denial | Hence, there is no known advantage to implementing Compact Denial | |||
of Existence with NSEC3. However, an existing implementation of | of Existence with NSEC3. However, an existing implementation of | |||
traditional NSEC3 online signing migrating to Compact Denial of | traditional NSEC3 online signing migrating to Compact Denial of | |||
Existence may find it simpler to do so with NSEC3 than implementing | Existence may find it simpler to do so with NSEC3 rather than implementi ng | |||
NSEC from scratch. | NSEC from scratch. | |||
</t> | </t> | |||
<t> | <t> | |||
For NSEC3, the functional details of the protocol remain as | For NSEC3, the functional details of the protocol remain as | |||
described in <xref target="responses"/>, with the following | described in <xref target="responses"/>, with the following | |||
changes: | changes. | |||
</t> | </t> | |||
<t> | <t> | |||
NSEC3 records and their signatures are dynamically generated | NSEC3 records and their signatures are dynamically generated | |||
instead of NSEC. | instead of NSEC. | |||
</t> | </t> | |||
<t> | <t> | |||
The NSEC3 parameters should be set to algorithm 1, a flags field | The NSEC3 parameters should be set to algorithm 1, a flags field | |||
of 0, an additional hash iteration count of 0, and an empty salt. | of 0, an additional hash iteration count of 0, and an empty salt. | |||
In DNS presentation format, this is "1 0 0 -". | In DNS presentation format, this is "1 0 0 -". | |||
</t> | </t> | |||
<t> | <t> | |||
The Owner Name of the NSEC3 resource record is the NSEC3 hash of | The owner name of the NSEC3 resource record is the NSEC3 hash of | |||
the relevant domain name, encoded in Base32 with Extended Hex | the relevant domain name, encoded in Base32 with Extended Hex | |||
Alphabet (<xref target="RFC4648"/>, Section 7), prepended as a | Alphabet (<xref target="RFC4648" sectionFormat="comma" section="7"/>), p repended as a | |||
single label to the name of the zone. The Next Hashed Owner Name | single label to the name of the zone. The Next Hashed Owner Name | |||
is the immediate name successor of the unencoded binary form of | is the immediate name successor of the unencoded binary form of | |||
the previous hash, which can be computed by adding one to the | the previous hash, which can be computed by adding one to the | |||
binary hash value. | binary hash value. | |||
</t> | </t> | |||
<t> | <t> | |||
In responses for non-existent names, the Type Bit Maps field will | In responses for nonexistent names, the Type Bit Maps field will | |||
contain only the NXNAME meta-type. In responses to Empty Non-Terminal | contain only the NXNAME Meta-TYPE. In responses to ENT | |||
names, the Type Bit Maps field will be empty. | names, the Type Bit Maps field will be empty. | |||
</t> | </t> | |||
<t> | <t> | |||
For example, a request for the non-existent name "a.example.com." | For example, a request for the nonexistent name "a.example.com." | |||
would result in the following NSEC3 record to be generated: | would result in the generation of the following NSEC3 record: | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type=""><![CDATA[ | |||
H64KFA4P1ACER2EBPS9QSDK6DNP8B3JQ.example.com. IN NSEC3 1 0 0 - ( | H64KFA4P1ACER2EBPS9QSDK6DNP8B3JQ.example.com. IN NSEC3 1 0 0 - ( | |||
H64KFA4P1ACER2EBPS9QSDK6DNP8B3JR NXNAME ) | H64KFA4P1ACER2EBPS9QSDK6DNP8B3JR NXNAME ) | |||
]]></artwork> | ]]></sourcecode> | |||
<t> | <t> | |||
Unlike Compact Denial of Existence with NSEC, no special form of | Unlike Compact Denial of Existence with NSEC, no special form of | |||
the next name field for unsigned referrals is needed. The Hashed | the Next Hashed Owner Name field for unsigned referrals is needed. The | |||
Next Owner Name field remains the NSEC3 hash of original owner | Next Hashed Owner Name field remains the NSEC3 hash of original owner | |||
name plus one. | name plus one. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="rcode" numbered="true" toc="default"> | <section anchor="rcode"> | |||
<name>Response Code Restoration</name> | <name>Response Code Restoration</name> | |||
<t> | <t> | |||
For non-existent names, implementations should try wherever | For nonexistent names, implementations should try | |||
possible, to preserve the response code value of 3 (NXDOMAIN). | to preserve the response code value of 3 (NXDOMAIN) whenever possible. | |||
This is generally possible for non-DNSSEC enabled queries, | This is | |||
namely those which do not set the DNSSEC_OK EDNS flag (DO bit). | generally possible for non-DNSSEC-enabled queries, namely those that | |||
For such queries, authoritative servers implementing Compact Denial | do not set the DO bit ("DNSSEC answer OK") in the EDNS0 OPT header. For | |||
of Existence could return a normal NXDOMAIN response. There may | such queries, | |||
be limited benefit to doing this however, since most modern DNS | authoritative servers implementing Compact Denial of Existence could | |||
resolvers are DNSSEC-aware, and by <xref target="RFC3225" /> | return a normal NXDOMAIN response. However, there may be limited benefit | |||
Section 3, DNSSEC-aware recursive servers are required to set | to | |||
the DO bit on outbound queries, regardless of the status of the | doing this since most modern DNS resolvers are DNSSEC aware, | |||
DO bit on incoming requests. | and per <xref target="RFC3225" sectionFormat="of" section="3"/>, | |||
DNSSEC-aware recursive servers are required to set the DO bit on | ||||
outbound queries, regardless of the status of the DO bit on incoming | ||||
requests. | ||||
</t> | </t> | |||
<t> | <t> | |||
A validating resolver that understands the NXNAME signal from an | A validating resolver that understands the NXNAME signal from an | |||
authoritative server could modify the response code from NOERROR | authoritative server could modify the response code from NOERROR | |||
to NXDOMAIN in responses they return to downstream queriers that | to NXDOMAIN in responses they return to downstream queriers that | |||
have not set the DO bit in their requests. | have not set the DO bit in their requests. | |||
</t> | </t> | |||
<section anchor="signaled-rcode" numbered="true" toc="default"> | <section anchor="signaled-rcode"> | |||
<name>Signaled Response Code Restoration</name> | <name>Signaled Response Code Restoration</name> | |||
<t> | <t> | |||
This section describes an optional but recommended scheme | This section describes an optional but recommended scheme | |||
to permit signaled restoration of the NXDOMAIN RCODE for | to permit signaled restoration of the NXDOMAIN RCODE for | |||
DNSSEC enabled responses. A new | DNSSEC-enabled responses. A new EDNS0 | |||
<xref target="RFC6891">EDNS0</xref> header flag is defined | <xref target="RFC6891"></xref> header flag is defined | |||
in the 2nd most significant bit of the flags field in the EDNS0 | in the second most significant bit of the flags field in the EDNS0 | |||
OPT header. This flag is referred to as the | OPT header. This flag is referred to as the | |||
"Compact Answers OK (CO)" flag. | Compact Answers OK (CO) flag. | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
+0 (MSB) +1 (LSB) | +0 (MSB) +1 (LSB) | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
0: | EXTENDED-RCODE | VERSION | | 0: | EXTENDED-RCODE | VERSION | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
2: |DO|CO| Z | | 2: |DO|CO| Z | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
]]></artwork> | ]]></artwork> | |||
<t> | ||||
<t> | ||||
When this flag is sent in a query by a resolver, it indicates | When this flag is sent in a query by a resolver, it indicates | |||
that the resolver will accept a signed NXNAME enhanced | that the resolver will accept a NODATA response with a signed NXNAME | |||
NODATA response for a non-existent name together with the | for a nonexistent name, together with the | |||
response code field set to NXDOMAIN (3). | response code field set to NXDOMAIN (3). | |||
</t> | </t> | |||
<t> | <t> | |||
In responses to such queries, a Compact Denial authoritative | In responses to such queries, an authoritative server implementing | |||
server implementing this signaling scheme, will set the Compact | both Compact Denial of Existence and this signaling scheme will set | |||
Answers OK EDNS header flag, and for non-existent names will | the Compact Answers OK EDNS header flag and, for nonexistent names, | |||
additionally set the response code field to NXDOMAIN. | will additionally set the response code field to NXDOMAIN. | |||
</t> | </t> | |||
<t> | <t> | |||
EDNS is a hop by hop signal, so resolvers will need to | EDNS is a hop-by-hop signal, so resolvers will need to | |||
record the presence of this flag in associated cache data | record the presence of this flag in associated cache data | |||
and respond to downstream DNSSEC enabled queriers | and respond to downstream DNSSEC-enabled queriers | |||
appropriately. If the querier does not set the Compact | appropriately. If the querier does not set the Compact | |||
Answers OK flag, the resolver will need to reset the | Answers OK flag, the resolver will need to reset the | |||
response code back to NOERROR (0) for an NXNAME response. | response code back to NOERROR (0) for an NXNAME response. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="operational" numbered="true" toc="default"> | <section anchor="operational"> | |||
<name>Operational Implications</name> | <name>Operational Implications</name> | |||
<t> | <t> | |||
For DNSSEC enabled queries, a signed zone at an authoritative | For DNSSEC-enabled queries, a signed zone at an authoritative | |||
server implementing Compact Answers will never return a response | server implementing Compact Answers will never return a response | |||
with a response code of NXDOMAIN, unless they have implemented | with a response code of NXDOMAIN, unless they have implemented | |||
the optional response code restoration feature described in | the optional response code restoration feature described in | |||
<xref target="signaled-rcode"/>. Similarly, resolvers not | <xref target="signaled-rcode"/>. Similarly, resolvers not | |||
implementing this feature will also not be able to return NXDOMAIN. | implementing this feature will also not be able to return NXDOMAIN. | |||
In the absence of this, tools that rely on accurately determining | In the absence of this, tools that rely on accurately determining | |||
non-existent names will need to infer them from the presence of | nonexistent names will need to infer them from the presence of | |||
the NXNAME RR type in the Type Bit Maps field of the NSEC record | the NXNAME RR type in the Type Bit Maps field of the NSEC record | |||
in NODATA responses from these servers. | in NODATA responses from these servers. | |||
</t> | </t> | |||
<t> | <t> | |||
Address lookup functions typically invoked by applications | Address lookup functions typically invoked by applications | |||
may need to do more work when dealing with implementations of | may need to do more work when dealing with implementations of | |||
Compact Answers. For example, a NODATA response to the lookup | Compact Answers. For example, a NODATA response to the lookup | |||
of an AAAA record for a non-existent name, can cause such | of a AAAA record for a nonexistent name can cause such | |||
functions to issue another query at the same name for an A record. | functions to issue another query at the same name for an A record, | |||
Whereas an NXDOMAIN response to the first query could suppress | whereas an NXDOMAIN response to the first query could suppress | |||
additional queries for other types at that name. Address lookup | additional queries for other types at that name. Address lookup | |||
functions could be enhanced to issue DNSSEC enabled queries and | functions could be enhanced to issue DNSSEC-enabled queries and | |||
to examine the NSEC Type Bit Maps field in responses to accurately | to examine the NSEC Type Bit Maps field in responses to accurately | |||
determine non-existent names. Note that this is less of a concern | determine nonexistent names. Note that this is less of a concern | |||
with Happy Eyeballs <xref target="RFC8305" /> style of connection | with | |||
functions that typically issue back to back DNS queries without | connection functions like Happy Eyeballs <xref target="RFC8305" /> that | |||
typically issue back-to-back DNS queries without | ||||
waiting for individual responses. | waiting for individual responses. | |||
</t> | </t> | |||
<t> | <t> | |||
Protocol optimizations that enable DNS resolvers to synthesize | Protocol optimizations that enable DNS resolvers to synthesize | |||
NXDOMAIN or wildcard responses, like <xref target="RFC8020" /> and | NXDOMAIN or wildcard responses, like those described in <xref target="RF C8020" /> and | |||
<xref target="RFC8198" />, cannot be realized from responses | <xref target="RFC8198" />, cannot be realized from responses | |||
that use Compact Denial of Existence. In general, no online signing | that use Compact Denial of Existence. In general, no online signing | |||
scheme that employs minimally covering NSEC or NSEC3 records | scheme that employs minimally covering NSEC or NSEC3 records | |||
(including this one) permits RFC 8198 style NXDOMAIN or wildcard | (including this one) permits NXDOMAIN or wildcard | |||
response synthesis. Additionally, this protocol also precludes | response synthesis in the style described in <xref target="RFC8198" />. | |||
RFC 8020 style NXDOMAIN synthesis for DNSSEC enabled responses. | Additionally, this protocol also precludes | |||
NXDOMAIN synthesis for DNSSEC-enabled responses in the style described i | ||||
n <xref target="RFC8020" />. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="updates" numbered="true" toc="default"> | <section anchor="updates"> | |||
<name>Updates to RFCs</name> | <name>Updates to RFCs</name> | |||
<section anchor="updates4034" title="Updates to RFC 4034"> | <section anchor="updates4034" title="Updates to RFC 4034"> | |||
<t> | <t><xref target="RFC4034" sectionFormat="of" section="4.1.2"/> | |||
<xref target="RFC4034" /> Section 4.1.2, The Type Bit Maps Field, | ("The Type Bit Maps Field") states the following:</t> | |||
states the following: | ||||
</t> | <blockquote> | |||
<ul> | <t>Bits representing pseudo-types <bcp14>MUST</bcp14> be clear, as the | |||
<li> | y do not appear | |||
Bits representing pseudo-types MUST be clear, as they do not appear | in zone data. If encountered, they <bcp14>MUST</bcp14> be ignored upo | |||
in zone data. If encountered, they MUST be ignored upon being read. | n being read.</t> | |||
</li> | </blockquote> | |||
</ul> | ||||
<t> | <t>This paragraph is updated to the following:</t> | |||
This paragraph is updated to the following: | ||||
</t> | <blockquote> | |||
<ul> | <t>Bits representing pseudo-types <bcp14>MUST</bcp14> be clear, as | |||
<li> | they do not appear in zone data. If encountered, they | |||
Bits representing pseudo-types MUST be clear, as they do not appear | <bcp14>MUST</bcp14> be ignored upon being read. There is one | |||
in zone data. If encountered, they MUST be ignored upon being read. | exception to this rule for Compact Denial of Existence (RFC 9824), | |||
There is one exception to this rule for Compact Denial of Existence | where the NXNAME pseudo-type is allowed to appear in responses to | |||
(RFC TBD), where the NXNAME pseudo-type is allowed to appear in | nonexistent names.</t> | |||
responses to non-existent names. | </blockquote> | |||
</li> | ||||
</ul> | <t> | |||
<t> | Note: As a practical matter, no known resolver insists that | |||
Note: as a practical matter, no known resolver insists that | pseudo-types must be clear in the NSEC Type Bit Maps field, so this | |||
pseudo-types must be clear in the NSEC Type Bit Maps, so this | ||||
restriction (prior to its revision) has posed no problem for | restriction (prior to its revision) has posed no problem for | |||
the deployment of this mechanism. | the deployment of this mechanism. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="updates4035" title="Updates to RFC 4035"> | <section anchor="updates4035"> | |||
<t> | <name>Updates to RFC 4035</name> | |||
<xref target="RFC4035" /> Section 2.3, Including NSEC RRs in a Zone, | <t><xref target="RFC4035" sectionFormat="of" section="2.3"/> | |||
states the following: | ("Including NSEC RRs in a Zone") states the following:</t> | |||
</t> | ||||
<ul> | <blockquote> | |||
<li> | ||||
An NSEC record (and its associated RRSIG RRset) MUST NOT be the only | <t>An NSEC record (and its associated RRSIG RRset) <bcp14>MUST | |||
RRset at any particular owner name. That is, the signing process | NOT</bcp14> be the only RRset at any particular owner name. That | |||
MUST NOT create NSEC or RRSIG RRs for owner name nodes that were not | is, the signing process <bcp14>MUST NOT</bcp14> create NSEC or RRSIG | |||
the owner name of any RRset before the zone was signed. The main | RRs for owner name nodes that were not the owner name of any RRset | |||
reasons for this are a desire for namespace consistency between | before the zone was signed. The main reasons for this are a desire | |||
signed and unsigned versions of the same zone and a desire to reduce | for namespace consistency between signed and unsigned versions of | |||
the risk of response inconsistency in security oblivious recursive | the same zone and a desire to reduce the risk of response | |||
name servers. | inconsistency in security oblivious recursive name servers.</t> | |||
</li> | </blockquote> | |||
</ul> | ||||
<t> | <t> | |||
This paragraph is updated to the following:: | This paragraph is updated to the following: | |||
</t> | </t> | |||
<ul> | ||||
<li> | <blockquote> | |||
An NSEC record (and its associated RRSIG RRset) MUST NOT be the only | <t>An NSEC record (and its associated RRSIG RRset) <bcp14>MUST NOT</bc | |||
p14> be the only | ||||
RRset at any particular owner name. That is, the signing process | RRset at any particular owner name. That is, the signing process | |||
MUST NOT create NSEC or RRSIG RRs for owner name nodes that were not | <bcp14>MUST NOT</bcp14> create NSEC or RRSIG RRs for owner name nodes that were not | |||
the owner name of any RRset before the zone was signed. The main | the owner name of any RRset before the zone was signed. The main | |||
reasons for this are a desire for namespace consistency between | reasons for this are a desire for namespace consistency between | |||
signed and unsigned versions of the same zone and a desire to reduce | signed and unsigned versions of the same zone and a desire to reduce | |||
the risk of response inconsistency in security oblivious recursive | the risk of response inconsistency in security oblivious recursive | |||
name servers. This concern only applies to implementations of DNSSEC | name servers. This concern only applies to implementations of DNSSEC | |||
that employ pre-computed signatures. There is an exception to this | that employ precomputed signatures. There is an exception to this | |||
rule for online signing implementations of DNSSEC (e.g., Minimally | rule for online signing implementations of DNSSEC (e.g., minimally | |||
Covering NSEC, and Compact Denial of Existence), where | covering NSEC and Compact Denial of Existence), where | |||
dynamically generated NSEC records can be produced for owner names | dynamically generated NSEC records can be produced for owner names | |||
that don't exist or are empty non-terminals. | that don't exist or are ENTs.</t> | |||
</li> | </blockquote> | |||
</ul> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="security" numbered="true" toc="default"> | <section anchor="security"> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<t> | <t> | |||
Online signing of DNS records requires authoritative servers | Online signing of DNS records requires authoritative servers | |||
for the DNS zone to have access to the private signing keys. | for the DNS zone to have access to the private signing keys. | |||
Exposing signing keys on Internet reachable servers makes them | Exposing signing keys on Internet-reachable servers makes them | |||
more vulnerable to attack. | more vulnerable to attack. | |||
</t> | </t> | |||
<t> | <t> | |||
Additionally, generating signatures on-demand is more | Additionally, generating signatures on demand is more | |||
computationally intensive than returning pre-computed | computationally intensive than returning precomputed | |||
signatures. Although the Compact Answers scheme reduces the | signatures. Although the Compact Answers scheme reduces the | |||
number of online signing operations compared to previous | number of online signing operations compared to previous | |||
techniques like White Lies, it still may make authoritative | techniques like White Lies, it still may make authoritative | |||
servers more vulnerable to computational denial of service | servers more vulnerable to computational denial-of-service | |||
attacks than pre-computed signatures. The use of signature | attacks than precomputed signatures. The use of signature | |||
algorithms (like those based on Elliptic Curves) that have | algorithms (like those based on elliptic curves) that have | |||
a comparatively low cost for signing is recommended. | a comparatively low cost for signing is recommended. | |||
</t> | </t> | |||
<t> | <t> | |||
Some security tools rely on detection of non-existent | Some security tools rely on detection of nonexistent | |||
domain names by examining the response code field of DNS | domain names by examining the response code field of DNS | |||
response messages. A NOERROR code in that field rather than | response messages. A NOERROR (rather than | |||
NXDOMAIN will impact such tools. Implementation of the | NXDOMAIN) code in that field will impact such tools. Implementation of t | |||
he | ||||
optional response code restoration scheme will help recover | optional response code restoration scheme will help recover | |||
NXDOMAIN visibility for these tools. Note that the DNS | NXDOMAIN visibility for these tools. Note that the DNS | |||
header is not cryptographically protected, so the response | header is not cryptographically protected, so the response | |||
code field cannot be authenticated. Thus inferring the status | code field cannot be authenticated. Thus, inferring the status | |||
of a response from signed data in the body of the DNS message | of a response from signed data in the body of the DNS message | |||
is actually more secure. These tools could be enhanced to | is actually more secure. These tools could be enhanced to | |||
recognize the (signed) NXNAME signal. | recognize the (signed) NXNAME signal. | |||
</t> | </t> | |||
<t> | <t> | |||
Because this method does not allow for aggressive negative | Because this method does not allow for aggressive negative | |||
caching among resolvers, it allows for certain types | caching among resolvers, it allows for certain types | |||
of denial-of-service attacks to be more effective. This | of denial-of-service attacks to be more effective. This | |||
includes so-called Pseudorandom Subdomain Attacks | includes so-called Pseudorandom Subdomain Attacks | |||
<xref target="PRSD-ATTACK" format="default"/>, where random names | <xref target="PRSD-ATTACK" format="default"/>, where random names | |||
are queried, either directly via botnets or across a wide | are queried, either directly via botnets or across a wide | |||
range of public resolver services, in order to intentionally | range of public resolver services, in order to intentionally | |||
generate non-existence responses from the authoritative | generate nonexistent responses from the authoritative | |||
servers for a domain. If the resolver cannot synthesize NXDOMAIN | servers for a domain. If the resolver cannot synthesize NXDOMAIN | |||
responses from NSEC records, it must pass all queries on to the | responses from NSEC records, it must pass all queries on to the | |||
domain's authority servers, making resource exhaustion more likely | domain's authority servers, making resource exhaustion more likely | |||
at those latter servers, if those servers do not have the capacity | at those latter servers if they do not have the capacity | |||
to absorb those additional queries. | to absorb those additional queries. | |||
</t> | </t> | |||
<t> | <t> | |||
If the motivating aspects of this specification (minimizing | If the motivating aspects of this specification (minimizing | |||
response size and computational costs) are not a concern, | response size and computational costs) are not a concern, | |||
DNSSEC deployments can opt for a different method (e.g., | DNSSEC deployments can opt for a different method (e.g., | |||
traditional online signing or pre-computed signatures), | traditional online signing or precomputed signatures) | |||
and avoid imposing the challenges of NXDOMAIN visibility. | and avoid imposing the challenges of NXDOMAIN visibility. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="acks" numbered="true" toc="default"> | <section anchor="iana"> | |||
<name>Acknowledgements</name> | ||||
<t> | ||||
The Compact Answers technique (then called "Black Lies") was | ||||
originally proposed in | ||||
<xref target="BLACK-LIES" format="default"/> by Filippo Valsorda | ||||
and Olafur Gudmundsson, and implemented by Cloudflare. The Empty | ||||
Non-Terminal distinguisher RR type was originally proposed in | ||||
<xref target="ENT-SENTINEL" format="default"/> by Shumon Huque, | ||||
and deployed by NS1. | ||||
The NXNAME type is based on the FDOM type proposed in | ||||
<xref target="NXDOMAIN-TYPE" format="default"/> by Gudmundsson | ||||
and Valsorda. | ||||
</t> | ||||
<t> | ||||
Especially detailed discussions on many technical aspects of this | ||||
document were conducted with Paul Vixie, Jan Vcelak, Viktor Dukhovni, | ||||
Ed Lewis, and John Levine. The authors would also like to thank | ||||
the many other members of the IETF DNS Operations working group | ||||
for helpful comments and discussions. | ||||
</t> | ||||
</section> | ||||
<section anchor="iana" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t> | <t> | |||
IANA is requested to do the following: | IANA has allocated the following in | |||
</t> | the "Resource Record (RR) TYPEs" registry in the "Domain Name System (DN | |||
<t> | S) Parameters" | |||
Allocate a new DNS Resource Record type code for NXNAME from | registry group, from the range for Meta-TYPEs. | |||
the "Resource Record (RR) Types" registry in the "DNS parameters" | A lower number in this range lowers the size of the | |||
registry group, from the meta type range. Specifically, the lowest | ||||
available number (currently 128) in the meta types range is | ||||
requested to be allocated. A lower number lowers the size of the | ||||
Type Bit Maps field, which reduces the overall size of the DNS | Type Bit Maps field, which reduces the overall size of the DNS | |||
response message. | response message. | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <table> | |||
Type Value Meaning | <thead> | |||
NXNAME 128 NXDOMAIN indicator for Compact Denial of Existence | <tr><th>Type</th><th>Value</th><th>Meaning</th><th>Reference</th></tr> | |||
]]></artwork> | </thead> | |||
<tbody> | ||||
<tr> | ||||
<td>NXNAME</td> | ||||
<td>128</td> | ||||
<td>NXDOMAIN indicator for Compact Denial of Existence</td> | ||||
<td>RFC 9824</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
Allocate the "Compact Answers OK" flag in the "EDNS Header Flags | IANA has also allocated the following flag in the "EDNS Header Flags | |||
(16 bits)" registry in the "Domain Name System (DNS) Parameters" | (16 bits)" registry in the "Domain Name System (DNS) Parameters" | |||
registry group. Set the Flag field to "CO", as described in | registry group. This flag is described in <xref target="signaled-rcode"/ | |||
<xref target="signaled-rcode"/>. | >. | |||
</t> | </t> | |||
<table anchor="blah"> | ||||
<name></name> | ||||
<thead> | ||||
<tr> | ||||
<th>Bit</th> | ||||
<th>Flag</th> | ||||
<th>Description</th> | ||||
<th>Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td>Bit 1</td> | ||||
<td>CO</td> | ||||
<td>Compact Answers OK</td> | ||||
<td>RFC 9824</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
Allocate a code point for "Invalid Query Type" in the | Last, IANA has allocated the following code point in the | |||
"Extended DNS Error Codes" registry in the "Domain Name System | "Extended DNS Error Codes" registry in the "Domain Name System | |||
(DNS) Parameters" registry group, as described in | (DNS) Parameters" registry group. This code point is described in | |||
<xref target="response-nxname"/>. | <xref target="response-nxname"/>. | |||
</t> | </t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <table> | |||
INFO-CODE Purpose | <thead> | |||
30 Invalid Query Type | <tr> | |||
]]></artwork> | <th>INFO-CODE</th> | |||
<th>Purpose</th> | ||||
<th>Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td>30</td> | ||||
<td>Invalid Query Type</td> | ||||
<td>RFC 9824</td></tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
</middle> | </middle> | |||
<!-- *****BACK MATTER ***** --> | ||||
<back> | <back> | |||
<displayreference target="I-D.valsorda-dnsop-black-lies" to="BLACK-LIES"/> | ||||
<displayreference target="I-D.huque-dnsop-blacklies-ent" to="ENT-SENTINEL"/> | ||||
<displayreference target="I-D.ogud-fake-nxdomain-type" to="NXDOMAIN-TYPE"/> | ||||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
ence.RFC.2119.xml"/> | 119.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
ence.RFC.3225.xml"/> | 225.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
ence.RFC.4034.xml"/> | 034.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
ence.RFC.4035.xml"/> | 035.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
ence.RFC.4470.xml"/> | 470.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
ence.RFC.4648.xml"/> | 648.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
ence.RFC.5155.xml"/> | 155.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | |||
ence.RFC.6891.xml"/> | 891.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | |||
ence.RFC.6895.xml"/> | 895.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
ence.RFC.8174.xml"/> | 174.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
ence.RFC.8914.xml"/> | 914.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
ence.RFC.9364.xml"/> | 364.xml"/> | |||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | |||
ence.RFC.7129.xml"/> | 129.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
ence.RFC.8020.xml"/> | 020.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
ence.RFC.8198.xml"/> | 198.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
ence.RFC.8305.xml"/> | 305.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
ence.RFC.9499.xml"/> | 499.xml"/> | |||
<reference anchor="BLACK-LIES" | <!-- [BLACK-LIES] Long Way due to author name | |||
target="https://tools.ietf.org/html/draft-valsorda-dnsop-black- | draft-valsorda-dnsop-black-lies-00 | |||
lies"> | IESG State: Expired as of 04/12/25 | |||
<front> | --> | |||
<title>Compact DNSSEC Denial of Existence or Black Lies</title> | <reference anchor="I-D.valsorda-dnsop-black-lies" target="https://datatracker.ie | |||
<author fullname="Filippo Valsorda" initials="F" surname="Valsorda" /> | tf.org/doc/html/draft-valsorda-dnsop-black-lies-00"> | |||
<author fullname="Olafur Gudmundsson" initials="O" surname="Gudmundsso | <front> | |||
n" /> | <title>Compact DNSSEC Denial of Existence or Black Lies</title> | |||
<date /> | <author fullname="Filippo Valsorda" initials="F." surname="Valsorda"> | |||
</front> | <organization>CloudFlare Inc.</organization> | |||
</reference> | </author> | |||
<reference anchor="ENT-SENTINEL" | <author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson"> | |||
target="https://www.ietf.org/archive/id/draft-huque-dnsop-black | <organization>CloudFlare Inc.</organization> | |||
lies-ent-01.html"> | </author> | |||
<front> | <date day="21" month="March" year="2016"/> | |||
<title>Empty Non-Terminal Sentinel for Black Lies</title> | </front> | |||
<author fullname="Shumon Huque" initials="S" surname="Huque" /> | <seriesInfo name="Internet-Draft" value="draft-valsorda-dnsop-black-lies-00"/> | |||
<date /> | </reference> | |||
</front> | <!-- [ENT-SENTINEL] | |||
</reference> | draft-huque-dnsop-blacklies-ent-01 | |||
<reference anchor="NXDOMAIN-TYPE" | IESG State: Expired as of 04/12/25 | |||
target="https://tools.ietf.org/html/draft-ogud-fake-nxdomain-ty | --> | |||
pe/"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.h | |||
<front> | uque-dnsop-blacklies-ent.xml"/> | |||
<title>Signaling NSEC record owner name nonexistence</title> | ||||
<author fullname="Olafur Gudmundsson" initials="O" surname="Gudmundsso | <!-- [NXDOMAIN-TYPE] Long Way due to author name | |||
n" /> | draft-ogud-fake-nxdomain-type-00 | |||
<author fullname="Filippo Valsorda" initials="F" surname="Valsorda" /> | IESG State: Expired as of 04/12/25 | |||
<date /> | --> | |||
</front> | <reference anchor="I-D.ogud-fake-nxdomain-type" target="https://datatracker.ietf | |||
</reference> | .org/doc/html/draft-ogud-fake-nxdomain-type-00"> | |||
<front> | ||||
<title>Signaling NSEC record owner name nonexistence</title> | ||||
<author fullname="Olafur Gudmundsson" initials="O." surname="Gudmundsson"> | ||||
<organization>CloudFlare Inc.</organization> | ||||
</author> | ||||
<author fullname="Filippo Valsorda" initials="F." surname="Valsorda"> | ||||
<organization>CloudFlare Inc.</organization> | ||||
</author> | ||||
<date day="7" month="May" year="2015"/> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ogud-fake-nxdomain-type-00"/> | ||||
</reference> | ||||
<reference anchor="PRSD-ATTACK" | <reference anchor="PRSD-ATTACK" | |||
target="https://conference.apnic.net/data/39/dnswatertortureonq tnet_1425130417_1425507043.pptx"> | target="https://conference.apnic.net/data/39/dnswatertortureonq tnet_1425130417_1425507043.pptx"> | |||
<front> | <front> | |||
<title>Water Torture: A Slow Drip DNS DDoS Attack on QTNet</title> | <title>Water Torture: A Slow Drip DNS DDoS Attack on QTNet</title> | |||
<author fullname="Kei Nishida" initials="K" surname="Nishida" /> | <author fullname="Kei Nishida" initials="K" surname="Nishida" /> | |||
<date /> | <date /> | |||
</front> | </front> | |||
</reference> | </reference> | |||
</references> | </references> | |||
</references> | </references> | |||
<section anchor="other-approaches" numbered="true" removeInRFC="false" | <section anchor="other-approaches"> | |||
toc="include" pn="section-appendix.a"> | ||||
<name>Other Approaches</name> | <name>Other Approaches</name> | |||
<t> | <t> | |||
In the past, some implementations of Compact Denial of Existence | In the past, some implementations of Compact Denial of Existence | |||
have used other means to differentiate NXDOMAIN from Empty | have used other means to differentiate NXDOMAIN from ENTs. | |||
Non-Terminals. | ||||
</t> | </t> | |||
<t> | <t> | |||
One method employed by both Cloudflare and Amazon Route53 for | One method employed by both Cloudflare and Amazon Route53 for | |||
a period of time was the following: for responses to Empty | a period of time was the following: For responses to ENTs, | |||
Non-Terminals, they synthesized the NSEC Type Bit Maps to include | they synthesized the NSEC Type Bit Maps field to include | |||
all record types supported except for the queried type. This | all record types supported except for the queried type. This | |||
method has the undesirable effect of no longer being able to | method has the undesirable effect of no longer being able to | |||
reliably determine the existence of ENTs, and of making the Type | reliably determine the existence of ENTs and of making the Type | |||
Bit Maps field larger than it needs to be. It also has the potential | Bit Maps field larger than it needs to be. It also has the potential | |||
to confuse validators and others tools that infer type existence | to confuse validators and others tools that infer type existence | |||
from the NSEC record. | from the NSEC record. | |||
</t> | </t> | |||
<t> | <t> | |||
Another way to distinguish NXDOMAIN from ENT is to | Another way to distinguish NXDOMAIN from ENT is to | |||
define the synthetic Resource Record type for ENTs instead, | define the synthetic RR type for ENTs instead, | |||
as specified in <xref target="ENT-SENTINEL" format="default"/>. | as specified in <xref target="I-D.huque-dnsop-blacklies-ent" format="def | |||
ault"/>. | ||||
This method was successfully deployed in the field by NS1 for a | This method was successfully deployed in the field by NS1 for a | |||
period of time. This typically imposes less work on the server | period of time. This typically imposes less work on the server | |||
since NXDOMAIN responses are a lot more common than ENTs. At the | since NXDOMAIN responses are a lot more common than ENTs. At the | |||
time it was deployed, it also allowed a common bitmap pattern | time it was deployed, it also allowed a common bitmap pattern | |||
("NSEC RRSIG") to identify NXDOMAIN across this and other | ("NSEC RRSIG") to identify NXDOMAIN across this and other | |||
implementations that returned a broad bitmap pattern for Empty | implementations that returned a broad bitmap pattern for | |||
Non-Terminals. However, the advantage of the NXNAME RR type is | ENTs. However, the advantage of the NXNAME RR type is | |||
that it explicitly identifies NXDOMAIN responses, and allows | that it explicitly identifies NXDOMAIN responses and allows | |||
them to be distinguished conclusively from potential ENT responses | them to be distinguished conclusively from potential ENT responses | |||
in other online signing NSEC implementations. | in other online signing NSEC implementations. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="implementations" numbered="true" removeInRFC="false" | <section anchor="implementations"> | |||
toc="include" pn="section-appendix.b"> | ||||
<name>Historical Implementation Notes</name> | <name>Historical Implementation Notes</name> | |||
<t> | <t> | |||
At the time of publication, the basic Compact Denial of Existence | At the time of publication, the basic Compact Denial of Existence | |||
method using NSEC is implemented by Cloudflare, NS1, Amazon Route53, | method using NSEC is implemented by Cloudflare, NS1, Amazon Route53, | |||
and Knot DNS's optional online signing module. From early 2021 until | and Knot DNS's optional online signing module. From early 2021 until | |||
November 2023, NS1 had deployed the Empty Non-Terminal distinguisher | November 2023, NS1 had deployed the ENT distinguisher | |||
<xref target="ENT-SENTINEL" format="default"/> using the private | <xref target="I-D.huque-dnsop-blacklies-ent" format="default"/> using th | |||
e private | ||||
RR type code 65281. A version of the NXNAME distinguisher using | RR type code 65281. A version of the NXNAME distinguisher using | |||
the private RR type code 65238 was deployed by both Cloudflare | the private RR type code 65238 was deployed by both Cloudflare | |||
(from July 2023) and NS1 (from November 2023) until roughly | (from July 2023) and NS1 (from November 2023) until roughly | |||
September 2024. Since September 2024 both Cloudflare and NS1 have | September 2024. Since September 2024, both Cloudflare and NS1 have | |||
deployed NXNAME using the officially allocated code point of 128. | deployed NXNAME using the officially allocated code point of 128. | |||
Oracle Cloud Initiative implemented Compact Denial of Existence | Oracle Cloud Initiative implemented Compact Denial of Existence | |||
using NSEC3 in October 2024. | using NSEC3 in October 2024. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="acks" numbered="false"> | ||||
<name>Acknowledgements</name> | ||||
<t>The Compact Answers technique (then called "Black Lies") was | ||||
originally proposed in <xref target="I-D.valsorda-dnsop-black-lies" | ||||
format="default"/> by <contact fullname="Filippo Valsorda"/> and | ||||
<contact fullname="Olafur Gudmundsson"/> and implemented by | ||||
Cloudflare. The ENT distinguisher RR type was originally | ||||
proposed in <xref target="I-D.huque-dnsop-blacklies-ent" | ||||
format="default"/> by <contact fullname="Shumon Huque"/> and deployed by | ||||
NS1. The NXNAME type is based on the FDOM type proposed in <xref | ||||
target="I-D.ogud-fake-nxdomain-type" format="default"/> by Gudmundsson | ||||
and Valsorda.</t> | ||||
<t>Especially detailed discussions on many technical aspects of this | ||||
document were conducted with <contact fullname="Paul Vixie"/>, <contact | ||||
fullname="Jan Včelák"/>, <contact fullname="Viktor Dukhovni"/>, <contact | ||||
fullname="Ed Lewis"/>, and <contact fullname="John Levine"/>. The | ||||
authors would also like to thank the many other members of the IETF DNS | ||||
Operations Working Group for helpful comments and discussions.</t> | ||||
</section> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 139 change blocks. | ||||
417 lines changed or deleted | 441 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |