<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC6480 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6480.xml">
<!ENTITY RFC6481 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6481.xml">
<!ENTITY RFC6487 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6487.xml">
<!ENTITY RFC6488 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6488.xml">
<!ENTITY RFC6489 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6489.xml">
<!ENTITY RFC7942 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7942.xml">
<!ENTITY RFC8182 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8182.xml">
<!ENTITY RFC8630 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8630.xml">
<!ENTITY RFC8488 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.8488.xml">
<!ENTITY RFC9286 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.9286.xml">
]>

<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="3"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="std"
docName="draft-ietf-sidrops-manifest-numbers-09"
ipr="trust200902" updates="9286" consensus="true">

  <front>
    <title abbrev="RPKI Manifest Number Handling">Resource Public Key Infrastructure (RPKI) Manifest Number Handling</title>

    <author initials="T." surname="Harrison" fullname="Tom Harrison">
        <organization abbrev="APNIC">Asia Pacific Network Information Centre</organization>
        <address>
            <postal>
                <street>6 Cordelia St</street>
                <city>South Brisbane</city>
                <code>4101</code>
                <country>Australia</country>
                <region>QLD</region>
            </postal>
            <email>tomh@apnic.net</email>
        </address>
    </author>

    <author fullname="George G. Michaelson" initials="G." surname="Michaelson">
	<organization abbrev="APNIC">Asia-Pacific Network Information Centre</organization>

	<address>
	    <postal>
		<street>6 Cordelia St</street>
		<city>South Brisbane</city>
		<region>QLD</region>
		<code>4101</code>
		<country>Australia</country>
	    </postal>
	    <email>ggm@apnic.net</email>
	</address>
    </author>

    <author fullname="Job Snijders" initials="J." surname="Snijders">
        <organization></organization>
	<address>
	    <postal>
		<street/>
		<city>Amsterdam</city>
		<region/>
		<country>Netherlands</country>
	    </postal>
	    <email>job@sobornost.net</email>
	</address>
    </author>

    <date/>

    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>template</keyword>
    <abstract>
        <t>

            The Resource Public Key Infrastructure (RPKI) makes use of
            signed objects called manifests, each of which includes a
            "manifest number".  This document updates RFC9286 by
            specifying issuer and RP behaviour when a manifest number
            reaches the largest possible value, a situation not
            considered in RFC9286.

        </t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
        <t>

            The Resource Public Key Infrastructure (RPKI) <xref
            target="RFC6480" /> makes use of signed objects <xref
            target="RFC6488" /> called manifests <xref
            target="RFC9286" />.  A manifest lists each file that an
            issuer intends to include within an RPKI repository
            <xref target="RFC6481" />, and can be used to detect
            certain forms of attack against a repository.  Manifests
            include a "manifest number" (manifestNumber), which an
            issuer must increment by one whenever it issues a new
            manifest, and Relying Parties (RPs) are required to verify
            that a newly-retrieved manifest for a given Certification
            Authority (CA) has a higher manifestNumber than the
            previously-validated manifest (<xref
            target="RFC9286" sectionFormat="of" section="4.2.1" />).

        </t>

        <t>

            However, the manifestNumber field is 20 octets in length
            (i.e., bounded), and no behaviour is specified for
            when a manifestNumber reaches the largest possible value
            (2<sup>159</sup>-1).  When that value is reached, some RP
            implementations will accept a new manifest for the CA only
            once the current manifest has expired, while others will
            not accept a new manifest at all.

        </t>

        <t>

            While it is practically impossible for an issuer to reach
            the largest possible value under normal operating
            conditions (it would require that the issuer issue one
            manifest per second for 23,171,956,451,847,141,650,870
            quintillion years), there is still a chance that it could
            be reached due to bugs in the issuance or publication
            systems or incorrect/inadvertent use of those systems.
            For example:

            <ul>

                <li>Incrementing by large values when issuing
                manifests, such that the time to reach that largest
                value is reduced.</li>

                <li>Reissuing new manifests in an infinite delay-free
                loop, such that the manifestNumber increases by a
                large value in a comparatively short period of
                time.</li>

                <li>Inadvertently setting the manifestNumber to the
                largest possible value, such that the issuer will
                no longer be able to publish usable manifests for that
                repository.</li>

            </ul>

            These scenarios might also arise in combination and be more
            severe as a result.  For example, a CA might increase the
            manifestNumber by a large value on reissuance, and also
            reissue the manifest more frequently than is necessary.

        </t>

        <t>

            For a subordinate CA, the risk of repository invalidation
            due to such a problem can be addressed by the issuer
            using the key rollover process <xref target="RFC6489" />
            to get a new CA certificate.  RPs will treat this new certificate
            as though it represents a distinct CA, and the manifestNumber
            can be reset at that point.

        </t>

        <t>

            However, this option is not available for RPKI Trust
            Anchors (TAs).  If a TA publishes a manifest with the
            largest-possible manifestNumber value, then it is
            difficult to rely on the TA after that point, since
            (as described previously) some RPs will not accept a new manifest
            until the current one has expired, while others will
            reject all new manifests indefinitely.  Particularly in
            the case of TAs, the manifest validity period may be quite
            long, too.  Issuing a new TA and distributing the
            associated Trust Anchor Locator (TAL) <xref target="RFC8630"/>
            to clients would involve a large amount of work for TA operators
            and RPs.  Additionally, depending on the RP implementation being used,
            there would be a limited degree of RPKI protection by way of that TA for
            the time between the issuance of the problematic manifest
            and the installation of the new TAL.

        </t>

        <t>

            In order to avoid these problems, this document updates <xref target="RFC9286"/>
            by defining how issuers and RPs can handle this scenario in order
            to facilitate ongoing use of an affected repository.

        </t>

      <section title="Requirements Language">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
           NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
          "MAY", and "OPTIONAL" in this document are to be interpreted as
          described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
          when, and only when, they appear in all capitals, as shown here.</t>
      </section>
    </section>

    <section anchor="manifest-number-handling" title="Manifest Number Handling">

        <t>

            For a given CA, an RP MUST NOT reject a new manifest
            issued by that CA on the basis of it not having a higher
            manifestNumber than a previously-validated manifest if the
            new manifest has a different filename from that of the
            previously-validated manifest.  In other words, an RP has to
            reset its stored manifestNumber for a given CA if the CA
            changes the filename of its manifest.  This is an update
            to the requirements set out in <xref target="RFC9286"
            sectionFormat="of" section="4.2.1" />.

        </t>

        <t>

            With this behaviour, it is possible for a CA to be
            configured such that any time it issues a new manifest, it
            uses a new filename for that manifest.  If a CA were
            configured in this way, the manifestNumber validation set
            out in <xref target="RFC9286" sectionFormat="of"
            section="4.2.1" /> would have no purpose.  To avoid this
            outcome, CAs SHOULD NOT use new filenames for manifests
            except in situations where such a change is necessary to
            address the invalidity problem described in this document.
            Similarly, an RP MUST alert its operators when a
            manifest filename changes for a given CA.

        </t>

        <t anchor="replay">

            <xref target="RFC9286"/> requires that RPs perform two
            replay-related checks on newly-retrieved manifests:
            firstly, that the purported new manifest has a greater
            manifestNumber than the cached manifest, and secondly,
            that the purported new manifest has a more recent
            thisUpdate than the cached manifest.  An RP that
            implements the behaviour in this section will momentarily
            omit the manifestNumber check following a manifest
            filename change.  So long as the RP still performs the
            second check described above, it will be protected against
            replay attacks.

        </t>

    </section>

    <section anchor="manifest-filenames" title="Manifest Filenames">

        <t>

            A CA specifies its manifest URI by way of an SIA entry
            with an accessMethod of id-ad-rpkiManifest (<xref
            target="RFC6487" section="4.8.8.1" />).  For the purposes of this document,
            the manifest filename is the final segment of the path of
            the accessLocation URI from that SIA entry.

        </t>

        <t>

            <xref target="RFC6487" sectionFormat="of"
            section="4.8.8.1" /> states that a CA may include in its
            certificate multiple id-ad-rpkiManifest SIA entries.  For
            comparisons, an RP may use the filename from any one of
            the id-ad-rpkiManifest SIA entries in the
            previously-validated CA certificate.  If that filename
            does not appear in any of the id-ad-rpkiManifest SIA
            entries in the CA certificate that is currently being
            validated, then the manifest filename has changed for the
            purposes of this document.

        </t>

        <t>

            The corollary of the behaviour defined in the previous
            paragraph is that a CA that includes multiple
            id-ad-rpkiManifest SIA entries in its certificate and
            wants to rely on the behaviour defined in this document
            MUST ensure that none of the manifest filenames in the
            previous CA certificate appear in the newly-issued CA
            certificate.  If one of the manifest filenames from the
            previous CA certificate appears in the newly-issued CA
            certificate, then an RP that is using that manifest
            filename for comparisons will determine that the manifest
            filename for the CA has not changed, and will therefore
            not reset its stored manifestNumber for the CA. 

        </t>

    </section>

    <section anchor="manifest-sia-check" title="Manifest SIA Verification">

        <t>

            To avoid certain forms of replay attack, RPs MUST verify
            that the URI in the accessLocation in one of the
            id-ad-signedObject accessMethod instances in the
            manifest's Subject Information Access (SIA) extension
            exactly matches the URI presented in the RPKI Repository
            Delta Protocol (RRDP) <xref target="RFC8182" /> "publish"
            element or the path presented by remote rsync servers.  If
            this verification check is unsuccessful, then the fetch
            has failed, and the RP MUST proceed per <xref
            target="RFC9286" sectionFormat="of" section="6.6" />.

        </t>

    </section>

    <section anchor="rfc8488" title="RFC8488 Comparison">
         
        <t>

            <xref target="RFC8488" sectionFormat="of"
            section="3.2.1"/> describes a manifest selection approach
            for RPs that involves collecting all unexpired, valid
            manifests for a CA, and then selecting from that
            collection the manifest that has the highest
            manifestNumber.  The approach set out in this document is
            different from that approach.

        </t>
            
    </section>

    <section anchor="general-repository-handling" title="General Repository Handling">

        <t>

            <xref target="manifest-number-handling" /> contains a
            specific update to <xref target="RFC9286" /> for the
            handling of manifest numbers, in order to address one
            potential permanent invalidity scenario.  RPs that
            encounter other permanent invalidity scenarios should also
            consider how those can be addressed such that the scenario
            does not require the relevant CA or TA to perform a key
            rollover operation.  For example, in the event that an RP
            recognises that a permanent invalidity scenario has
            occurred, the RP could alert the operator and provide an
            option to the operator to stop relying on cached data for
            the affected repository, so that the CA can rectify the
            problem.

        </t>

    </section>

    <section title="Operational Considerations">

        <t>

            CA software may opt to support the manifest number reset
            functionality in various ways.  For example, it could
            change the manifest filename when the manifestNumber
            reaches a certain threshold, or it could alert the
            operator in this scenario and request confirmation that
            the filename should be changed.

        </t>

    </section>

    <section anchor="Security" title="Security Considerations">

        <t>

            The RPKI primarily exists to support and improve security
            of the global Internet routing system.  Reliability
            improvements to the RPKI itself, such as outlined in this
            document, strengthen its dependability (see <xref
            target="RFC6480" section="8" />).

        </t>

        <t>

            See <xref target="replay" /> regarding the effect of
            skipping the manifestNumber check with respect to replay
            attacks.  To protect against replay attacks in the absence
            of this check, RPs should ensure that they are verifying
            the thisUpdate value per the requirements of <xref
            target="RFC9286"/>.

        </t>

        <t>

            <xref target="manifest-sia-check" /> describes an
            additional protection against certain forms of replay
            attack.

        </t>

        <t>

            Although this document updates <xref target="RFC9286"/>,
            the security considerations from <xref target="RFC9286"/>
            remain relevant.

        </t>

    </section>

    <section anchor="IANA" title="IANA Considerations">
        <t>

            This document has no actions for IANA.

        </t>
    </section>

    <section removeInRFC="true">
      <name>Implementation status</name>
      <t>
        This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942" />.
        The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs.
        Please note that the listing of any individual implementation here does not imply endorsement by the IETF.
        Furthermore, no effort has been spent to verify the information presented here that was supplied by IETF contributors.
        This is not intended as, and must not be construed to be, a catalog of available implementations or their features.
        Readers are advised to note that other implementations may exist.
      </t>
      <t>
        According to <xref target="RFC7942" />, "this will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.
        It is up to the individual working groups to use this information as they see fit".
      </t>

      <section anchor="impl-rpki-client" title="rpki-client">
        <t><list style="none" spacing="compact">
          <t>Responsible Organization: OpenBSD<vspace blankLines='1' /></t>
          <t>Location: https://www.rpki-client.org<vspace blankLines='1' /></t>
          <t>Description: This implementation supports the behaviour described in this document.<vspace blankLines='1' /></t>
          <t>Level of Maturity: This is a production implementation.<vspace blankLines='1' /></t>
          <t>Coverage: This implementation includes all of the features described in this specification.<vspace blankLines='1' /></t>
          <t>Contact Information: Job Snijders, job@sobornost.net</t>
        </list></t>
      </section>

      <section anchor="impl-routinator" title="Routinator">
        <t><list style="none" spacing="compact">
          <t>Responsible Organization: NLNetLabs<vspace blankLines='1' /></t>
          <t>Location: https://github.com/NLnetLabs/routinator<vspace blankLines='1' /></t>
          <t>Description: This implementation supports the behaviour described in this document.<vspace blankLines='1' /></t>
          <t>Level of Maturity: This is a production implementation.<vspace blankLines='1' /></t>
          <t>Coverage: This implementation supports the manifest number handling changes described in this specification.<vspace blankLines='1' /></t>
          <t>Contact Information: NLNetLabs, labs@nlnetlabs.nl</t>
        </list></t>
      </section>

    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
        <t>

            The authors would like to thank <contact fullname="Theo
            Buehler"/>, <contact fullname="Ben Maddison" />, <contact
            fullname="Rob Austein" />, <contact fullname="Tim
            Bruijnzeels" />, <contact fullname="Russ Housley" />,
            <contact fullname="Mohamed Boucadair"/>, <contact
            fullname="Luigi Iannone" />, <contact fullname="Daniele
            Ceccarelli" />, <contact fullname="Darren Dukes" />,
            <contact fullname="Ines Robles" />, <contact
            fullname="Barry Leiba" />, <contact fullname="Éric Vyncke"
            />, <contact fullname="Gorry Fairhurst" />, <contact
            fullname="Andy Newton" />, <contact fullname="Roman
            Danyliw" />, <contact fullname="Mike Bishop" />, and
            <contact fullname="Deb Cooley" /> for
            their review and feedback on this document.

        </t>
    </section>

  </middle>

  <back>
    <references title="Normative References">
      &RFC2119;
      &RFC6487;
      &RFC6488;
      &RFC8174;
      &RFC8182;
      &RFC9286;
    </references>

    <references title="Informative References">
      &RFC6480;
      &RFC6481;
      &RFC6489;
      &RFC7942;
      &RFC8630;
      &RFC8488;
    </references>

  </back>
</rfc>
