<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-thomassen-dnsop-cds-consistency-03" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" updates="7344, 7477" consensus="true">

<front>
<title abbrev="cds-consistency">Consistency for CDS/CDNSKEY and CSYNC is Mandatory</title><seriesInfo value="draft-thomassen-dnsop-cds-consistency-03" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="P." surname="Thomassen" fullname="Peter Thomassen"><organization>Secure Systems Engineering, deSEC</organization><address><postal><street></street>
<city>Berlin</city>
<country>Germany</country>
</postal><email>peter.thomassen@securesystems.de</email>
</address></author>
<date year="2023" month="March" day="4"></date>
<area>Internet</area>
<workgroup>DNSOP Working Group</workgroup>

<abstract>
<t>Maintenance of DNS delegations requires occasional changes of the DS and
NS record sets on the parent side of the delegation.
<xref target="RFC7344"></xref> automates this for DS records by having the child publish
CDS and/or CDNSKEY records which hold the prospective DS parameters.
Similarly, CSYNC records indicate a desired update of the delegation's
NS records <xref target="RFC7477"></xref>.
Parent-side entities (e.g. Registries, Registrars) typically discover
these records by periodically querying them from the child (&quot;polling&quot;),
before using them to update the delegation's parameters.</t>
<t>This document specifies that if polling is used, parent-side entities
MUST ensure that updates triggered via CDS/CDNSKEY and CSYNC records
are consistent across the child's authoritative nameservers, before
taking any action based on these records.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t><xref target="RFC7344"></xref> automates DNSSEC delegation trust maintenance by having the
child publish CDS and/or CDNSKEY records which hold the prospective DS
parameters.
Similarly, <xref target="RFC7477"></xref> specifies CSYNC records indicating a desired
update of the delegation's NS records.
Parent-side entities (e.g. Registries, Registrars) can use these records
to update the delegation's DS and NS records.</t>
<t>A common method for discovering these signals is to periodically query
them from the child zone (&quot;polling&quot;).
For CSYNC, this is described in <xref target="RFC7477"></xref> Section 3.1 which advocates
limiting polling queries to just one authoritative nameserver.
The corresponding Section 6.1 of <xref target="RFC7344"></xref> (CDS/CDNSKEY) contains no
such provision for how specifically polling of these records should be
done.</t>
<t>Implementations are thus likely to retrieve records from just one
authoritative server, typically by directing queries towards a trusted
validating resolver.
While that may be fine if all authoritative nameservers are controlled
by the same entity (typically the Child DNS Operator), it does pose a
problem as soon as multiple providers are involved.
(Note that it is generally impossible for the parent to determine
whether all authoritative nameservers are controlled by the same
entity.)</t>
<t>In such cases, CDS/CDNSKEY/CSYNC records retrieved &quot;naively&quot; from one
nameserver only may be entirely inconsistent with those of other
authoritative servers.
When no consistency check is done, each provider may unilaterally
trigger a roll of the DS or NS record set at the parent.</t>
<t>As a result, adverse consequences can arise in conjunction with the
multi-signer scenarios laid out in <xref target="RFC8901"></xref>, both when deployed
temporarily (during a provider change) and permanently (in a
multi-homing setup).
For example, a single provider may (accidentally or maliciously) cause
another provider's trust anchors and/or nameservers to be removed from
the delegation.
Similar breakage can occur when the delegation has lame nameservers.
More detailed examples are given in <xref target="scenarios"></xref>.</t>
<t>A single provider should not be in the position to remove the other
providers' records from the delegation.
To address this issue, this document specifies that if polling is used,
parent-side entities MUST ensure that the updates indicated by
CDS/CDNSKEY and CSYNC record sets are consistent across all of the
child's authoritative nameservers, before taking any action based on
these records.</t>
<t>Readers are expected to be familiar with DNSSEC, including <xref target="RFC4033"></xref>,
<xref target="RFC4034"></xref>, <xref target="RFC4035"></xref>, <xref target="RFC6781"></xref>, <xref target="RFC7344"></xref>, <xref target="RFC7477"></xref>, and
<xref target="RFC8901"></xref>.</t>

<section anchor="requirements-notation"><name>Requirements Notation</name>
<t>The key words &quot;<bcp14>MUST</bcp14>&quot;, &quot;<bcp14>MUST NOT</bcp14>&quot;, &quot;<bcp14>REQUIRED</bcp14>&quot;,
&quot;<bcp14>SHALL</bcp14>&quot;, &quot;<bcp14>SHALL NOT</bcp14>&quot;, &quot;<bcp14>SHOULD</bcp14>&quot;, &quot;<bcp14>SHOULD NOT</bcp14>&quot;,
&quot;<bcp14>RECOMMENDED</bcp14>&quot;, &quot;<bcp14>NOT RECOMMENDED</bcp14>&quot;, &quot;<bcp14>MAY</bcp14>&quot;, and
&quot;<bcp14>OPTIONAL</bcp14>&quot; in this document are to be interpreted as described in
BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they appear in all
capitals, as shown here.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>The terminology in this document is as defined in <xref target="RFC7344"></xref>.</t>
</section>
</section>

<section anchor="scenarios"><name>Failure Scenarios</name>
<t>The following scenarios are examples of how things can go wrong when
consistency is not enforced by the parent during CDS/CDNSKEY/CSYNC
processing.
Other scenarios that cause similar (or perhaps even more) harm may
exist.</t>
<t>The common feature of these scenarios is that if one DNS provider steps
out of line and the parent is not careful, DNS resolution and/or
validation will break down, undermining the very guarantees of operator
independence that multi-homing configurations are expected to provide.</t>

<section anchor="lame-delegations"><name>Lame Delegations</name>
<t>A delegation may include a non-existent NS hostname, for example due to
a typo or when the nameserver's domain registration has expired.
(Re-)registering such a non-resolvable nameserver domain allows a third
party to run authoritative DNS service for all domains delegated to that
NS hostname, serving responses different from those in the legitimate
zonefile.</t>
<t>This strategy for hijacking (at least part of the) DNS traffic and
spoofing responses is not new, but surprisingly common <xref target="LAME1"></xref><xref target="LAME2"></xref>.
It is also known that DNSSEC reduces the impact of such an attack,
as validating resolvers will reject illegitimate responses due to lack
of signatures consistent with the delegation's DS records.</t>
<t>On the other hand, if the delegation is not protected by DNSSEC, the
rogue nameserver is not only able to serve unauthorized responses
without detection; it is even possible for the attacker to escalate the
nameserver takeover to a full domain takeover.</t>
<t>In particular, the rogue nameserver can publish CDS/CDNSKEY records.
If those are processed by the parent without ensuring consistency with
other authoritative nameservers, the delegation will be secured with
the attacker's DNSSEC keys.
As responses served by the remaining legitimate nameservers are not
signed with these keys, validating resolvers will start rejecting them.</t>
<t>Once DNSSEC is established, the attacker can use CSYNC to remove other
nameservers from the delegation at will (and potentially add new ones
under their control).
This enables the attacker to position themself as the only party
providing authoritiative DNS service for the victim domain,
significantly augmenting the attack's impact.</t>
</section>

<section anchor="multi-homing-permanent-multi-signer"><name>Multi-Homing (Permanent Multi-Signer)</name>

<section anchor="ds-breakage"><name>DS Breakage</name>
<t>While performing a key rollover and adjusting the corresponding
CDS/CDNSKEY records, a provider could accidentally publish CDS/CDNSKEY
records that only include its own keys.</t>
<t>When the parent happens to retrieve the records from a nameserver
controlled by this provider, the other providers' DS records would be
removed from the delegation.
As a result, the zone is broken at least for some queries.</t>
</section>

<section anchor="ns-breakage"><name>NS Breakage</name>
<t>A similar scenario affects the CSYNC record, which is used to update the
delegation's NS record set at the parent.
The issue occurs, for example, when a provider accidentally includes
only their own set of hostnames in the local NS record set, or publishes
an otherwise flawed NS record set.</t>
<t>If the parent then observes a CSYNC signal and fetches the flawed NS
record set without ensuring consistency across nameservers, the
delegation may be updated in a way that breaks resolution or silently
reduces the multi-homing setup to a single-provider setup.</t>
</section>
</section>

<section anchor="provider-change-temporary-multi-signer"><name>Provider Change (Temporary Multi-Signer)</name>
<t>Transferring DNS service for a domain name from one (signing) DNS
provider to another, without going insecure, necessitates a brief period
during which the domain is operated in multi-signer mode:
First, the providers include each other's signing keys as DNSKEY and
CDS/CDNSKEY records in their copy of the zone.
Once the parent detects the updated CDS/CDNSKEY record set at the old
provider, the delegation's DS record set is updated.
Then, after waiting for cache expiration, the new provider's NS
hostnames can be added to the zone's NS record set, so that queries
start balancing across both providers.
(To conclude the hand-over, the old provider is removed by inverting
these steps with swapped roles.)</t>
<t>The multi-signer phase of this process breaks when the new provider
fails to include the old provider's keys in the DNSKEY and CDS/CDNSKEY
record sets.
One obvious consequence of that is that whenever the resolver happens to
retrieve the DNSKEY record set from the new provider, the old provider's
RRSIGs do no longer validate, causing responses to SERVFAIL.</t>
<t>However, an even worse consequence can occur when the parent performs
their next CDS/CDNSKEY scan:
It may then happen that the incorrect CDS/CDNSKEY record set is fetched
from the new provider and used to update the delegation's DS record set.
As a result, the old provider is prematureley removed from the domain's
DNSSEC chain of trust.
The new DS record set authenticates the new provider's DNSKEYs only, and
DNSSEC validation fails for all answers served by the old provider.</t>
</section>
</section>

<section anchor="polling-requirements"><name>Polling Requirements</name>
<t>This section defines consistency requirements for poll-based updates,
updating <xref target="RFC7344"></xref> Section 4.1 and <xref target="RFC7477"></xref> Sections 3.1 and 4.2.
Common ones are listed first, with type-specific criteria for polling
consistency described in each subsection.</t>
<t>In all cases, consistency is REQUIRED across received responses only.
Nameservers that appear to be unavailable SHOULD be disregarded as if
they were not part of the NS record set.</t>
<t>If an inconsistent polling state is encountered, the Parental Agent
MUST take no action.
Specifically, it MUST NOT delete or alter any existing RRset that would
have been deleted or altered, had the polling state been consistent.</t>
<t>To accommodate transient inconsistencies (e.g. replication delays), the
Parental Agent MAY retry the full process, repeating all queries.
A schedule with exponential back-off is RECOMMENDED (such as after 5,
10, 20, 40, ... minutes).</t>

<section anchor="cds-and-cdnskey"><name>CDS and CDNSKEY</name>
<t>To retrieve a Child's CDS/CDNSKEY RRset for DNSSEC delegation trust
maintenance, the Parental Agent, knowing both the Child zone name and
its NS hostnames, MUST ascertain that queries are made against all of
the nameservers listed in the Child's delegation from the Parent, and
ensure that each key referenced in any of the received answers is also
referenced in all other received responses.</t>
<t>In other words, CDS/CDNSKEY records at the Child zone apex MUST be
fetched directly from each of the authoritative servers as determined by
the delegation's NS record set, with DNSSEC validation enforced.
When a key is referenced in a CDS or CDNSKEY record set returned by
one nameserver, but is missing from a least one other nameserver's
answer, the CDS/CDNSKEY polling state MUST be considered inconsistent.</t>
</section>

<section anchor="csync"><name>CSYNC</name>
<t>A CSYNC-based update consists of (1) polling the CSYNC record to
determine which data records shall be synchronized from child to parent;
(2) querying for these data records (e.g. NS) and placing them in the
parent zone.
If the below conditions are not met during these steps, the CSYNC
polling state MUST be considered inconsistent.</t>
<t>When polling the CYSNC record set, the Parental Agent MUST ascertain
that queries are made against all of the nameservers listed in the
Child's delegation from the Parent, and ensure that the CSYNC record
sets are equal across all received responses.</t>
<t>When retrieving data record sets (e.g. NS), the Parental Agent MUST
ascertain that all queries are made against all of the nameservers
listed in the Child's delegation from the Parent, and ensure that the
record sets are all equal (including all empty).</t>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>The level of rigor mandated by this document is needed to prevent
publication of half-baked DS or delegation NS RRsets (authorized only
under an insufficient subset of authoritative nameservers), and ensures
that an operator in a multi-homing setup cannot unilaterally modify the
delegation (add or remove trust anchors or nameservers).
This applies both to intentional and unintentional multi-homing setups
(such as in the case of lame delegation hijacking).</t>
<t>As a consequence, the delegation's records can only be modified when
there is consensus across operators, which is expected to reflect the
domain owners intentions.
Both availability and integrity of the domain's DNS service benefit from
this policy.</t>
<t>In order to resolve situations in which consensus about child zone
contents cannot be reached (e.g. because one of the nameserver
providers is uncooperative), Parental Agents SHOULD continue to accept
DS and NS update requests from the domain owner via an authenticated
out-of-band channel (such as EPP <xref target="RFC5730"></xref>), irrespective of the rise
of automated delegation maintenance.</t>
</section>

<section anchor="acknowledgments"><name>Acknowledgments</name>
<t>Viktor Dukhovni</t>
</section>

</middle>

<back>
<references><name>Normative References</name>
<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.4033.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4035.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5730.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7344.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7477.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
</references>
<references><name>Informative References</name>
<reference anchor="LAME1" target="http://dx.doi.org/10.1145/3419394.3423623">
  <front>
    <title>Unresolved Issues</title>
    <author fullname="Gautam Akiwate" surname="Akiwate">
      <organization>UC San Diego</organization>
    </author>
    <author fullname="Mattijs Jonker" surname="Jonker">
      <organization>University of Twente</organization>
    </author>
    <author fullname="Raffaele Sommese" surname="Sommese">
      <organization>University of Twente</organization>
    </author>
    <author fullname="Ian Foster" surname="Foster">
      <organization>DNS Coffee</organization>
    </author>
    <author fullname="Geoffrey M. Voelker" surname="Voelker">
      <organization>UC San Diego</organization>
    </author>
    <author fullname="Stefan Savage" surname="Savage">
      <organization>UC San Diego</organization>
    </author>
    <author fullname="KC Claffy" surname="Claffy">
      <organization>CAIDA/UC San Diego</organization>
    </author>
    <author>
      <organization>ACM</organization>
    </author>
    <date year="2020" month="October" day="27"></date>
  </front>
  <seriesInfo name="DOI" value="10.1145/3419394.3423623"></seriesInfo>
</reference>
<reference anchor="LAME2" target="http://dx.doi.org/10.1145/3487552.3487816">
  <front>
    <title>Risky BIZness</title>
    <author fullname="Gautam Akiwate" surname="Akiwate">
      <organization>UC San Diego</organization>
    </author>
    <author fullname="Stefan Savage" surname="Savage">
      <organization>UC San Diego</organization>
    </author>
    <author fullname="Geoffrey M. Voelker" surname="Voelker">
      <organization>UC San Diego</organization>
    </author>
    <author fullname="K C Claffy" surname="Claffy">
      <organization>CAIDA/UC San Diego</organization>
    </author>
    <author>
      <organization>ACM</organization>
    </author>
    <date year="2021" month="November" day="2"></date>
  </front>
  <seriesInfo name="DOI" value="10.1145/3487552.3487816"></seriesInfo>
</reference>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6781.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8901.xml"/>
</references>

<section anchor="change-history-to-be-removed-before-publication"><name>Change History (to be removed before publication)</name>

<ul>
<li>draft-thomassen-dnsop-cds-consistency-03</li>
</ul>
<blockquote><t>Describe risk from lame delegations</t>
<t>Acknowledgments</t>
<t>Say what is being updated</t>
<t>Editorial changes.</t>
<t>Retry mechanism to resolve inconsistencies</t>
</blockquote>
<ul>
<li>draft-thomassen-dnsop-cds-consistency-02</li>
</ul>
<blockquote><t>Don't ignore DoE responses from individual nameservers (instead,
  require consistency across all responses received)</t>
</blockquote>
<ul>
<li>draft-thomassen-dnsop-cds-consistency-01</li>
</ul>
<blockquote><t>Allow for nameservers that don't respond or provide DoE (i.e. require
  consistency only among the non-empty answers received)</t>
<t>Define similar requirements for CSYNC.</t>
<t>Editorial changes.</t>
</blockquote>
<ul>
<li>draft-thomassen-dnsop-cds-consistency-00</li>
</ul>
<blockquote><t>Initial public draft.</t>
</blockquote></section>

</back>

</rfc>
