| rfc9415xml2.original.xml | rfc9415.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <!DOCTYPE rfc [ | |||
| <!ENTITY nbsp " "> | ||||
| <!ENTITY zwsp "​"> | ||||
| <!ENTITY nbhy "‑"> | ||||
| <!ENTITY wj "⁠"> | ||||
| ]> | ]> | |||
| <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> <!-- used by XSLT proces | ||||
| sors --> | ||||
| <!-- OPTIONS, known as processing instructions (PIs) go here. --> | ||||
| <?rfc toc="yes" ?> | ||||
| <?rfc tocdepth="2" ?> | ||||
| <?rfc symrefs="yes" ?> | ||||
| <?rfc strict="no" ?> | ||||
| <rfc category="info" docName="draft-irtf-pearg-numeric-ids-generation-12" ipr="t | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IRTF" category=" | |||
| rust200902" submissionType="IRTF"> | info" consensus="true" docName="draft-irtf-pearg-numeric-ids-generation-12" numb | |||
| er="9415" ipr="trust200902" obsoletes="" updates="" xml:lang="en" tocInclude="tr | ||||
| <front> | ue" tocDepth="2" symRefs="true" sortRefs="true" version="3"> | |||
| <title abbrev="Generation of Transient Numeric IDs">On the Generation of Transie | ||||
| nt Numeric Identifiers</title> | ||||
| <!-- xml2rfc v2v3 conversion 3.15.3 --> | ||||
| <front> | ||||
| <title abbrev="Generation of Transient Numeric IDs">On the Generation of Tra | ||||
| nsient Numeric Identifiers</title> | ||||
| <seriesInfo name="RFC" value="9415"/> | ||||
| <author fullname="Fernando Gont" initials="F." surname="Gont"> | <author fullname="Fernando Gont" initials="F." surname="Gont"> | |||
| <organization abbrev="SI6 Networks">SI6 Networks</organization> | <organization abbrev="SI6 Networks">SI6 Networks</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>Segurola y Habana 4310 7mo piso</street> | <street>Segurola y Habana 4310 7mo piso</street> | |||
| <city>Ciudad Autonoma de Buenos Aires</city> | <city>Ciudad Autonoma de Buenos Aires</city> | |||
| <region>Buenos Aires</region> | ||||
| <country>Argentina</country> | <country>Argentina</country> | |||
| </postal> | </postal> | |||
| <!-- <phone>+54 11 4650 8472</phone> --> | ||||
| <email>fgont@si6networks.com</email> | <email>fgont@si6networks.com</email> | |||
| <uri>https://www.si6networks.com</uri> | <uri>https://www.si6networks.com</uri> | |||
| </address> | ||||
| </address> | ||||
| </author> | </author> | |||
| <author fullname="Ivan Arce" initials="I." surname="Arce"> | <author fullname="Ivan Arce" initials="I." surname="Arce"> | |||
| <organization abbrev="Quarkslab">Quarkslab</organization> | <organization abbrev="Quarkslab">Quarkslab</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>Segurola y Habana 4310 7mo piso</street> | <street>Segurola y Habana 4310 7mo piso</street> | |||
| <city>Ciudad Autonoma de Buenos Aires</city> | <city>Ciudad Autonoma de Buenos Aires</city> | |||
| <region>Buenos Aires</region> | ||||
| <country>Argentina</country> | <country>Argentina</country> | |||
| </postal> | </postal> | |||
| <email>iarce@quarkslab.com</email> | <email>iarce@quarkslab.com</email> | |||
| <uri>https://www.quarkslab.com</uri> | <uri>https://www.quarkslab.com</uri> | |||
| </address> | ||||
| </address> | ||||
| </author> | </author> | |||
| <date year="2023" month="July"/> | ||||
| <workgroup>Privacy Enhancements and Assessments</workgroup> | ||||
| <date/> | <keyword>security</keyword> | |||
| <keyword>vulnerability</keyword> | ||||
| <workgroup>Internet Research Task Force (IRTF)</workgroup> | <keyword>algorithm</keyword> | |||
| <keyword>attack</keyword> | ||||
| <!-- | <keyword>fingerprinting</keyword> | |||
| <area>Internet</area> | ||||
| <workgroup>Dynamic Host Configuration (dhc)</workgroup> | ||||
| <!-- <area/> --> | ||||
| <!-- <workgroup/> --> | ||||
| <abstract> | <abstract> | |||
| <t> | <t> | |||
| This document performs an analysis of the security and privacy implications of d | This document performs an analysis of the security and privacy implications of d | |||
| ifferent types of "transient numeric identifiers" used in IETF protocols, and tr | ifferent types of "transient numeric identifiers" used in IETF protocols and tri | |||
| ies to categorize them based on their interoperability requirements and their as | es to categorize them based on their interoperability requirements and their ass | |||
| sociated failure severity when such requirements are not met. Subsequently, it p | ociated failure severity when such requirements are not met. Subsequently, it pr | |||
| rovides advice on possible algorithms that could be employed to satisfy the inte | ovides advice on possible algorithms that could be employed to satisfy the inter | |||
| roperability requirements of each identifier category, while minimizing the nega | operability requirements of each identifier category while minimizing the negati | |||
| tive security and privacy implications, thus providing guidance to protocol desi | ve security and privacy implications, thus providing guidance to protocol design | |||
| gners and protocol implementers. Finally, it describes a number of algorithms th | ers and protocol implementers. Finally, it describes a number of algorithms that | |||
| at have been employed in real implementations to generate transient numeric iden | have been employed in real implementations to generate transient numeric identi | |||
| tifiers, and analyzes their security and privacy properties. This document is a | fiers and analyzes their security and privacy properties. This document is a pro | |||
| product of the Privacy Enhancement and Assessment Research Group (PEARG) in the | duct of the Privacy Enhancements and Assessments Research Group (PEARG) in the I | |||
| IRTF. | RTF. | |||
| </t> | </t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="intro" numbered="true" toc="default"> | ||||
| <name>Introduction</name> | ||||
| <t> | ||||
| Networking protocols employ a variety of transient numeric identifiers for diffe | ||||
| rent protocol objects, such as IPv4 and IPv6 Identification values <xref target= | ||||
| "RFC0791" format="default"/> <xref target="RFC8200" format="default"/>, IPv6 Int | ||||
| erface Identifiers (IIDs) <xref target="RFC4291" format="default"/>, transport-p | ||||
| rotocol ephemeral port numbers <xref target="RFC6056" format="default"/>, TCP In | ||||
| itial Sequence Numbers (ISNs) <xref target="RFC9293" format="default"/>, NTP Ref | ||||
| erence IDs (REFIDs) <xref target="RFC5905" format="default"/>, and DNS IDs <xref | ||||
| target="RFC1035" format="default"/>. These identifiers typically have specific | ||||
| requirements (e.g., uniqueness during a specified period of time) that must be s | ||||
| atisfied such that they do not result in negative interoperability implications | ||||
| and an associated failure severity when such requirements are not met.</t> | ||||
| <aside> | ||||
| <t>NOTE: Some documents refer to the DNS ID as the DNS "Query ID" or "TxID".</t> | ||||
| </aside> | ||||
| <section title="Introduction" anchor="intro"> | <t>For more than 30 years, a large number of implementations of IETF protocols h | |||
| <t>Networking protocols employ a variety of transient numeric identifiers for di | ave been subject to a variety of attacks, with effects ranging from Denial of Se | |||
| fferent protocol objects, such as IPv4 and IPv6 Fragment Identifiers <xref targe | rvice (DoS) or data injection to information leakages that could be exploited fo | |||
| t="RFC0791"/> <xref target="RFC8200"/>, IPv6 Interface Identifiers (IIDs) <xref | r pervasive monitoring <xref target="RFC7258" format="default"/>. The root cause | |||
| target="RFC4291"/>, transport protocol ephemeral port numbers <xref target="RFC6 | of these issues has been, in many cases, the poor selection of transient numeri | |||
| 056"/>, TCP Initial Sequence Numbers (ISNs) <xref target="RFC0793"/>, and DNS Qu | c identifiers in such protocols, usually as a result of insufficient or misleadi | |||
| ery IDs <xref target="RFC1035"/>.<!-- | ng specifications. While it is generally trivial to identify an algorithm that c | |||
| Network protocols employ a variety of transient numeric identifiers for differen | an satisfy the interoperability requirements of a given transient numeric identi | |||
| t protocol entities, ranging from DNS Transaction IDs (TxIDs) to transport proto | fier, empirical evidence exists that doing so without negatively affecting the s | |||
| col ephemeral ports (e.g. TCP ephemeral ports) or IPv6 Interface Identifiers (II | ecurity and/or privacy properties of the aforementioned protocols is prone to er | |||
| Ds).--> These identifiers usually have specific interoperability requirements (e | ror <xref target="RFC9414" format="default"/>.</t> | |||
| .g. uniqueness during a specified period of time) that must be satisfied such th | <t>For example, implementations have been subject to security and/or priva | |||
| at they do not result in negative interoperability implications, and an associat | cy issues resulting from:</t> | |||
| ed failure severity when such requirements are not met, ranging from soft to har | <ul spacing="normal"> | |||
| d failures. | <li>predictable IPv4 or IPv6 Identification values (e.g., see <xref targ | |||
| </t> | et="Sanfilippo1998a" format="default"/>, <xref target="RFC6274" format="default" | |||
| />, and <xref target="RFC7739" format="default"/>),</li> | ||||
| <t>For more than 30 years, a large number of implementations of IETF protocols h | <li>predictable IPv6 IIDs (e.g., see <xref target="RFC7217" format="defa | |||
| ave been subject to a variety of attacks, with effects ranging from Denial of Se | ult"/>, <xref target="RFC7707" format="default"/>, and <xref target="RFC7721" fo | |||
| rvice (DoS) or data injection, to information leakages that could be exploited f | rmat="default"/>),</li> | |||
| or pervasive monitoring <xref target="RFC7258"/>. The root cause of these issues | <li>predictable transport-protocol ephemeral port numbers (e.g., see <xr | |||
| has been, in many cases, the poor selection of transient numeric identifiers in | ef target="RFC6056" format="default"/> and <xref target="Silbersack2005" format= | |||
| such protocols, usually as a result of insufficient or misleading specification | "default"/>),</li> | |||
| s. While it is generally trivial to identify an algorithm that can satisfy the i | <li>predictable TCP Initial Sequence Numbers (ISNs) (e.g., see <xref tar | |||
| nteroperability requirements of a given transient numeric identifier, empirical | get="Morris1985" format="default"/>, <xref target="Bellovin1989" format="default | |||
| evidence exists that doing so without negatively affecting the security and/or p | "/>, and <xref target="RFC6528" format="default"/>),</li> | |||
| rivacy properties of the aforementioned protocols is prone to error <xref target | <li>predictable initial timestamps in TCP timestamps options (e.g., see | |||
| ="I-D.irtf-pearg-numeric-ids-history"/>.</t> | <xref target="TCPT-uptime" format="default"/> and <xref target="RFC7323" format= | |||
| "default"/>), and</li> | ||||
| <t>For example, implementations have been subject to security and/or privacy iss | <li>predictable DNS IDs (see, e.g., <xref target="Schuba1993" format="de | |||
| ues resulting from: | fault"/> and <xref target="Klein2007" format="default"/>).</li> | |||
| </ul> | ||||
| <list style="symbols"> | <t> | |||
| <t>Predictable IPv4 or IPv6 Fragment Identifiers (see e.g. <xref target="Sanfili | ||||
| ppo1998a"/>, <xref target="RFC6274"/>, and <xref target="RFC7739"/>)</t> | ||||
| <t>Predictable IPv6 IIDs (see e.g. <xref target="RFC7721"/>, <xref target="RFC77 | ||||
| 07"/>, and <xref target="RFC7217"/>)</t> | ||||
| <t>Predictable transport protocol ephemeral port numbers (see e.g. <xref target= | ||||
| "RFC6056"/> and <xref target="Silbersack2005"/>)</t> | ||||
| <t>Predictable TCP Initial Sequence Numbers (ISNs) (see e.g. <xref target="Morri | ||||
| s1985"/>, <xref target="Bellovin1989"/>, and <xref target="RFC6528"/>)</t> | ||||
| <t>Predictable initial timestamps in TCP timestamps Options (see e.g. <xref targ | ||||
| et="TCPT-uptime"/> and <xref target="RFC7323"/>)</t> | ||||
| <t>Predictable DNS Query IDs (see e.g. <xref target="Schuba1993"/> and <xref tar | ||||
| get="Klein2007"/>)</t> | ||||
| </list> | ||||
| Recent history indicates that when new protocols are standardized or new protoco | ||||
| l implementations are produced, the security and privacy properties of the assoc | ||||
| iated transient numeric identifiers tend to be overlooked, and inappropriate alg | ||||
| orithms to generate transient numeric identifiers are either suggested in the sp | ||||
| ecifications or selected by implementers. As a result, it should be evident that | ||||
| advice in this area is warranted. | ||||
| </t> | ||||
| <t>We note that the use of cryptographic techniques may readily mitigate some of | ||||
| the issues arising from predictable transient numeric identifiers. For example, | ||||
| cryptographic integrity and authentication can readily mitigate data injection | ||||
| attacks even in the presence of predictable transient numeric identifiers (such | ||||
| as "sequence numbers"). However, use of flawed algorithms (such as global counte | ||||
| rs) for generating transient numeric identifiers could still result in informati | ||||
| on leakages even when cryptographic techniques are employed. | ||||
| </t> | ||||
| <t>This document contains a non-exhaustive survey of transient numeric identifie | ||||
| rs employed in various IETF protocols, and aims to categorize such identifiers b | ||||
| ased on their interoperability requirements, and the associated failure severity | ||||
| when such requirements are not met. Subsequently, it provides advice on possibl | ||||
| e algorithms that could be employed to satisfy the interoperability requirements | ||||
| of each category, while minimizing negative security and privacy implications. | ||||
| Finally, it analyzes several algorithms that have been employed in real implemen | ||||
| tations to meet such requirements, and analyzes their security and privacy prope | ||||
| rties. | ||||
| </t> | ||||
| <t>This document represents the consensus of the Privacy Enhancement and Assessm | ||||
| ent Research Group (PEARG).</t> | ||||
| <!-- | ||||
| [fgont] Quite esto, ya que hay mas secciones, y es medio en vano describi que ha | ||||
| ce cada seccion | ||||
| <t> <xref target="categorizing"/> categorizes identifiers in terms of their inte | ||||
| roperability requirements and failure modes, such that possible algorithms for t | ||||
| hem can be discussed and analyzed. | ||||
| <xref target="timeline"/> provides a non-exhaustive timeline regarding vulnera | ||||
| bility disclosures related to predictable identifiers. | ||||
| </t>--> | ||||
| </section> | ||||
| <section title="Terminology" anchor="terminology"> | ||||
| <t> | ||||
| <list style="hanging"> | ||||
| <t hangText="Transient Numeric Identifier:"> | ||||
| <vspace blankLines="0" />A data object in a protocol specification that can be u | ||||
| sed to definitely distinguish a protocol object (a datagram, network interface, | ||||
| transport protocol endpoint, session, etc.) from all other objects of the same t | ||||
| ype, in a given context. Transient numeric identifiers are usually defined as a | ||||
| series of bits, and represented using integer values. These identifiers are typi | ||||
| cally dynamically selected, as opposed to statically-assigned numeric identifier | ||||
| s (see e.g. <xref target="IANA-PROT"/>). We note that different transient numeri | ||||
| c identifiers may have additional requirements or properties depending on their | ||||
| specific use in a protocol. We use the term "transient numeric identifier" (or s | ||||
| imply "numeric identifier" or "identifier" as short forms) as a generic term to | ||||
| refer to any data object in a protocol specification that satisfies the identifi | ||||
| cation property stated above. | ||||
| </t> | ||||
| <t hangText="Failure Severity:"> | ||||
| <vspace blankLines="0" />The interoperability consequences of a failure to compl | ||||
| y with the interoperability requirements of a given identifier. Severity conside | ||||
| rs the worst potential consequence of a failure, determined by the system damage | ||||
| and/or time lost to repair the failure. In this document we define two types of | ||||
| failure severity: "soft failure" and "hard failure". | ||||
| </t> | ||||
| <t hangText="Soft Failure:"> | ||||
| <vspace blankLines="0" />A soft failure is a recoverable condition in which a pr | ||||
| otocol does not operate in the prescribed manner but normal operation can be res | ||||
| umed automatically in a short period of time. For example, a simple packet-loss | ||||
| event that is subsequently recovered with a packet-retransmission can be conside | ||||
| red a soft failure. | ||||
| </t> | ||||
| <t hangText="Hard Failure:"> | ||||
| <vspace blankLines="0" />A hard failure is a non-recoverable condition in which | ||||
| a protocol does not operate in the prescribed manner or it operates with excessi | ||||
| ve degradation of service. For example, an established TCP connection that is ab | ||||
| orted due to an error condition constitutes, from the point of view of the trans | ||||
| port protocol, a hard failure, since it enters a state from which normal operati | ||||
| on cannot be resumed. | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <!-- | ||||
| <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' /> wh | ||||
| en, and only when, they | ||||
| appear in all capitals, as shown here. | ||||
| </t> | ||||
| </section> | ||||
| <section title="Threat Model" anchor="threat-model"> | Recent history indicates that, when new protocols are standardized or new protoc | |||
| <!-- | ol implementations are produced, the security and privacy properties of the asso | |||
| <t>Throughout this document, we assume an attacker does not have physical or log | ciated transient numeric identifiers tend to be overlooked, and inappropriate al | |||
| ical access to the system(s) being attacked, and cannot necessarily observe all | gorithms to generate such identifiers are either suggested in the specifications | |||
| the packets being transferred between the sender and the receiver(s) of the | or selected by implementers. As a result, advice in this area is warranted. | |||
| target protocol, but may be able to observe some of them. However, we assume the | ||||
| attacker can send any traffic to the target device(s), to e.g. sample transient | ||||
| numeric identifiers employed by such device(s). | ||||
| </t> | </t> | |||
| <t>We note that the use of cryptographic techniques may readily mitigate s | ||||
| <t>Throughout this document, we do not consider on-path attacks. That is, we ass | ome of the issues arising from predictable transient numeric identifiers. For ex | |||
| ume an attacker does not have physical or logical access to the system(s) being | ample, cryptographic authentication can readily mitigate data injection attacks | |||
| attacked, and that the attacker can only observe traffic explicitly directed to | even in the presence of predictable transient numeric identifiers (such as "sequ | |||
| the attacker. Similarly, an attacker cannot observe traffic transferred between | ence numbers"). However, use of flawed algorithms (such as global counters) for | |||
| a sender and the receiver(s) of a target protocol, but may be able to interact w | generating transient numeric identifiers could still result in information leaka | |||
| ith any of these entities, including by e.g. sending traffic to them to sample t | ges even when cryptographic techniques are employed. | |||
| ransient numeric identifiers employed by the target systems when communicating w | ||||
| ith the attacker. | ||||
| </t> | </t> | |||
| <t>For example, when analyzing vulnerabilities associated with TCP Initial Seque | <t>This document contains a non-exhaustive survey of transient numeric ide | |||
| nce Numbers (ISNs), we consider the attacker is unable to capture network traffi | ntifiers employed in various IETF protocols and aims to categorize such identifi | |||
| c corresponding to a TCP connection between two other hosts. However, we conside | ers based on their interoperability requirements and the associated failure seve | |||
| r the attacker is able to communicate with any of these hosts (e.g., establish a | rity when such requirements are not met. Subsequently, it provides advice on pos | |||
| TCP connection with any of them), to e.g. sample the TCP ISNs employed by these | sible algorithms that could be employed to satisfy the interoperability requirem | |||
| systems when communicating with the attacker.</t> | ents of each category while minimizing negative security and privacy implication | |||
| s. Finally, it analyzes several algorithms that have been employed in real imple | ||||
| <t>Similarly, when considering host-tracking attacks based on IPv6 interface ide | mentations to meet such requirements and analyzes their security and privacy pro | |||
| ntifiers, we consider an attacker may learn the IPv6 address employed by a victi | perties. | |||
| m node if e.g. the address becomes exposed as a result of the victim node commun | ||||
| icating with an attacker-operated server. Subsequently, an attacker may perform | ||||
| host-tracking by probing a set of target addresses composed by a set of target p | ||||
| refixes and the IPv6 interface identifier originally learned by the attacker. Al | ||||
| ternatively, an attacker may perform host tracking if e.g. the victim node commu | ||||
| nicates with an attacker-operated server as it moves from one location to anothe | ||||
| r, those exposing its configured addresses. We note that none of these scenarios | ||||
| requires the attacker observe traffic not explicitly directed to the attacker. | ||||
| </t> | </t> | |||
| <t>This document represents the consensus of the Privacy Enhancements and Assessments Research Group (PEARG).</t> | ||||
| </section> | </section> | |||
| <section anchor="terminology" numbered="true" toc="default"> | ||||
| <section title="Issues with the Specification of Transient Numeric Identifiers" | <name>Terminology</name> | |||
| anchor="issues"> | <dl newline="true" spacing="normal"> | |||
| <t>While assessing protocol specifications regarding the use of transient numeri | <dt>Transient Numeric Identifier:</dt> | |||
| c identifiers, we have found that most of the issues discussed in this document | <dd>A data object in a protocol specification that can be used to defini | |||
| arise as a result of one of the following conditions: | tely distinguish a protocol object (a datagram, network interface, transport-pro | |||
| tocol endpoint, session, etc.) from all other objects of the same type, in a giv | ||||
| <list style="symbols"> | en context. Transient numeric identifiers are usually defined as a series of bit | |||
| <t>Protocol specifications that under-specify the requirements for their transie | s and represented using integer values. These identifiers are typically dynamica | |||
| nt numeric identifiers</t> | lly selected, as opposed to statically assigned numeric identifiers (see, e.g., | |||
| <t>Protocol specifications that over-specify their transient numeric identifiers | <xref target="IANA-PROT" format="default"/>). We note that different transient n | |||
| </t> | umeric identifiers may have additional requirements or properties depending on t | |||
| <t>Protocol implementations that simply fail to comply with the specified requir | heir specific use in a protocol. We use the term "transient numeric identifier" | |||
| ements</t> | (or simply "numeric identifier" or "identifier" as short forms) as a generic ter | |||
| </list> | m to refer to any data object in a protocol specification that satisfies the ide | |||
| </t> | ntification property stated above. | |||
| </dd> | ||||
| <t>A number of protocol specifications (too many of them) have simply overlooked | <dt>Failure Severity:</dt> | |||
| the security and privacy implications of transient numeric identifiers <xref ta | <dd>The interoperability consequences of a failure to comply with the in | |||
| rget="I-D.irtf-pearg-numeric-ids-history"/>. Examples of them are the specificat | teroperability requirements of a given identifier. Severity considers the worst | |||
| ion of TCP ephemeral ports in <xref target="RFC0793"/>, the specification of TCP | potential consequence of a failure, determined by the system damage and/or time | |||
| sequence numbers in <xref target="RFC0793"/>, or the specification of the DNS Q | lost to repair the failure. In this document, we define two types of failure sev | |||
| uery ID in <xref target="RFC1035"/>.</t> | erity: "soft failure" and "hard failure". | |||
| </dd> | ||||
| <t>On the other hand, there are a number of protocol specifications that over-sp | <dt>Soft Failure:</dt> | |||
| ecify some of their associated transient numeric identifiers. For example, <xref | <dd>A recoverable condition in which a protocol does not operate in the | |||
| target="RFC4291"/> essentially overloads the semantics of IPv6 Interface Identi | prescribed manner but normal operation can be resumed automatically in a short p | |||
| fiers (IIDs) by embedding link-layer addresses in the IPv6 IIDs, when the intero | eriod of time. For example, a simple packet-loss event that is subsequently reco | |||
| perability requirement of uniqueness could be achieved in other ways that do not | vered with a packet retransmission can be considered a soft failure. | |||
| result in negative security and privacy implications <xref target="RFC7721"/>. | </dd> | |||
| Similarly, <xref target="RFC2460"/> suggested the use of a global counter for th | <dt>Hard Failure:</dt> | |||
| e generation of Fragment Identification values, when the interoperability proper | <dd>A non-recoverable condition in which a protocol does not operate in | |||
| ties of uniqueness per {IPv6 Source Address, IPv6 Destination Address} could be | the prescribed manner or it operates with excessive degradation of service. For | |||
| achieved with other algorithms that do not result in negative security and priva | example, an established TCP connection that is aborted due to an error condition | |||
| cy implications <xref target="RFC7739"/>.</t> | constitutes, from the point of view of the transport protocol, a hard failure, | |||
| since it enters a state from which normal operation cannot be resumed. | ||||
| <t>Finally, there are protocol implementations that simply fail to comply with e | </dd> | |||
| xisting protocol specifications. For example, some popular operating systems (no | </dl> | |||
| tably Microsoft Windows) still fail to implement transport protocol ephemeral po | ||||
| rt randomization, as recommended in <xref target="RFC6056"/>.</t> | ||||
| </section> | </section> | |||
| <section anchor="threat-model" numbered="true" toc="default"> | ||||
| <name>Threat Model</name> | ||||
| <section title="Protocol Failure Severity" anchor="failure-severity"> | <t>Throughout this document, we do not consider on-path attacks. That is, we ass | |||
| <t><xref target="terminology"/> defines the concept of "Failure Severity", along | ume the attacker does not have physical or logical access to the system(s) being | |||
| with two types of failure severities that we employ throughout this document: s | attacked and that the attacker can only observe traffic explicitly directed to | |||
| oft and hard.</t> | the attacker. Similarly, an attacker cannot observe traffic transferred between | |||
| the sender and the receiver(s) of a target protocol but may be able to interact | ||||
| <t>Our analysis of the severity of a failure is performed from the point of view | with any of these entities, including by, e.g., sending any traffic to them to s | |||
| of the protocol in question. However, the corresponding severity on the upper p | ample transient numeric identifiers employed by the target hosts when communicat | |||
| rotocol (or application) might not be the same as that of the protocol in questi | ing with the attacker. | |||
| on. For example, a TCP connection that is aborted might or might not result in a | ||||
| hard failure of the upper application: if the upper application can establish a | ||||
| new TCP connection without any impact on the application, a hard failure at the | ||||
| TCP protocol may have no severity at the application level. On the other hand, | ||||
| if a hard failure of a TCP connection results in excessive degradation of servic | ||||
| e at the application layer, it will also result in a hard failure at the applica | ||||
| tion. | ||||
| </t> | </t> | |||
| </section> | ||||
| <section title="Categorizing Transient Numeric Identifiers" anchor="categorizing | <t>For example, when analyzing vulnerabilities associated with TCP Initial | |||
| "> | Sequence Numbers (ISNs), we consider the attacker is unable to capture network | |||
| <t>This section includes a non-exhaustive survey of transient numeric identifier | traffic corresponding to a TCP connection between two other hosts. However, we c | |||
| s, which are representative of all the possible combinations of interoperability | onsider the attacker is able to communicate with any of these hosts (e.g., estab | |||
| requirements and failure severities found in popular protocols from different l | lish a TCP connection with any of them) to, e.g., sample the TCP ISNs employed b | |||
| ayers. Additionally, it proposes a number of categories that can accommodate the | y these hosts when communicating with the attacker.</t> | |||
| se identifiers based on their interoperability requirements and their associated | <t>Similarly, when considering host-tracking attacks based on IPv6 Interfa | |||
| failure severity (soft or hard). | ce Identifiers, we consider an attacker may learn the IPv6 address employed by a | |||
| victim host if, e.g., the address becomes exposed as a result of the victim hos | ||||
| <list style="hanging"> | t communicating with an attacker-operated server. Subsequently, an attacker may | |||
| <t hangText="NOTE:"> | perform host-tracking by probing a set of target addresses composed by a set of | |||
| <vspace blankLines="0"/> | target prefixes and the IPv6 Interface Identifier originally learned by the atta | |||
| All other transient numeric identifiers that were analyzed as part of this effor | cker. | |||
| t could be accommodated into one of the existing categories from <xref target="s | Alternatively, an attacker may perform host-tracking if, e.g., the victim | |||
| urvey-table"/>. | host communicates with an attacker-operated server as it moves from one location | |||
| </t> | to another, thereby exposing its configured addresses. We note that none of the | |||
| </list> | se scenarios require the attacker observe traffic not explicitly directed to the | |||
| attacker. | ||||
| </t> | </t> | |||
| </section> | ||||
| <section anchor="issues" numbered="true" toc="default"> | ||||
| <name>Issues with the Specification of Transient Numeric Identifiers</name | ||||
| > | ||||
| <t>While assessing IETF protocol specifications regarding the use of trans | ||||
| ient numeric identifiers, we have found that most of the issues discussed in thi | ||||
| s document arise as a result of one of the following conditions: | ||||
| <!-- [fgont] Basado en el contenido de la seccion anterior, tal vez esta tabla p | ||||
| odria contener una columna adicional que indique si el problema es "under-specif | ||||
| ication", "over-specification", o "implementation-flaw" ? | ||||
| No se si aportaria mucho en terminos de categorizar, aunque si tal vez en el sen | ||||
| tido de servir de "sample" de cual es el rigen de los problemas. | ||||
| Ideas? | ||||
| <texttable title="Survey of Transient Numeric Identifiers" style="all" ancho | ||||
| r="survey-table"> | ||||
| <ttcol align="center">Identifier</ttcol> <ttcol align="center">Interoper | ||||
| ability Requirements</ttcol> <ttcol align="center">Failure Severity</ttcol> | ||||
| <c>IPv6 Frag ID</c> <c>Uniqueness (for IP address pair)</c> | ||||
| <c>Soft/Hard (1)</c> | ||||
| <c>IPv6 IID</c> <c>Uniqueness (and stable within IPv6 pre | ||||
| fix) (2)</c> <c>Soft (3)</c> | ||||
| <c>TCP ISN</c> <c>Monotonically-increasing (4)</c> | ||||
| <c>Hard (4)</c> | ||||
| <c>TCP initial timestamp</c> <c>Monotonically-increasing (5)</ | ||||
| c> <c>Hard (5)</c> | ||||
| <c>TCP eph. port</c><c>Uniqueness (for connection ID)</c> | ||||
| <c>Hard</c> | ||||
| <c>IPv6 Flow Label</c> <c>Uniqueness</c> | ||||
| <c>None (6)</c> | ||||
| <c>DNS Query ID</c> <c>Uniqueness</c> | ||||
| <c>None (7)</c> | ||||
| </texttable> | ||||
| <t>NOTE: | ||||
| <list style="hanging"> | ||||
| <t hangText="(1)"> | ||||
| <vspace blankLines="0" />While a single collision of Fragment ID values would si | ||||
| mply lead to a single packet drop (and hence a "soft" failure), repeated collisi | ||||
| ons at high data rates might result in self-propagating collisions of Fragment I | ||||
| Ds, thus possibly leading to a hard failure <xref target="RFC4963"/>.</t> | ||||
| <t hangText="(2)"> | ||||
| <vspace blankLines="0" />While the interoperability requirements are simply that | ||||
| the Interface ID results in a unique IPv6 address, for operational reasons it i | ||||
| s typically desirable that the resulting IPv6 address (and hence the correspondi | ||||
| ng Interface ID) be stable within each network <xref target="RFC7217"/> <xref ta | ||||
| rget="RFC8064"/>.</t> | ||||
| <t hangText="(3)"> | ||||
| <vspace blankLines="0" />While IPv6 Interface IDs must result in unique IPv6 add | ||||
| resses, IPv6 Duplicate Address Detection (DAD) <xref target="RFC4862"/> allows f | ||||
| or the detection of duplicate addresses, and hence such Interface ID collisions | ||||
| can be recovered.</t> | ||||
| <t hangText="(4)"> | ||||
| <vspace blankLines="0" />In theory, there are no interoperability requirements f | ||||
| or TCP Initial Sequence Numbers (ISNs), since the TIME-WAIT state and TCP's "qui | ||||
| et time" concept take care of old segments from previous incarnations of a conne | ||||
| ction. However, a widespread optimization allows for a new incarnation of a prev | ||||
| ious connection to be created if the ISN of the incoming SYN is larger than the | ||||
| last sequence number seen in that direction for the previous incarnation of the | ||||
| connection. Thus, monotonically-increasing TCP ISNs allow for such optimization | ||||
| to work as expected <xref target="RFC6528"/>, and can help avoid connection-esta | ||||
| blishment failures.</t> | ||||
| <t hangText="(5)"> | ||||
| <vspace blankLines="0" />Strictly speaking, there are no interoperability requir | ||||
| ements for the *initial* TCP timestamp employed by a TCP instance (i.e., the TS | ||||
| Value (TSval) in a segment with the SYN bit set). However, some TCP implementati | ||||
| ons allow a new incarnation of a previous connection to be created if the TSval | ||||
| of the incoming SYN is larger than the last TSval seen in that direction for the | ||||
| previous incarnation of the connection (please see <xref target="RFC6191"/>). T | ||||
| hus, monotonically-increasing TCP initial timestamps (across connections to the | ||||
| same endpoint) allow for such optimization to work as expected <xref target="RFC | ||||
| 6191"/>, and can help avoid connection-establishment failures.</t> | ||||
| <t hangText="(6)"> | ||||
| <vspace blankLines="0" />The IPv6 Flow Label <xref target="RFC6437"/>, along wit | ||||
| h the Source and Destination IPv6 addresses, is typically employed for load shar | ||||
| ing <xref target="RFC7098"/>. Reuse of a Flow Label value for the same set {Sour | ||||
| ce Address, Destination Address} would typically cause both flows to be multiple | ||||
| xed onto the same link. However, as long as this does not occur deterministicall | ||||
| y, it will not result in any negative implications.</t> | ||||
| <t hangText="(7)"> | ||||
| <vspace blankLines="0" />DNS Query IDs are employed, together with the Source Ad | ||||
| dress, Destination Address, Source Port, and Destination Port, to match DNS requ | ||||
| ests and responses. However, since an implementation knows which DNS requests we | ||||
| re sent for that set of {Source Address, Destination Address, Source Port, and D | ||||
| estination Port, Query ID}, a collision of Query IDs would result, if anything, | ||||
| in a small performance penalty (the response would nevertheless be discarded whe | ||||
| n it is found that it does not answer the query sent in the corresponding DNS qu | ||||
| ery).</t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <ul spacing="normal"> | ||||
| <li>protocol specifications that under specify their transient numeric i | ||||
| dentifiers</li> | ||||
| <li>protocol specifications that over specify their transient numeric id | ||||
| entifiers</li> | ||||
| <li>protocol implementations that simply fail to comply with the specifi | ||||
| ed requirements</li> | ||||
| </ul> | ||||
| <t>A number of IETF protocol specifications under specified their transien | ||||
| t numeric identifiers, thus leading to implementations that were vulnerable to n | ||||
| umerous off-path | ||||
| attacks. Examples of them are the specification of TCP local ports in <xref t | ||||
| arget="RFC0793" format="default"/> or the specification of the DNS ID in <xref t | ||||
| arget="RFC1035" format="default"/>.</t> | ||||
| <t>Based on the survey above, we can categorize identifiers as follows:</t> | <aside><t>NOTE: The TCP local port in an active OPEN request is commonly known a s the "ephemeral port" of the corresponding TCP connection <xref target="RFC6056 " format="default"/>.</t></aside> | |||
| <texttable title="Identifier Categories" style="all" anchor="cat-table"> | <t>On the other hand, there are a number of IETF protocol specifications t | |||
| <ttcol align="center">Cat #</ttcol><ttcol align="center">Category</ttcol | hat over specify some of their associated transient numeric identifiers. For exa | |||
| ><ttcol align="center">Sample Proto IDs</ttcol> | mple, <xref target="RFC4291" format="default"/> essentially overloads the semant | |||
| <c>1</c><c>Uniqueness (soft failure)</c><c>IPv6 Flow L., DNS Query ID</c> | ics of IPv6 Interface Identifiers (IIDs) by embedding link-layer addresses in th | |||
| <c>2</c><c>Uniqueness (hard failure)</c><c>IPv6 Frag ID, TCP ephemeral po | e IPv6 IIDs when the interoperability requirement of uniqueness could be achieve | |||
| rt</c> | d in other ways that do not result in negative security and privacy implications | |||
| <c>3</c><c>Uniqueness, stable within context (soft failure)</c><c>IPv6 II | <xref target="RFC7721" format="default"/>. Similarly, <xref target="RFC2460" fo | |||
| D</c> | rmat="default"/> suggests the use of a global counter for the generation of Iden | |||
| <c>4</c><c>Uniqueness, monotonically increasing within context (hard fail | tification values when the interoperability requirement of uniqueness per {IPv6 | |||
| ure)</c><c>TCP ISN, TCP initial timestamp</c> | Source Address, IPv6 Destination Address} could be achieved with other algorithm | |||
| </texttable> | s that do not result in negative security and privacy implications <xref target= | |||
| "RFC7739" format="default"/>.</t> | ||||
| <t>Finally, there are protocol implementations that simply fail to comply | ||||
| with existing protocol specifications. For example, some popular operating syste | ||||
| ms still fail to implement transport-protocol ephemeral port randomization, as r | ||||
| ecommended in <xref target="RFC6056" format="default"/>, or TCP Initial Sequence | ||||
| Number randomization, as recommended in <xref target="RFC9293"/>.</t> | ||||
| <t> | </section> | |||
| We note that Category #4 could be considered a generalized case of category #3, | <section anchor="failure-severity" numbered="true" toc="default"> | |||
| in which a monotonically increasing element is added to a stable (within context | <name>Protocol Failure Severity</name> | |||
| ) element, such that the resulting identifiers are monotonically increasing with | <t><xref target="terminology" format="default"/> defines the concept of "f | |||
| in a specified context. That is, the same algorithm could be employed for both # | ailure severity", along with two types of failure severities that we employ thro | |||
| 3 and #4, given appropriate parameters. | ughout this document: soft and hard.</t> | |||
| <t>Our analysis of the severity of a failure is performed from the point o | ||||
| f view of the protocol in question. However, the corresponding severity on the u | ||||
| pper protocol (or application) might not be the same as that of the protocol in | ||||
| question. For example, a TCP connection that is aborted might or might not resul | ||||
| t in a hard failure of the upper application, i.e., if the upper application can | ||||
| establish a new TCP connection without any impact on the application, a hard fa | ||||
| ilure at the TCP protocol may have no severity at the application layer. On the | ||||
| other hand, if a hard failure of a TCP connection results in excessive degradati | ||||
| on of service at the application layer, it will also result in a hard failure at | ||||
| the application. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="categorizing" numbered="true" toc="default"> | ||||
| <section title="Common Algorithms for Transient Numeric Identifier Generation" a | <name>Categorizing Transient Numeric Identifiers</name> | |||
| nchor="common-algorithms"> | <t>This section includes a non-exhaustive survey of transient numeric iden | |||
| <t>The following subsections describe some sample algorithms that can be employe | tifiers, which are representative of all the possible combinations of interopera | |||
| d for generating transient numeric identifiers for each of the categories above, | bility requirements and failure severities found in popular protocols of differe | |||
| while mitigating the vulnerabilities analyzed in <xref target="vulns"/> of this | nt layers. Additionally, it proposes a number of categories that can accommodate | |||
| document.</t> | these identifiers based on their interoperability requirements and their associ | |||
| ated failure severity (soft or hard). | ||||
| <t>All of the variables employed in the algorithms of the following subsections | </t> | |||
| are of "unsigned integer" type, except for the "retry" variable, that is of (sig | <aside><t>NOTE: All other transient numeric identifiers that were analyz | |||
| ned) "integer" type.</t> | ed as part of this effort could be accommodated into one of the existing categor | |||
| ies from <xref target="survey-table" format="default"/>. | ||||
| <section title="Category #1: Uniqueness (soft failure)" anchor="cat-1-alg"> | </t></aside> | |||
| <t>The requirement of uniqueness with a soft failure severity can be complied wi | <table anchor="survey-table" align="center"> | |||
| th a Pseudo-Random Number Generator (PRNG). | <name>Survey of Transient Numeric Identifiers</name> | |||
| <list style="hanging"> | <thead> | |||
| <t hangText="NOTE:"> | <tr> | |||
| <vspace blankLines="0"/> | <th align="center">Identifier</th> | |||
| Please see <xref target="RFC4086"/> regarding randomness requirements for securi | <th align="center">Interoperability Requirements</th> | |||
| ty.</t> | <th align="center">Failure Severity</th> | |||
| </list> | </tr> | |||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="center">IPv6 ID</td> | ||||
| <td align="center">Uniqueness (for IPv6 address pair)</td> | ||||
| <td align="center">Soft/Hard (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">IPv6 IID</td> | ||||
| <td align="center">Uniqueness (and stable within IPv6 prefix) (2)</t | ||||
| d> | ||||
| <td align="center">Soft (3)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">TCP ISN</td> | ||||
| <td align="center">Monotonically increasing (4)</td> | ||||
| <td align="center">Hard (4)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">TCP initial timestamp</td> | ||||
| <td align="center">Monotonically increasing (5)</td> | ||||
| <td align="center">Hard (5)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">TCP ephemeral port</td> | ||||
| <td align="center">Uniqueness (for connection ID)</td> | ||||
| <td align="center">Hard</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">IPv6 Flow Label</td> | ||||
| <td align="center">Uniqueness</td> | ||||
| <td align="center">None (6)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">DNS ID</td> | ||||
| <td align="center">Uniqueness</td> | ||||
| <td align="center">None (7)</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>NOTE:</t> | ||||
| <ol type="(%d)" spacing="normal"> | ||||
| <li>While a single collision of IPv6 Identification (ID) values would si | ||||
| mply lead to a single packet drop (and hence, a "soft" failure), repeated collis | ||||
| ions at high data rates might result in self-propagating collisions of IPv6 IDs, | ||||
| thus possibly leading to a hard failure <xref target="RFC4963" format="default" | ||||
| />.</li> | ||||
| <li>While the interoperability requirements are simply that the Interfac | ||||
| e Identifier results in a unique IPv6 address, for operational reasons, it is ty | ||||
| pically desirable that the resulting IPv6 address (and hence, the corresponding | ||||
| Interface Identifier) be stable within each network <xref target="RFC7217" forma | ||||
| t="default"/> <xref target="RFC8064" format="default"/>.</li> | ||||
| <li>While IPv6 Interface Identifiers must result in unique IPv6 addresse | ||||
| s, IPv6 Duplicate Address Detection (DAD) <xref target="RFC4862" format="default | ||||
| "/> allows for the detection of duplicate addresses, and hence, such Interface I | ||||
| dentifier collisions can be recovered.</li> | ||||
| <li>In theory, there are no interoperability requirements for TCP Initia | ||||
| l Sequence Numbers (ISNs), since the TIME-WAIT state and TCP's "quiet time" conc | ||||
| ept take care of old segments from previous incarnations of a connection. Howeve | ||||
| r, a widespread optimization allows for a new incarnation of a previous connecti | ||||
| on to be created if the ISN of the incoming SYN is larger than the last sequence | ||||
| number seen in that direction for the previous incarnation of the connection. T | ||||
| hus, monotonically increasing TCP ISNs allow for such optimization to work as ex | ||||
| pected <xref target="RFC6528" format="default"/> and can help avoid connection-e | ||||
| stablishment failures.</li> | ||||
| <li>Strictly speaking, there are no interoperability requirements for th | ||||
| e <strong>initial</strong> TCP timestamp employed by a TCP instance (i.e., the T | ||||
| S Value (TSval) in a segment with the SYN bit set). However, some TCP implementa | ||||
| tions allow a new incarnation of a previous connection to be created if the TSva | ||||
| l of the incoming SYN is larger than the last TSval seen in that direction for t | ||||
| he previous incarnation of the connection (please see <xref target="RFC6191" for | ||||
| mat="default"/>). Thus, monotonically increasing TCP initial timestamps (across | ||||
| connections to the same endpoint) allow for such optimization to work as expecte | ||||
| d <xref target="RFC6191" format="default"/> and can help avoid connection-establ | ||||
| ishment failures.</li> | ||||
| <li>The IPv6 Flow Label <xref target="RFC6437" format="default"/>, along | ||||
| with the IPv6 Source Address and the IPv6 Destination Address, is typically emp | ||||
| loyed for load sharing <xref target="RFC7098" format="default"/>. | ||||
| Reuse of a Flow Label value for the same set {Source Address, Destination Addres | ||||
| s} would typically cause both flows to be multiplexed onto the same link. Howeve | ||||
| r, as long as this does not occur deterministically, it will not result in any n | ||||
| egative implications.</li> | ||||
| <li>DNS IDs are employed, together with the IP Source Address, the IP De | ||||
| stination Address, the transport-protocol Source Port, and the transport-protoco | ||||
| l Destination Port, to match DNS requests and responses. However, since an imple | ||||
| mentation knows which DNS requests were sent for that set of {IP Source Address, | ||||
| IP Destination Address, transport-protocol Source Port, transport-protocol Dest | ||||
| ination Port, DNS ID}, a collision of DNS IDs would result, if anything, in a sm | ||||
| all performance penalty (the response would nevertheless be discarded when it is | ||||
| found that it does not answer the query sent in the corresponding DNS query).</ | ||||
| li> | ||||
| </ol> | ||||
| <t>Based on the survey above, we can categorize identifiers as follows:</t | ||||
| > | ||||
| <table anchor="cat-table" align="center"> | ||||
| <name>Identifier Categories</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="center">Cat #</th> | ||||
| <th align="center">Category</th> | ||||
| <th align="center">Sample Numeric IDs</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="center">1</td> | ||||
| <td align="center">Uniqueness (soft failure)</td> | ||||
| <td align="center">IPv6 Flow L., DNS ID</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">2</td> | ||||
| <td align="center">Uniqueness (hard failure)</td> | ||||
| <td align="center">IPv6 ID, TCP ephemeral port</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">3</td> | ||||
| <td align="center">Uniqueness, stable within context (soft failure)< | ||||
| /td> | ||||
| <td align="center">IPv6 IID</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">4</td> | ||||
| <td align="center">Uniqueness, monotonically increasing within conte | ||||
| xt (hard failure)</td> | ||||
| <td align="center">TCP ISN, TCP initial timestamp</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t> | ||||
| We note that Category #4 could be considered a generalized case of Category #3, | ||||
| in which a monotonically increasing element is added to a stable (within context | ||||
| ) element, such that the resulting identifiers are monotonically increasing with | ||||
| in a specified context. That is, the same algorithm could be employed for both # | ||||
| 3 and #4, given appropriate parameters. | ||||
| </t> | </t> | |||
| </section> | ||||
| <t>While most systems provide access to a PRNG, many of such PRNG implementation | <section anchor="common-algorithms" numbered="true" toc="default"> | |||
| s are not cryptographically secure, and therefore might be statistically biased | <name>Common Algorithms for Transient Numeric Identifier Generation</name> | |||
| or subject to adversarial influence. For example, ISO C <xref target="C11"/> ran | <t>The following subsections describe some sample algorithms that can be e | |||
| d(3) implementations are not cryptographically secure. | mployed for generating transient numeric identifiers for each of the categories | |||
| <list style="hanging"> | above while mitigating the vulnerabilities analyzed in <xref target="vulns" form | |||
| <t hangText="NOTE:"> | at="default"/> of this document.</t> | |||
| <vspace blankLines="0"/> | <t>All of the variables employed in the algorithms of the following subsec | |||
| Section 7.1 ("Uniform Deviates") of <xref target="Press1992"/> discusses the und | tions are of "unsigned integer" type, except for the "retry" variable, which is | |||
| erlying issues affecting ISO C <xref target="C11"/> rand(3) implementations. | of (signed) "integer" type.</t> | |||
| <section anchor="cat-1-alg" numbered="true" toc="default"> | ||||
| <name>Category #1: Uniqueness (Soft Failure)</name> | ||||
| <t>The requirement of uniqueness with a soft failure severity can be com | ||||
| plied with a Pseudorandom Number Generator (PRNG). | ||||
| </t> | </t> | |||
| </list> | <aside><t>NOTE: Please see <xref target="RFC4086" format="default"/> r | |||
| egarding randomness requirements for security.</t></aside> | ||||
| <t>While most systems provide access to a PRNG, many of such PRNG implem | ||||
| entations are not cryptographically secure and therefore might be statistically | ||||
| biased or subject to adversarial influence. For example, ISO C <xref target="C11 | ||||
| " format="default"/> rand(3) implementations are not cryptographically secure. | ||||
| </t> | </t> | |||
| <aside><t>NOTE: Section 7.1 ("Uniform Deviates") of <xref target="Pres | ||||
| s1992" format="default"/> discusses the underlying issues affecting ISO C <xref | ||||
| target="C11" format="default"/> rand(3) implementations. | ||||
| </t></aside> | ||||
| <t>On the other hand, a number of systems provide an interface to a Cr | ||||
| yptographically Secure PRNG (CSPRNG) <xref target="RFC4086" format="default"/> < | ||||
| xref target="RFC8937" format="default"/>, which guarantees high entropy, unpredi | ||||
| ctability, and good statistical distribution of the random values generated. Fo | ||||
| r example, GNU/Linux's CSPRNG implementation is available via the getentropy(3) | ||||
| interface <xref target="GETENTROPY" format="default"/>, while OpenBSD's CSPRNG i | ||||
| mplementation is available via the arc4random(3) and arc4random_uniform(3) inter | ||||
| faces <xref target="ARC4RANDOM" format="default"/>. Where available, these CSPRN | ||||
| Gs should be preferred over, e.g., POSIX <xref target="POSIX" format="default"/> | ||||
| random(3) or ISO C <xref target="C11" format="default"/> rand(3) implementation | ||||
| s.</t> | ||||
| <t>In scenarios where a CSPRNG is not readily available to select transi | ||||
| ent numeric identifiers of Category #1, a security and privacy assessment of emp | ||||
| loying a regular PRNG should be performed, supporting the implementation decisio | ||||
| n. | ||||
| <t>On the other hand, a number of systems provide an interface to a Cryptographi | ||||
| cally Secure PRNG (CSPRNG) <xref target="RFC8937"/> <xref target="RFC4086"/>, wh | ||||
| ich guarantees high entropy, unpredictability, and good statistical distribution | ||||
| of the random values generated. For example, GNU/Linux's CSPRNG implementation | ||||
| is available via the getentropy(3) interface <xref target="GETENTROPY"/>, while | ||||
| OpenBSD's CSPRNG implementation is available via the arc4random(3) and arc4rando | ||||
| m_uniform(3) interfaces <xref target="ARC4RANDOM"/>. Where available, these CSPR | ||||
| NGs should be preferred over e.g. POSIX <xref target="POSIX"/> random(3) or ISO | ||||
| C <xref target="C11"/> rand(3) implementations.</t> | ||||
| <t>In scenarios where a CSPRNG is not readily available to select transient nume | ||||
| ric identifiers of Category #1, a security and privacy assessment of employing a | ||||
| regular PRNG should be performed, supporting the implementation decision. | ||||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| <xref target="Aumasson2018"/>, <xref target="Press1992"/>, and <xref target="Knu | ||||
| th1983"/>, discuss theoretical and practical aspects of pseudorandom numbers gen | ||||
| eration, and provide guidance on how to evaluate PRNGs.</t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <aside><t>NOTE: <xref target="Aumasson2018" format="default"/>, <xref | ||||
| <t>We note that since the premise is that collisions of transient numeric identi | target="Press1992" format="default"/>, and <xref target="Knuth1983" format="defa | |||
| fiers of this category only leads to soft failures, in many cases, the algorithm | ult"/> discuss theoretical and practical aspects of pseudorandom number generati | |||
| might not need to check the suitability of a selected identifier (i.e., the sui | on and provide guidance on how to evaluate PRNGs.</t></aside> | |||
| table_id() function, described below, could always return "true").</t> | <t>We note that, since the premise is that collisions of transient numer | |||
| ic identifiers of this category only lead to soft failures, in many cases, the a | ||||
| <t>In scenarios where e.g. simultaneous use of a given numeric ID is undesirable | lgorithm might not need to check the suitability of a selected identifier (i.e., | |||
| and the implementation detects such condition, an implementation may opt to sel | the suitable_id() function, described below, could always return "true").</t> | |||
| ect the next available identifier in the same sequence, or select another random | <t>In scenarios where, e.g., simultaneous use of a given numeric identif | |||
| number. <xref target="simple-randomization"/> is an implementation of the forme | ier is undesirable and an implementation detects such condition, the implementat | |||
| r strategy, while <xref target="simple-randomization2"/> is an implementation of | ion may opt to select the next available identifier in the same sequence or sele | |||
| the later. Typically, the algorithm in <xref target="simple-randomization2"/> r | ct another random number. <xref target="simple-randomization" format="default"/> | |||
| esults in a more uniform distribution of the generated transient numeric identif | is an implementation of the former strategy, while <xref target="simple-randomi | |||
| iers. However, for transient numeric identifiers where an implementation typical | zation2" format="default"/> is an implementation of the latter. Typically, the a | |||
| ly keeps local state about unsuitable/used identifiers, the algorithm in <xref | lgorithm in <xref target="simple-randomization2" format="default"/> results in a | |||
| target="simple-randomization2"/> may require many more iterations than the algor | more uniform distribution of the generated transient numeric identifiers. Howev | |||
| ithm in <xref target="simple-randomization"/> to generate a suitable transient n | er, for transient numeric identifiers where an implementation typically keeps lo | |||
| umeric identifier. This will usually be affected by the current usage ratio of t | cal state about unsuitable/used identifiers, the algorithm in <xref target="simp | |||
| ransient numeric identifiers (i.e., number of numeric identifiers considered sui | le-randomization2" format="default"/> may require many more iterations than the | |||
| table / total number of numeric identifiers) and other parameters. Therefore, in | algorithm in <xref target="simple-randomization" format="default"/> to generate | |||
| such cases many implementations tend to prefer the algorithm in <xref target="s | a suitable transient numeric identifier. This will usually be affected by the cu | |||
| imple-randomization"/> over the algorithm in <xref target="simple-randomization2 | rrent usage ratio of transient numeric identifiers (i.e., the number of numeric | |||
| "/>. | identifiers considered suitable / total number of numeric identifiers) and other | |||
| parameters. Therefore, in such cases, many implementations tend to prefer the a | ||||
| lgorithm in <xref target="simple-randomization" format="default"/> over the algo | ||||
| rithm in <xref target="simple-randomization2" format="default"/>. | ||||
| </t> | </t> | |||
| <section anchor="simple-randomization" numbered="true" toc="default"> | ||||
| <section title="Simple Randomization Algorithm" anchor="simple-randomization"> | <name>Simple Randomization Algorithm</name> | |||
| <sourcecode type="c"><![CDATA[ | ||||
| <t> | ||||
| <figure><artwork> | ||||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| next_id = min_id + (random() % id_range); | next_id = min_id + (random() % id_range); | |||
| retry = id_range; | retry = id_range; | |||
| do { | do { | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| skipping to change at line 315 ¶ | skipping to change at line 287 ¶ | |||
| next_id = min_id; | next_id = min_id; | |||
| } else { | } else { | |||
| next_id++; | next_id++; | |||
| } | } | |||
| retry--; | retry--; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | <t>NOTE:</t> | |||
| <t indent="3">random() is a PRNG that returns a pseudorandom unsigned i | ||||
| </t> | nteger number of appropriate size. Beware that "adapting" the length of the outp | |||
| <!-- FreeBSD/OpenBSD: in_pcb.c, Linux: tcp_ipv4.c(+grsecurity) --> | ut of random() with a modulo operator (e.g., C language's "%") may change the di | |||
| stribution of the PRNG. To preserve a uniform distribution, the rejection sampli | ||||
| <t> | ng technique <xref target="Romailler2020" format="default"/> can be used.</t> | |||
| <list style="hanging"> | <t indent="3">suitable_id() is a function that checks, if possible a | |||
| <t hangText="NOTE:"> | nd desirable, whether a candidate numeric identifier is suitable (e.g., whether | |||
| <vspace blankLines="0"/> | it is in use or has been recently employed). Depending on how/where the numeric | |||
| random() is a PRNG that returns a pseudo-random unsigned integer number of appro | identifier is used, it may or may not be possible (or even desirable) to check w | |||
| priate size. <!-- Note that the output needs to be unpredictable, and typical im | hether the numeric identifier is suitable. | |||
| plementations of the POSIX random() function do not necessarily meet this requir | ||||
| ement. See <xref target="RFC4086"/> for randomness requirements for security. -- | ||||
| >Beware that "adapting" the length of the output of random() with a modulo opera | ||||
| tor (e.g., C-language's "%") may change the distribution of the PRNG. To preserv | ||||
| e a uniform distribution, the rejection sampling technique <xref target="Romaill | ||||
| er2020"/> can be used.</t> | ||||
| <t> | ||||
| The function suitable_id() can check, when possible and desirable, whether a sel | ||||
| ected transient numeric identifier is suitable (e.g. it is not already in use). | ||||
| Depending on how/where the numeric identifier is used, it may or may not be poss | ||||
| ible (or even desirable) to check whether the numeric identifier is in use (or w | ||||
| hether it has been recently employed). When an identifier is found to be unsuita | ||||
| ble, this algorithm selects the next available numeric identifier in sequence. | ||||
| </t> | </t> | |||
| <t>Even when this algorithm selects numeric IDs randomly, it is biased towards t | <t indent="3">All the variables (in this algorithm and all the other | |||
| he first available numeric ID after a sequence of unavailable numeric IDs. For e | s algorithms discussed in this document) are unsigned integers.</t> | |||
| xample, if this algorithm is employed for transport protocol ephemeral port rand | ||||
| omization <xref target="RFC6056"/> and the local list of unsuitable port numbers | ||||
| (e.g., registered port numbers that should not be used for ephemeral ports) is | ||||
| significant, an attacker may actually have a significantly better chance of gues | ||||
| sing a port number. | ||||
| </t> | ||||
| <t> | <t>When an identifier is found to be unsuitable, this algorithm sele | |||
| All the variables (in this and all the algorithms discussed in this document) ar | cts the next available numeric identifier in sequence. Thus, even when this algo | |||
| e unsigned integers.</t> | rithm selects numeric identifiers randomly, it is biased towards the first avail | |||
| </list> | able numeric identifier after a sequence of unavailable numeric identifiers. For | |||
| example, if this algorithm is employed for transport-protocol ephemeral port ra | ||||
| ndomization <xref target="RFC6056" format="default"/> and the local list of unsu | ||||
| itable port numbers (e.g., registered port numbers that should not be used for e | ||||
| phemeral ports) is significant, an attacker may actually have a significantly be | ||||
| tter chance of guessing an ephemeral port number. | ||||
| </t> | </t> | |||
| <t>Assuming the randomness requirements for the PRNG are met (see <xref target=" | <t>Assuming the randomness requirements for the PRNG are met (see <xre | |||
| RFC4086"/>), this algorithm does not suffer from any of the issues discussed in | f target="RFC4086" format="default"/>), this algorithm does not suffer from any | |||
| <xref target="vulns"/>.</t> | of the issues discussed in <xref target="vulns" format="default"/>.</t> | |||
| </section> | </section> | |||
| <section anchor="simple-randomization2" numbered="true" toc="default"> | ||||
| <section title="Another Simple Randomization Algorithm" anchor="simple-randomiza | <name>Another Simple Randomization Algorithm</name> | |||
| tion2"> | <t>The following pseudocode illustrates another algorithm for selectin | |||
| <t>The following pseudo-code illustrates another algorithm for selecting a rando | g a random transient numeric identifier where, in the event a selected identifie | |||
| m transient numeric identifier which, in the event a selected identifier is foun | r is found to be unsuitable (e.g., already in use), another identifier is random | |||
| d to be unsuitable (e.g., already in use), another identifier is randomly select | ly selected:</t> | |||
| ed:</t> | <sourcecode type="c"><![CDATA[ | |||
| <t> | ||||
| <figure> | ||||
| <artwork> | ||||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| retry = id_range; | retry = id_range; | |||
| do { | do { | |||
| next_id = min_id + (random() % id_range); | next_id = min_id + (random() % id_range); | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry--; | retry--; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| ]]></sourcecode> | ||||
| </artwork> | <t>NOTE:</t> | |||
| </figure> | <t indent="3">random() is a PRNG that returns a pseudorandom unsigned i | |||
| </t> | nteger number of appropriate size. Beware that "adapting" the length of the outp | |||
| ut of random() with a modulo operator (e.g., C language's "%") may change the di | ||||
| <t>This algorithm might be unable to select a transient numeric identifier (i.e. | stribution of the PRNG. To preserve a uniform distribution, the rejection sampli | |||
| , return "ERROR") even if there are suitable identifiers available, in cases whe | ng technique <xref target="Romailler2020" format="default"/> can be used.</t> | |||
| re a large number of identifiers are found to be unsuitable (e.g. "in use").</t> | <t indent="3">suitable_id() is a function that checks, if possible a | |||
| nd desirable, whether a candidate numeric identifier is suitable (e.g., if it is | ||||
| <t>The same considerations from <xref target="simple-randomization"/> with respe | not already in use). Depending on how/where the numeric identifier is used, it | |||
| ct to the properties of random() and the adaptation of its output length apply t | may or may not be possible (or even desirable) to check whether the numeric iden | |||
| o this algorithm.</t> | tifier is in use (or whether it has been recently employed). | |||
| <t>Assuming the randomness requirements for the PRNG are met (see <xref target=" | ||||
| RFC4086"/>), this algorithm does not suffer from any of the issues discussed in | ||||
| <xref target="vulns"/>.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section title="Category #2: Uniqueness (hard failure)" anchor="cat-2-alg"> | ||||
| <t>One of the most trivial approaches for generating unique transient numeric id | ||||
| entifier (with a hard failure severity) is to reduce the identifier reuse freque | ||||
| ncy by generating the numeric identifiers with a monotonically-increasing functi | ||||
| on (e.g. linear). As a result, any of the algorithms described in <xref target=" | ||||
| cat-4-alg"/> ("Category #4: Uniqueness, monotonically increasing within context | ||||
| (hard failure)") can be readily employed for complying with the requirements of | ||||
| this transient numeric identifier category. | ||||
| </t> | </t> | |||
| <t>In cases where suitability (e.g. uniqueness) of the selected identifiers can be definitely assessed by the local system, any of the algorithms described in < xref target="cat-1-alg"/> ("Category #1: Uniqueness (soft failure)") can be read ily employed for complying with the requirements of this numeric identifier cate gory.</t> | <t>When an identifier is found to be unsuitable, this algorithm select s another random numeric identifier. Thus, this algorithm might be unable to sel ect a transient numeric identifier (i.e., return "ERROR"), even if there are sui table identifiers available, in cases where a large number of identifiers are fo und to be unsuitable (e.g., "in use").</t> | |||
| <t> | <t>Assuming the randomness requirements for the PRNG are met (see <xre | |||
| <list style="hanging"> | f target="RFC4086" format="default"/>), this algorithm does not suffer from any | |||
| <t hangText="NOTE:"> | of the issues discussed in <xref target="vulns" format="default"/>.</t> | |||
| <vspace blankLines="0"/> | </section> | |||
| In the case of e.g. TCP ephemeral ports or TCP ISNs, a transient numeric identif | </section> | |||
| ier that might seem suitable from the perspective of the local system, might act | <section anchor="cat-2-alg" numbered="true" toc="default"> | |||
| ually be unsuitable from the perspective of the remote system (e.g., because the | <name>Category #2: Uniqueness (Hard Failure)</name> | |||
| re is state associated with the selected identifier at the remote system). There | <t>One of the most trivial approaches for generating a unique transient | |||
| fore, in such cases it is not possible to employ the algorithms from <xref targe | numeric identifier (with a hard failure severity) is to reduce the identifier re | |||
| t="cat-1-alg"/> ("Category #1: Uniqueness (soft failure)"). | use frequency by generating the numeric identifiers with a monotonically increas | |||
| </t> | ing function (e.g., linear). As a result, any of the algorithms described in <xr | |||
| </list> | ef target="cat-4-alg" format="default"/> ("Category #4: Uniqueness, Monotonicall | |||
| y Increasing within Context (Hard Failure)") can be readily employed for complyi | ||||
| ng with the requirements of this transient numeric identifier category. | ||||
| </t> | </t> | |||
| <t>In cases where suitability (e.g., uniqueness) of the selected identif | ||||
| </section> | iers can be definitely assessed by the local system, any of the algorithms descr | |||
| ibed in <xref target="cat-1-alg" format="default"/> ("Category #1: Uniqueness (S | ||||
| <section title="Category #3: Uniqueness, stable within context (soft failure)" a | oft Failure)") can be readily employed for complying with the requirements of th | |||
| nchor="cat-3-alg"> | is numeric identifier category.</t> | |||
| <t>The goal of the following algorithm is to produce identifiers that are stable | <aside><t>NOTE: In the case of, e.g., TCP ephemeral ports or TCP ISNs, a | |||
| for a given context (identified by "CONTEXT"), but that change when t | transient numeric identifier that might seem suitable from the perspective of t | |||
| he aforementioned context changes. <!--For example, if the identifiers being gen | he local system might actually be unsuitable from the perspective of the remote | |||
| erated must be unique for each {src IP, dst IP} set, then each possible combinat | system (e.g., because there is state associated with the selected identifier at | |||
| ion of {src IP, dst IP} should have a corresponding "next_id" value. --> | the remote system). Therefore, in such cases, it is not possible to employ the a | |||
| lgorithms from <xref target="cat-1-alg" format="default"/> ("Category #1: Unique | ||||
| ness (Soft Failure)"). | ||||
| </t></aside> | ||||
| </section> | ||||
| <section anchor="cat-3-alg" numbered="true" toc="default"> | ||||
| <name>Category #3: Uniqueness, Stable within Context (Soft Failure)</nam | ||||
| e> | ||||
| <t>The goal of the following algorithm is to produce identifiers that ar | ||||
| e stable for a given context (identified by "CONTEXT") but that change when the | ||||
| aforementioned context changes. | ||||
| </t> | </t> | |||
| <t>In order to avoid storing the transient numeric identifiers computed | ||||
| <t><!--Keeping one value for each possible "context" may in many cases be consid | for each CONTEXT in memory, the following algorithm employs a calculated techniq | |||
| ered too onerous in terms of memory requirements. -->In order to avoid storing i | ue (as opposed to keeping state in memory) to generate a stable transient numeri | |||
| n memory the transient numeric identifiers computed for each CONTEXT, the follow | c identifier for each given context. | |||
| ing algorithm employs a calculated technique (as opposed to keeping state in mem | ||||
| ory) to generate a stable transient numeric identifier for each given context. | ||||
| </t> | </t> | |||
| <sourcecode type="c"><![CDATA[ | ||||
| <t> | ||||
| <figure><artwork> | ||||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| retry = 0; | retry = 0; | |||
| do { | do { | |||
| offset = F(CONTEXT, retry, secret_key); | offset = F(CONTEXT, retry, secret_key); | |||
| next_id = min_id + (offset % id_range); | next_id = min_id + (offset % id_range); | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry++; | retry++; | |||
| } while (retry <= MAX_RETRIES); | } while (retry <= MAX_RETRIES); | |||
| return ERROR; | return ERROR; | |||
| ]]></sourcecode> | ||||
| </artwork> | <t>NOTE:</t> | |||
| </figure> | <t indent="3">CONTEXT is the concatenation of all the elements that de | |||
| </t> | fine a given context.</t> | |||
| <!-- | <t indent="3">F() is a pseudorandom function (PRF). It must not be compu | |||
| <t>F() must be a cryptographically-secure hash function (e.g. SHA-256 <xref targ | table from the outside (without knowledge of the secret key). F() must also be d | |||
| et="FIPS-SHS"/>), that is computed over the concatenation of its arguments. | ifficult to reverse, such that it resists attempts to obtain the secret key, eve | |||
| n when given samples of the output of F() and knowledge or control of the other | ||||
| input parameters. F() should produce an output of at least as many bits as requi | ||||
| red for the transient numeric identifier. SipHash-2-4 (128-bit key, 64-bit outpu | ||||
| t) <xref target="SipHash" format="default"/> and BLAKE3 (256-bit key, arbitrary- | ||||
| length output) <xref target="BLAKE3" format="default"/> are two possible options | ||||
| for F(). Alternatively, F() could be implemented with a keyed hash message auth | ||||
| entication code (HMAC) <xref target="RFC2104" format="default"/>. HMAC-SHA-256 < | ||||
| xref target="FIPS-SHS" format="default"/> would be one possible option for such | ||||
| implementation alternative. Note: Use of HMAC-MD5 <xref target="RFC1321" format= | ||||
| "default"/> or HMAC-SHA1 <xref target="FIPS-SHS" format="default"/> are not reco | ||||
| mmended for F() <xref target="RFC6151" format="default"/> <xref target="RFC6194" | ||||
| format="default"/>. The result of F() is no more secure than the secret key, an | ||||
| d therefore, "secret_key" must be unknown to the attacker and must be of a reaso | ||||
| nable length. "secret_key" must remain stable for a given CONTEXT, since otherwi | ||||
| se, the numeric identifiers generated by this algorithm would not have the desir | ||||
| ed stability properties (i.e., stable for a given CONTEXT). In most cases, "secr | ||||
| et_key" should be selected with a PRNG (see <xref target="RFC4086" format="defau | ||||
| lt"/> for recommendations on choosing secrets) at an appropriate time and stored | ||||
| in stable or volatile storage (as necessary) for future use. | ||||
| </t> | ||||
| <t>In this algorithm, the function F() provides a stateless and stable per-CONTE XT offset, where CONTEXT is the concatenation of all the elements that define th e given context. | <t indent="3">suitable_id() checks whether a candidate numeric identifie r has suitable uniqueness properties. </t> | |||
| <list style="hanging"> | <t>In this algorithm, the function F() provides a stateless and stable per-CONTE | |||
| <t>For example, if this algorithm is expected to produce IPv6 IIDs that are uniq | XT offset, where CONTEXT is the concatenation of all the elements that define th | |||
| ue per network interface and SLAAC autoconfiguration prefix, the CONTEXT should | e given context. | |||
| be the concatenation of e.g. the network interface index and the SLAAC autoconfi | ||||
| guration prefix (please see <xref target="RFC7217"/> for an implementation of th | ||||
| is algorithm for generation of stable IPv6 IIDs). | ||||
| </t> | </t> | |||
| </list> | <t>For example, if this algorithm is expected to produce IPv6 IIDs tha t are unique per network interface and Stateless Address Autoconfiguration (SLAA C) prefix, CONTEXT should be the concatenation of, e.g., the network interface i ndex and the SLAAC autoconfiguration prefix (please see <xref target="RFC7217" f ormat="default"/> for an implementation of this algorithm for generation of stab le IPv6 addresses). | |||
| </t> | </t> | |||
| <t>F() is a pseudorandom function (PRF). It must not be computable from the outs | <t>The result of F() is stored in the variable "offset", which may take | |||
| ide (without knowledge of the secret key). F() must also be difficult to reverse | any value within the storage type range, since we are restricting the resulting | |||
| , such that it resists attempts to obtain the secret_key, even when given sample | identifier to be in the range [min_id, max_id] in a similar way as in the algori | |||
| s of the output of F() and knowledge or control of the other input parameters. F | thm described in <xref target="simple-randomization" format="default"/>.</t> | |||
| () should produce an output of at least as many bits as required for the transie | <t>As noted above, suitable_id() checks whether a candidate numeric iden | |||
| nt numeric identifier. SipHash-2-4 (128-bit key, 64-bit output) <xref target="Si | tifier has suitable uniqueness properties. Collisions (i.e., an identifier that | |||
| pHash"/> and BLAKE3 (256-bit key, arbitrary-length output) <xref target="BLAKE3" | is not unique) are recovered by incrementing the "retry" variable and recomputin | |||
| /> are two possible options for F(). Alternatively, F() could be implemented wit | g F(), up to a maximum of MAX_RETRIES times. However, recovering from collisions | |||
| h a keyed-hash message authentication code (HMAC) <xref target="RFC2104"/>. HMAC | will usually result in identifiers that fail to remain constant for the specifi | |||
| -SHA-256 <xref target="FIPS-SHS"/> would be one possible option for such impleme | ed context. This is normally acceptable when the probability of collisions is sm | |||
| ntation alternative. Note: Use of HMAC-MD5 <xref target="RFC1321"/> or HMAC-SHA1 | all, as in the case of, e.g., IPv6 IIDs resulting from SLAAC <xref target="RFC72 | |||
| <xref target="FIPS-SHS"/> are not recommended for F() <xref target="RFC6151"/> | 17" format="default"/> <xref target="RFC8981" format="default"/>.</t> | |||
| <xref target="RFC6194"/>.</t> | <t>For obvious reasons, the transient numeric identifiers generated with | |||
| this algorithm allow for network activity correlation and fingerprinting within | ||||
| <t>The result of F() is no more secure than the secret key, and therefore 'secre | "CONTEXT". However, this is essentially a design goal of this category of trans | |||
| t_key' must be unknown to the attacker, and must be of a reasonable length. 'sec | ient numeric identifiers.</t> | |||
| ret_key' must remain stable for a given CONTEXT, since otherwise the numeric ide | </section> | |||
| ntifiers generated by this algorithm would not have the desired stability proper | <section anchor="cat-4-alg" numbered="true" toc="default"> | |||
| ties (i.e., stable for a given CONTEXT). In most cases, 'secret_key' should be s | <name>Category #4: Uniqueness, Monotonically Increasing within Context ( | |||
| elected with a PRNG (see <xref target="RFC4086"/> for recommendations on choosin | Hard Failure)</name> | |||
| g secrets) at an appropriate time, and stored in stable or volatile storage (as | <section anchor="per-context-counter" numbered="true" toc="default"> | |||
| necessary) for future use. | <name>Per-Context Counter Algorithm</name> | |||
| </t> | <t>One possible way of selecting unique monotonically increasing ident | |||
| ifiers (per context) is to employ a per-context counter. Such an algorithm could | ||||
| <t>The result of F() is stored in the variable 'offset', which may take any valu | be described as follows:</t> | |||
| e within the storage type range, since we are restricting the resulting identifi | <sourcecode type="c"><![CDATA[ | |||
| er to be in the range [min_id, max_id] in a similar way as in the algorithm desc | ||||
| ribed in <xref target="simple-randomization"/>.</t> | ||||
| <t>suitable_id() checks whether the candidate identifier has suitable uniqueness | ||||
| properties. Collisions (i.e., an identifier that is not unique) are recovered b | ||||
| y incrementing the 'retry' variable and recomputing F(), up to a maximum of MAX_ | ||||
| RETRIES times. However, recovering from collisions will usually result in identi | ||||
| fiers that fail to remain constant for the specified context. This is normally a | ||||
| cceptable when the probability of collisions is small, as in the case of e.g. IP | ||||
| v6 IIDs resulting from SLAAC <xref target="RFC7217"/> <xref target="RFC8981"/>.< | ||||
| /t> | ||||
| <t>For obvious reasons, the transient numeric identifiers generated with this al | ||||
| gorithm allow for network activity correlation and fingerprinting within "CONTEX | ||||
| T". However, this is essentially a design goal of this category of transient num | ||||
| eric identifiers.</t> | ||||
| </section> | ||||
| <section title="Category #4: Uniqueness, monotonically increasing within context | ||||
| (hard failure)" anchor="cat-4-alg"> | ||||
| <section title="Per-context Counter Algorithm" anchor="per-context-counter"> | ||||
| <t>One possible way of selecting unique monotonically-increasing identifiers (pe | ||||
| r context) is to employ a per-context counter. Such an algorithm could be descri | ||||
| bed as follows:</t> | ||||
| <t> | ||||
| <figure> | ||||
| <artwork> | ||||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| retry = id_range; | retry = id_range; | |||
| id_inc = increment() % id_range; | id_inc = increment() % id_range; | |||
| if( (next_id = lookup_counter(CONTEXT)) == ERROR){ | if( (next_id = lookup_counter(CONTEXT)) == ERROR){ | |||
| next_id = min_id + random() % id_range; | next_id = min_id + random() % id_range; | |||
| } | } | |||
| skipping to change at line 490 ¶ | skipping to change at line 420 ¶ | |||
| if (suitable_id(next_id)){ | if (suitable_id(next_id)){ | |||
| store_counter(CONTEXT, next_id); | store_counter(CONTEXT, next_id); | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry = retry - id_inc; | retry = retry - id_inc; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | <t>NOTE:</t> | |||
| </t> | <t indent="3">CONTEXT is the concatenation of all the elements that de | |||
| <t> | fine a given context.</t> | |||
| <list style="hanging"> | ||||
| <t hangText="NOTES:"> | ||||
| <vspace blankLines="0"/> | ||||
| increment() returns a small integer that is employed to increment the current co | ||||
| unter value to obtain the next transient numeric identifier. This value must be | ||||
| much smaller than the number of possible values for the numeric IDs (i.e., "id_r | ||||
| ange"). Most implementations of this algorithm employ a constant increment of 1. | ||||
| Using a value other than 1 can help mitigate some information leakages (please | ||||
| see below), at the expense of a possible increase in the numeric ID reuse freque | ||||
| ncy.</t> | ||||
| <t>The code above makes sure that the increment employed in the algorithm (id_in | ||||
| c) is always smaller than the number of possible values for the numeric IDs (i.e | ||||
| ., "max_id - min_d + 1"). However, as noted above, this value must also be much | ||||
| smaller than the number of possible values for the numeric IDs.</t> | ||||
| <t>lookup_counter() is a function that returns the current counter for a given c | ||||
| ontext, or an error condition if that counter does not exist.</t> | ||||
| <t>store_counter() is a function that saves a counter value for a given context. | ||||
| </t> | ||||
| <t>suitable_id() is a function that checks whether the resulting identifier is a | ||||
| cceptable (e.g., whether it is not already in use, etc.). | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t>Essentially, whenever a new identifier is to be selected, the algorithm check | <t indent="3">increment() returns a small integer that is employed t | |||
| s whether a counter for the corresponding context exists. If does, the value of | o increment the current counter value to obtain the next transient numeric ident | |||
| such counter is incremented to obtain the new transient numeric identifier, and | ifier. This value must be larger than or equal to 1, and much smaller than the n | |||
| the counter is updated. If no counter exists for such context, a new counter is | umber of possible values for the numeric identifiers (i.e., "id_range"). Most im | |||
| created and initialized to a random value, and used as the selected transient nu | plementations of this algorithm employ a constant increment of 1. Using a value | |||
| meric identifier. This algorithm produces a per-context counter, which results i | other than 1 can help mitigate some information leakages (please see below) at t | |||
| n one monotonically-increasing function for each context. Since each counter is | he expense of a possible increase in the numeric identifier reuse frequency. The | |||
| initialized to a random value, the resulting values are unpredictable by an off- | code above makes sure that the increment employed in the algorithm (id_inc) is | |||
| path attacker. | always smaller than the number of possible values for the numeric identifiers (i | |||
| </t> | .e., "max_id - min_d + 1"). However, as noted above, this value must also be muc | |||
| h smaller than the number of possible values for the numeric identifiers.</t> | ||||
| <t indent="3">lookup_counter() is a function that returns the curren | ||||
| t counter for a given context or an error condition if that counter does not exi | ||||
| st.</t> | ||||
| <t indent="3">random() is a PRNG that returns a pseudorandom unsigned i | ||||
| nteger number of appropriate size. Beware that "adapting" the length of the outp | ||||
| ut of random() with a modulo operator (e.g., C language's "%") may change the di | ||||
| stribution of the PRNG. To preserve a uniform distribution, the rejection sampli | ||||
| ng technique <xref target="Romailler2020" format="default"/> can be used.</t> | ||||
| <t>The choice of id_inc has implications on both the security and privacy proper | <t indent="3">store_counter() is a function that saves a counter val | |||
| ties of the resulting identifiers, but also on the corresponding interoperabilit | ue for a given context.</t> | |||
| y properties. On one hand, minimizing the increments generally minimizes the ide | ||||
| ntifier reuse frequency, albeit at increased predictability. On the other hand, | ||||
| if the increments are randomized, predictability of the resulting identifiers is | ||||
| reduced, and the information leakage produced by global constant increments is | ||||
| mitigated. However, using larger increments than necessary can result in higher | ||||
| numeric ID reuse frequency. | ||||
| </t> | ||||
| <t>This algorithm has the following drawbacks: | <t indent="3">suitable_id() checks whether a candidate numeric identifie | |||
| <list style="symbols"> | r has suitable uniqueness properties. </t> | |||
| <t>It requires an implementation to store each per-CONTEXT counter in memory. If | ||||
| , as a result of resource management, the counter for a given context must be re | ||||
| moved, the last transient numeric identifier value used for that context will be | ||||
| lost. Thus, if subsequently an identifier needs to be generated for the same c | ||||
| ontext, the corresponding counter will need to be recreated and reinitialized to | ||||
| a random value, thus possibly leading to reuse/collision of numeric identifiers | ||||
| . | ||||
| </t> | ||||
| <t> | <t>Essentially, whenever a new identifier is to be selected, the algor | |||
| Keeping one counter for each possible "context" may in some cases be considered | ithm checks whether a counter for the corresponding context exists. If it does, | |||
| too onerous in terms of memory requirements. | the value of such counter is incremented to obtain the new transient numeric ide | |||
| ntifier, and the counter is updated. If no counter exists for such context, a ne | ||||
| w counter is created and initialized to a random value and used as the selected | ||||
| transient numeric identifier. This algorithm produces a per-context counter, whi | ||||
| ch results in one monotonically increasing function for each context. Since each | ||||
| counter is initialized to a random value, the resulting values are unpredictabl | ||||
| e by an off-path attacker. | ||||
| </t> | </t> | |||
| <t>The choice of id_inc has implications on both the security and priv | ||||
| <!-- | acy properties of the resulting identifiers and also on the corresponding intero | |||
| <t>An implementation may map more than one context to the same counter, such the | perability properties. On one hand, minimizing the increments generally minimize | |||
| amount of memory required to store counters is reduced, at the expense of a pos | s the identifier reuse frequency, albeit at increased predictability. On the oth | |||
| sible unnecessary increase in the numeric identifier reuse frequency. In such ca | er hand, if the increments are randomized, predictability of the resulting ident | |||
| ses, if the identifiers are predictable by the destination system (in case the d | ifiers is reduced, and the information leakage produced by global constant incre | |||
| estination host represents the "context"), a vulnerable host might possibly leak | ments is mitigated. However, using larger increments than necessary can result i | |||
| to third parties the identifiers used by other hosts to send traffic to it (i.e | n higher numeric identifier reuse frequency. | |||
| ., a vulnerable Host B could leak to Host C the identifier values that Host A is | ||||
| using to send packets to Host B). Appendix A of <xref target="RFC7739"/> descri | ||||
| bes one possible scenario for such leakage in detail. Employing small random num | ||||
| bers for the increments (i.e., for increment() function) may help mitigate this | ||||
| kind of information leakage. | ||||
| </t> | </t> | |||
| </list> | <t>This algorithm has the following drawbacks: | |||
| </t> | </t> | |||
| <ul spacing="normal"> | ||||
| <li>It requires an implementation to store each per-context counter | ||||
| in memory. If, as a result of resource management, the counter for a given conte | ||||
| xt must be removed, the last transient numeric identifier value used for that co | ||||
| ntext will be lost. Thus, if an identifier subsequently needs to be generated f | ||||
| or the same context, the corresponding counter will need to be recreated and rei | ||||
| nitialized to a random value, thus possibly leading to reuse/collision of numeri | ||||
| c identifiers. | ||||
| </li> | ||||
| <li> | ||||
| Keeping one counter for each possible "context" may in some cases be considered | ||||
| too onerous in terms of memory requirements. | ||||
| </li> | ||||
| <t>Otherwise, the identifiers produced by this algorithm do not suffer from the | </ul> | |||
| other issues discussed in <xref target="vulns"/>.</t> | <t>Otherwise, the identifiers produced by this algorithm do not suffer | |||
| </section> | from the other issues discussed in <xref target="vulns" format="default"/>.</t> | |||
| </section> | ||||
| <section title="Simple PRF-Based Algorithm" anchor="simple-hash"> | <section anchor="simple-hash" numbered="true" toc="default"> | |||
| <t>The goal of this algorithm is to produce monotonically-increasing transient n | <name>Simple PRF-Based Algorithm</name> | |||
| umeric identifiers (for each given context), with a randomized initial value. Fo | <t>The goal of this algorithm is to produce monotonically increasing t | |||
| r example, if the identifiers being generated must be monotonically-increasing f | ransient numeric identifiers (for each given context) with a randomized initial | |||
| or each {IP Source Address, IP Destination Address} set, then each possible comb | value. For example, if the identifiers being generated must be monotonically inc | |||
| ination of {IP Source Address, IP Destination Address} should have a separate mo | reasing for each {Source Address, Destination Address} set, then each possible c | |||
| notonically-increasing sequence, that starts at a different random value. | ombination of {Source Address, Destination Address} should have a separate monot | |||
| onically increasing sequence that starts at a different random value. | ||||
| </t> | </t> | |||
| <t>Instead of maintaining a per-context counter (as in the algorithm f | ||||
| <t>Instead of maintaining a per-context counter (as in the algorithm from <xref | rom <xref target="per-context-counter" format="default"/>), the following algori | |||
| target="per-context-counter"/>), the following algorithm employs a calculated te | thm employs a calculated technique to maintain a random offset for each possible | |||
| chnique to maintain a random offset for each possible context. | context. | |||
| </t> | </t> | |||
| <sourcecode type="c"><![CDATA[ | ||||
| <t> | ||||
| <figure><artwork> | ||||
| /* Initialization code */ | /* Initialization code */ | |||
| counter = 0; | counter = 0; | |||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| id_inc = increment() % id_range; | id_inc = increment() % id_range; | |||
| offset = F(CONTEXT, secret_key); | offset = F(CONTEXT, secret_key); | |||
| retry = id_range; | retry = id_range; | |||
| skipping to change at line 563 ¶ | skipping to change at line 478 ¶ | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry = retry - id_inc; | retry = retry - id_inc; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| ]]></sourcecode> | ||||
| <t>NOTE:</t> | ||||
| <t indent="3">CONTEXT is the concatenation of all the elements that de | ||||
| fine a given context. For example, if this algorithm is expected to produce iden | ||||
| tifiers that are monotonically increasing for each set {Source Address, Destinat | ||||
| ion Address}, CONTEXT should be the concatenation of Source Address and Destinat | ||||
| ion Address.</t> | ||||
| </artwork> | <t indent="3">increment() has the same properties and requirements as | |||
| </figure> | those specified for increment() in <xref target="per-context-counter" format="de | |||
| </t> | fault"/>.</t> | |||
| <t indent="3">F() is a PRF, with the same properties as those specifie | ||||
| <!-- | d for F() in <xref target="cat-3-alg" format="default"/>.</t> | |||
| <t> | ||||
| The function F() should be a cryptographically-secure hash function (e.g. SH | ||||
| A-256 <xref target="FIPS-SHS"/>). CONTEXT is the concatenation of all the elemen | ||||
| ts that define a given context. For example, if this algorithm is expected to pr | ||||
| oduce identifiers that are monotonically-increasing for each set (Source IP Addr | ||||
| ess, Destination IP Address), CONTEXT should be the concatenation of these two I | ||||
| P addresses. | ||||
| </t> | ||||
| <!-- Nuevo: | ||||
| <t>F() is a pseudorandom function (PRF) that must not be computable from the out | ||||
| side (without knowledge of the secret key). F() must also be difficult to revers | ||||
| e, such that it resists attempts to obtain the secret_key, even when given sampl | ||||
| es of the output of F() and knowledge or control of the other input parameters. | ||||
| F() should produce an output of at least as many bits as required for the transi | ||||
| ent numeric identifier. F() could be the result of applying a cryptographic hash | ||||
| over an encoded version of the function parameters. While this document does n | ||||
| ot recommend a specific mechanism for encoding the function parameters (or a spe | ||||
| cific cryptographic hash function), a cryptographically robust construction will | ||||
| ensure that the mapping from parameters to the hash function input is an inject | ||||
| ive map, as might be attained by using fixed-width encodings and/or length-prefi | ||||
| xing variable-length parameters. SHA-256 <xref target="FIPS-SHS"/> is one possib | ||||
| le option for F(). Note: MD5 <xref target="RFC1321"/> is considered unacceptable | ||||
| for F() <xref target="RFC6151"/>.</t> | ||||
| <t>In the algorithm above, the function F() provides a (stateless) unpredict | ||||
| able offset for each given context (as identified by 'CONTEXT'). | ||||
| </t> | ||||
| <t>F() is a PRF, with the same properties as those specified for F() in <xref ta | ||||
| rget="cat-3-alg"/>.</t> | ||||
| <t>CONTEXT is the concatenation of all the elements that define a given context. For example, if this algorithm is expected to produce identifiers that are mono tonically-increasing for each set (Source IP Address, Destination IP Address), C ONTEXT should be the concatenation of these two IP addresses.</t> | <t indent="3">suitable_id() checks whether a candidate numeric identifie r has suitable uniqueness properties.</t> | |||
| <t> | <t>In the algorithm above, the function F() provides a stateless, stable, an | |||
| The function F() provides a "per-CONTEXT" fixed offset within the | d unpredictable offset for each given context (as identified by "CONTEXT"). Both | |||
| numeric identifier "space". Both the 'offset' and 'counter' variables may take | the "offset" and "counter" variables may take any value within | |||
| any value within | the storage type range since we are restricting the resulting identifier to | |||
| the storage type range since we are restricting the resulting identifier to | be in the range [min_id, max_id] in a similar way as in the algorithm described | |||
| be in the range [min_id, max_id] in a similar way as in the algorithm described | in <xref target="simple-randomization" format="default"/>. This allows us | |||
| in <xref target="simple-randomization"/>. This allows us | to simply increment the "counter" variable and rely on the | |||
| to simply increment the 'counter' variable and rely on the | ||||
| unsigned integer to wrap around. | unsigned integer to wrap around. | |||
| </t> | </t> | |||
| <!-- | ||||
| <t> | ||||
| The secret should be chosen to be as random as possible (see <xref target="RFC40 | ||||
| 86"/> for recommendations on choosing secrets). | ||||
| </t> | ||||
| <t> | <t> | |||
| The result of F() is no more secure than the secret key, and therefore 'secret_k | The result of F() is no more secure than the secret key, and therefore, "secret_ | |||
| ey' must be unknown to the attacker, and must be of a reasonable length. 'secret | key" must be unknown to the attacker and must be of a reasonable length. "secret | |||
| _key' must remain stable for a given CONTEXT, since otherwise the numeric identi | _key" must remain stable for a given CONTEXT, since otherwise, the numeric ident | |||
| fiers generated by this algorithm would not have the desired stability propertie | ifiers generated by this algorithm would not have the desired properties (i.e., | |||
| s (i.e., monotonically-increasing for a given CONTEXT). In most cases, 'secret_k | monotonically increasing for a given CONTEXT). In most cases, "secret_key" shoul | |||
| ey' should be selected with a PRNG (see <xref target="RFC4086"/> for recommendat | d be selected with a PRNG (see <xref target="RFC4086" format="default"/> for rec | |||
| ions on choosing secrets) at an appropriate time, and stored in stable or volati | ommendations on choosing secrets) at an appropriate time and stored in stable or | |||
| le storage (as necessary) for future use.</t> | volatile storage (as necessary) for future use.</t> | |||
| <t>It should be noted that, since this algorithm uses a global counter | ||||
| <t>It should be noted that, since this algorithm uses a global counter ("co | ("counter") for selecting identifiers (i.e., all counters share the same increm | |||
| unter") for selecting identifiers (i.e., all counters share the same increm | ent space), this algorithm results in an information leakage (as described in <x | |||
| ents space), this algorithm results in an information leakage (as described in < | ref target="information-leakage" format="default"/>). For example, if this algor | |||
| xref target="information-leakage"/>). For example, if this algorithm were used f | ithm was used for selecting TCP ephemeral ports and an attacker could force a cl | |||
| or selecting TCP ephemeral ports, and an attacker could force a client to period | ient to periodically establish a new TCP connection to an attacker-controlled sy | |||
| ically establish a new TCP connection to an attacker-controlled system (or throu | stem (or through an attacker-observable routing path), the attacker could subtra | |||
| gh an attacker-observable routing path), the attacker could subtract consecutive | ct consecutive Source Port values to obtain the number of outgoing TCP connectio | |||
| source port values to obtain the number of outgoing TCP connections established | ns established globally by the victim host within that time period (up to wrap-a | |||
| globally by the victim host within that time period (up to wrap-around issues a | round issues and five-tuple collisions, of course). This information leakage cou | |||
| nd five-tuple collisions, of course). This information leakage could be partiall | ld be partially mitigated by employing small random values for the increments (i | |||
| y mitigated by employing small random values for the increments (i.e., increment | .e., increment() function), instead of having increment() return the constant "1 | |||
| () function), instead of having increment() return the constant "1".</t> | ".</t> | |||
| <t>We nevertheless note that an improved mitigation of this information leakage | <t>We nevertheless note that an improved mitigation of this informatio | |||
| could be more successfully achieved by employing the algorithm from <xref target | n leakage could be more successfully achieved by employing the algorithm from <x | |||
| ="double-hash"/>, instead.</t> | ref target="double-hash" format="default"/>, instead.</t> | |||
| <!-- | ||||
| <t>From a functional perspective, this algorithm results in numeric identifiers | ||||
| with similar properties to those generated with the algorithm specified in <xref | ||||
| target="per-context-counter"/> when multiple | ||||
| </section> | </section> | |||
| <section anchor="double-hash" numbered="true" toc="default"> | ||||
| <section title="Double-PRF Algorithm" anchor="double-hash"> | <name>Double-PRF Algorithm</name> | |||
| <t>A trade-off between maintaining a single global "counter" variable | ||||
| <t>A trade-off between maintaining a single global 'counter' variable and ma | and maintaining 2**N "counter" variables (where N is the width of the result of | |||
| intaining 2**N 'counter' variables (where N is the width of the result of F()), | F()) could be achieved as follows. The system would keep an array of TABLE_LENGT | |||
| could be achieved as follows. The system would keep an array of TABLE_LENGTH val | H values, which would provide a separation of the increment space into multiple | |||
| ues, which would provide a separation of the increment space into multiple bucke | buckets. This improvement could be incorporated into the algorithm from <xref ta | |||
| ts. This improvement could be incorporated into the algorithm from <xref target= | rget="simple-hash" format="default"/> as follows:</t> | |||
| "simple-hash"/> as follows:</t> | <sourcecode type="c"><![CDATA[ | |||
| <t> | ||||
| <figure> | ||||
| <artwork> | ||||
| /* Initialization code */ | /* Initialization code */ | |||
| for(i = 0; i < TABLE_LENGTH; i++) { | for(i = 0; i < TABLE_LENGTH; i++) { | |||
| table[i] = random(); | table[i] = random(); | |||
| } | } | |||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| id_inc = increment() % id_range; | id_inc = increment() % id_range; | |||
| offset = F(CONTEXT, secret_key1); | offset = F(CONTEXT, secret_key1); | |||
| index = G(CONTEXT, secret_key2) % TABLE_LENGTH; | index = G(CONTEXT, secret_key2) % TABLE_LENGTH; | |||
| retry = id_range; | retry = id_range; | |||
| skipping to change at line 644 ¶ | skipping to change at line 530 ¶ | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry = retry - id_inc; | retry = retry - id_inc; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| ]]></sourcecode> | ||||
| </artwork> | <t>NOTE:</t> | |||
| </figure> | <t indent="3">increment() has the same properties and requirements as | |||
| </t> | those specified for increment() in <xref target="per-context-counter" format="de | |||
| fault"/>.</t> | ||||
| <t> | <t indent="3">Both F() and G() are PRFs, with the same properties as those requi | |||
| 'table[]' could be initialized with random values, as indicated by the initializ | red for F() in <xref target="cat-3-alg" format="default"/>. The results of F() a | |||
| ation code in the pseudo-code above.</t> | nd G() are no more secure than their respective secret keys ("secret_key1" and " | |||
| secret_key2", respectively), and therefore, both secret keys must be unknown to | ||||
| <!-- | the attacker and must be of a reasonable length. Both secret keys must remain st | |||
| <t>Both F() and G() should be cryptographically-secure hash functions (e.g. SHA- | able for the given CONTEXT, since otherwise, the transient numeric identifiers g | |||
| 256 <xref target="FIPS-SHS"/>) computed over the concatenation of each of their | enerated by this algorithm would not have the desired properties (i.e., monotoni | |||
| respective arguments. Both F() and G() would employ the same CONTEXT (the concat | cally increasing for a given CONTEXT). In most cases, both secret keys should be | |||
| enation of all the elements that define a given context), and would use separate | selected with a PRNG (see <xref target="RFC4086" format="default"/> for recomme | |||
| secret keys (secret_key1, and secret_key2, respectively). | ndations on choosing secrets) at an appropriate time and stored in stable or vol | |||
| </t> | atile storage (as necessary) for future use. | |||
| <t>Both F() and G() are PRFs, with the same properties as those required for F() | ||||
| in <xref target="cat-3-alg"/>.</t> | ||||
| <t> | ||||
| The results of F() and G() are no more secure than their respective secret keys | ||||
| ('secret_key1' and 'secret_key2', respectively), and therefore both secret keys | ||||
| must be unknown to the attacker, and must be of a reasonable length. Both secret | ||||
| keys must remain stable for the given CONTEXT, since otherwise the transient nu | ||||
| meric identifiers generated by this algorithm would not have the desired stabili | ||||
| ty properties (i.e., monotonically-increasing for a given CONTEXT). In most case | ||||
| s, both secret keys should be selected with a PRNG (see <xref target="RFC4086"/> | ||||
| for recommendations on choosing secrets) at an appropriate time, and stored in | ||||
| stable or volatile storage (as necessary) for future use. | ||||
| </t> | </t> | |||
| <t indent="3"> | ||||
| "table[]" could be initialized with random values, as indicated by the initializ | ||||
| ation code in the pseudocode above.</t> | ||||
| <!-- | <t>The "table[]" array assures that successive transient numeric identifiers for | |||
| <t> | a given context will be monotonically increasing. Since the increment space is | |||
| The function G() should be a cryptographic hash function. It should use the sam | separated into TABLE_LENGTH different spaces, the identifier reuse frequency wil | |||
| e CONTEXT as F(), and a secret key value to compute a value between 0 and (TABLE | l be (probabilistically) lower than that of the algorithm in <xref target="simpl | |||
| _LENGTH-1). | e-hash" format="default"/>. That is, the generation of an identifier for one giv | |||
| en context will not necessarily result in increments in the identifier sequence | ||||
| of other contexts. It is interesting to note that the size of "table[]" does not | ||||
| limit the number of different identifier sequences but rather separates the <st | ||||
| rong>increment space</strong> into TABLE_LENGTH different spaces. The selected t | ||||
| ransient numeric identifier sequence will be obtained by adding the correspondin | ||||
| g entry from "table[]" to the value in the "offset" variable, which selects the | ||||
| actual identifier sequence space (as in the algorithm from <xref target="simple- | ||||
| hash" format="default"/>). </t> | ||||
| <t>An attacker can perform traffic analysis for any "increment | ||||
| space" (i.e., context) into which the attacker has "visibility" -- namely, th | ||||
| e attacker can force a system to generate identifiers for G(CONTEXT, secret_key2 | ||||
| ), where the result of G() identifies the target "increment space". However, the | ||||
| attacker's ability to perform traffic analysis is very reduced when compared to | ||||
| the simple PRF-based identifiers (described in <xref target="simple-hash" forma | ||||
| t="default"/>) and the predictable linear identifiers (described in <xref target | ||||
| ="trad_selection" format="default"/>). Additionally, an implementation can furth | ||||
| er limit the attacker's ability to perform traffic analysis by further separatin | ||||
| g the increment space (that is, using a larger value for TABLE_LENGTH) and/or by | ||||
| randomizing the increments (i.e., increment() returning a small random number a | ||||
| s opposed to the constant "1").</t> | ||||
| <t>Otherwise, this algorithm does not suffer from the issues discussed | ||||
| in <xref target="vulns" format="default"/>.</t> | ||||
| </section> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="vulns" numbered="true" toc="default"> | ||||
| <name>Common Vulnerabilities Associated with Transient Numeric Identifiers | ||||
| </name> | ||||
| <section anchor="activity-correlation" numbered="true" toc="default"> | ||||
| <name>Network Activity Correlation</name> | ||||
| <t>An identifier that is predictable within a given context allows for n | ||||
| etwork activity correlation within that context.</t> | ||||
| <t>For example, a stable IPv6 Interface Identifier allows for network ac | ||||
| tivity to be correlated within the context in which the Interface Identifier is | ||||
| stable <xref target="RFC7721" format="default"/>. A stable per-network IPv6 Inte | ||||
| rface Identifier (as in <xref target="RFC7217" format="default"/>) allows for ne | ||||
| twork activity correlation within a network, whereas a constant IPv6 Interface I | ||||
| dentifier (which remains constant across networks) allows not only network activ | ||||
| ity correlation within the same network but also across networks ("host-tracking | ||||
| "). | ||||
| </t> | </t> | |||
| <t>Similarly, an implementation that generates TCP ISNs with a global co | ||||
| <t>The 'table[]' array assures that successive transient numeric identifiers for | unter could allow for fingerprinting and network activity correlation across net | |||
| a given context will be monotonically-increasing. Since the increments space is | works, since an attacker could passively infer the identity of the victim based | |||
| separated into TABLE_LENGTH different spaces, the identifier reuse frequency wi | on the TCP ISNs employed for subsequent communication instances. Similarly, an i | |||
| ll be (probabilistically) lower than that of the algorithm in <xref target="simp | mplementation that generates predictable IPv6 Identification values could be sub | |||
| le-hash"/>. That is, the generation of an identifier for one given context will | ject to fingerprinting attacks (see, e.g., <xref target="Bellovin2002" format="d | |||
| not necessarily result in increments in the identifier sequence of other context | efault"/>). | |||
| s. It is interesting to note that the size of 'table[]' does not limit the numbe | ||||
| r of different identifier sequences, but rather separates the *increment space* | ||||
| into TABLE_LENGTH different spaces. The selected transient numeric identifier se | ||||
| quence will be obtained by adding the corresponding entry from 'table[]' to the | ||||
| value in the 'offset' variable, which selects the actual identifier sequence spa | ||||
| ce (as in the algorithm from <xref target="simple-hash"/>). </t> | ||||
| <t>An attacker can perform traffic analysis for any "increment | ||||
| space" (i.e., context) into which the attacker has "visibility" | ||||
| ; -- namely, the attacker can force a system to generate identifiers for G(CONTE | ||||
| XT, secret_key2), where the result of G() identifies the target "increment | ||||
| space". However, the attacker's ability to perform traffic analysis is very | ||||
| reduced when compared to the simple PRF-based identifiers (described in <xref t | ||||
| arget="simple-hash"/>) and the predictable linear identifiers (described in <xre | ||||
| f target="trad_selection"/>). Additionally, an implementation can further limit | ||||
| the attacker's ability to perform traffic analysis by further separating the inc | ||||
| rement space (that is, using a larger value for TABLE_LENGTH) and/or by randomiz | ||||
| ing the increments (i.e., increment() returning a small random number as opposed | ||||
| to the constant "1").</t> | ||||
| <t>Otherwise, this algorithm does not suffer from the issues discussed in <xref | ||||
| target="vulns"/>.</t> | ||||
| </section> | ||||
| </section> | ||||
| </section> | ||||
| <section title="Common Vulnerabilities Associated with Transient Numeric Identif | ||||
| iers" anchor="vulns"> | ||||
| <section title="Network Activity Correlation" anchor="activity-correlation"> | ||||
| <t>An identifier that is predictable within a given context allows for network a | ||||
| ctivity correlation within that context.</t> | ||||
| <t>For example, a stable IPv6 Interface Identifier allows for network activity t | ||||
| o be correlated within the context in which the Interface Identifier is stable < | ||||
| xref target="RFC7721"/>. A stable-per-network IPv6 Interface Identifier (as in < | ||||
| xref target="RFC7217"/>) allows for network activity correlation within a networ | ||||
| k, whereas a constant IPv6 Interface Identifier (that remains constant across ne | ||||
| tworks) allows not only network activity correlation within the same network, bu | ||||
| t also across networks ("host tracking"). | ||||
| </t> | </t> | |||
| </section> | ||||
| <t>Similarly, an implementation that generates TCP ISNs with a global counter co | <section anchor="information-leakage" numbered="true" toc="default"> | |||
| uld allow for fingerprinting and network activity correlation across networks, s | <name>Information Leakage</name> | |||
| ince an attacker could passively infer the identity of the victim based on the T | <t>Transient numeric identifiers that result in specific patterns can pr | |||
| CP ISNs employed for subsequent communication instances. Similarly, an implement | oduce an information leakage to other communicating entities. For example, it is | |||
| ation that generates predictable IPv6 Fragment Identification values could be su | common to generate transient numeric identifiers with an algorithm such as: | |||
| bject to fingerprinting attacks (see e.g. <xref target="Bellovin2002"/>). | ||||
| </t> | </t> | |||
| </section> | <sourcecode type="c"><![CDATA[ | |||
| ID = offset(CONTEXT) + mono(CONTEXT); | ||||
| <section title="Information Leakage" anchor="information-leakage"> | ]]></sourcecode> | |||
| <t>Transient numeric identifiers that result in specific patterns can produce an | <t> | |||
| information leakage to other communicating entities. For example, it is common | ||||
| to generate transient numeric identifiers with an algorithm such as: | ||||
| <figure align="center"> | ||||
| <artwork align="center"><![CDATA[ | ||||
| ID = offset(CONTEXT) + mono(CONTEXT); | ||||
| ]]></artwork> | ||||
| <postamble></postamble> | ||||
| </figure> | ||||
| This generic expression generates identifiers by adding a monotonically-increasi | ||||
| ng function (e.g. linear) to a randomized offset. offset() is constant within a | ||||
| given context, whereas mono() produces a monotonically-increasing sequence for t | ||||
| he given context. Identifiers generated with this expression will generally be p | ||||
| redictable within CONTEXT. <!--Additionally, information associated with the inc | ||||
| rements will be "leaked" within CONTEXT_2. When both CONTEXT_1 and CONTEXT_2 are | ||||
| constant values, then the corresponding transient numeric identifiers become pr | ||||
| edictable in all contexts.--> | ||||
| <!-- | ||||
| <list style="hanging"> | ||||
| <t> | This generic expression generates identifiers by adding a monotonically increasi | |||
| NOTE: If CONTEXT_1 is constant, and an attacker can sample ID values, the | ng function (e.g., linear) to a randomized offset. offset() is constant within a | |||
| resulting identifiers may leak even more information. For example, if Fragment I | given context, whereas mono() produces a monotonically increasing sequence for | |||
| dentification values are generated | the given context. Identifiers generated with this expression will generally be | |||
| with the generic function above, CONTEXT_1 is constant, and mono() is a li | predictable within CONTEXT. </t> | |||
| near function, then the corresponding identifiers will leak the number of fragme | <t keepWithPrevious="true"/> | |||
| nted datagrams sent for CONTEXT_2. If both CONTEXT_1 and CONTEXT_2 are constant | ||||
| , and mono() is a linear function, then Fragment Identification values will be g | ||||
| enerated with a global counter (initialized to offset()), and thus each generate | ||||
| d Fragment Identification value will leak the number of fragmented datagrams tra | ||||
| nsmitted by the node since it has been bootstrapped. | ||||
| </t> | ||||
| </list> | <t>The predictability of mono(), irrespective of the predictability of o | |||
| ffset(), can leak information that may be of use to attackers. For example, a no | ||||
| de that selects transport-protocol ephemeral port numbers, as in:</t> | ||||
| <sourcecode type="c"><![CDATA[ | ||||
| ephemeral_port = offset(IP_Dst_Addr) + mono() | ||||
| ]]></sourcecode> | ||||
| <t> | ||||
| that is, with a per-destination offset but a global mono() function (e.g., a glo | ||||
| bal counter), will leak information about the total number of outgoing connectio | ||||
| ns that have been issued by the vulnerable implementation.</t> | ||||
| <t keepWithPrevious="true"/> | ||||
| <t>Similarly, a node that generates IPv6 Identification values as in: | ||||
| </t> | </t> | |||
| <sourcecode type="c"><![CDATA[ | ||||
| <t>The predictability of mono(), irrespective of the predictability of offset(), | ID = offset(IP_Src_Addr, IP_Dst_Addr) + mono() | |||
| can leak information that may be of use to attackers. For example, a node that | ]]></sourcecode> | |||
| selects ephemeral port numbers as in: | <t> | |||
| will leak out information about the total number of fragmented packets that have | ||||
| <figure align="center"> | been transmitted by the vulnerable implementation. The vulnerabilities describe | |||
| <artwork align="center"><![CDATA[ | d in <xref target="Sanfilippo1998a" format="default"/>, <xref target="Sanfilippo | |||
| ephemeral_port = offset(Dest_IP) + mono() | 1998b" format="default"/>, and <xref target="Sanfilippo1999" format="default"/> | |||
| ]]></artwork> | are all associated with the use of a global mono() function (i.e., with a global | |||
| <postamble></postamble> | and constant "CONTEXT") -- particularly when it is a linear function (constant | |||
| </figure> | increments of 1). | |||
| that is, with a per-destination offset, but a global mono() function (e.g., a gl | ||||
| obal counter), will leak information about total number of outgoing connections | ||||
| that have been issued by the vulnerable implementation.</t> | ||||
| <t>Similarly, a node that generates Fragment Identification values as in: | ||||
| <figure align="center"> | ||||
| <artwork align="center"><![CDATA[ | ||||
| Frag_ID = offset(IP_src_addr, IP_dst_addr) + mono() | ||||
| ]]></artwork> | ||||
| <postamble></postamble> | ||||
| </figure> | ||||
| will leak out information about the total number of fragmented packets that have | ||||
| been transmitted by the vulnerable implementation. The vulnerabilities describe | ||||
| d in <xref target="Sanfilippo1998a"/>, <xref target="Sanfilippo1998b"/>, and <xr | ||||
| ef target="Sanfilippo1999"/> are all associated with the use of a global mono() | ||||
| function (i.e., with a global and constant "context") -- particularly when it is | ||||
| a linear function (constant increments of 1). | ||||
| </t> | </t> | |||
| <t>Predicting transient numeric identifiers can be of help for other typ | ||||
| <t>Predicting transient numeric identifiers can be of help for other types of at | es of attacks. For example, predictable TCP ISNs can open the door to trivial co | |||
| tacks. For example, predictable TCP ISNs can open the door to trivial connection | nnection-reset and data injection attacks (see <xref target="injection-attacks" | |||
| -reset and data injection attacks (see <xref target="injection-attacks"/>). | format="default"/>). | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="fingerprinting" numbered="true" toc="default"> | |||
| <name>Fingerprinting</name> | ||||
| <section title="Fingerprinting" anchor="fingerprinting"> | <t>Fingerprinting is the capability of an attacker to identify or reiden | |||
| <t>Fingerprinting is the capability of an attacker to identify or re-identify a | tify a visiting user, user agent, or device via configuration settings or other | |||
| visiting user, user agent or device via configuration settings or other observab | observable characteristics. Observable protocol objects and characteristics can | |||
| le characteristics. Observable protocol objects and characteristics can be emplo | be employed to identify/reidentify | |||
| yed to identify/re-identify | various entities. These entities can range from the underlying hardware or opera | |||
| a variety of entities, ranging from the underlying hardware or Operating | ting | |||
| System (vendor, type and version), to the user itself (i.e. his/her | system (OS) (vendor, type, and version) to the user. <xref target="EFF" format=" | |||
| identity). <xref target="EFF"/> illustrates web browser-based fingerprinting, bu | default"/> illustrates web-browser-based fingerprinting, but | |||
| t | ||||
| similar techniques can be applied at other layers and protocols, whether | similar techniques can be applied at other layers and protocols, whether | |||
| alternatively or in conjunction with it.</t> | alternatively or in conjunction with it.</t> | |||
| <t> | ||||
| <t> | Transient numeric identifiers are one of the observable protocol components that | |||
| Transient numeric identifiers are one of the observable protocol components that | could be leveraged for fingerprinting purposes. That is, an attacker could samp | |||
| could be leveraged for fingerprinting purposes. That is, an attacker could samp | le transient numeric identifiers to infer the algorithm (and its associated para | |||
| le transient numeric identifiers to infer the algorithm (and its associated para | meters, if any) for generating such identifiers, possibly revealing the underlyi | |||
| meters, if any) for generating such identifiers, possibly revealing the underlyi | ng OS vendor, type, and version. This information could possibly be further leve | |||
| ng Operating System (OS) vendor, type, and version. This information could possi | raged in conjunction with other fingerprinting techniques and sources. | |||
| bly be further leveraged in conjunction with other fingerprinting techniques and | ||||
| sources. | ||||
| </t> | </t> | |||
| <t> | ||||
| Evasion of protocol-stack fingerprinting can prove to be a very difficult task, | ||||
| i.e., most systems make use of a wide variety of protocols, each of which have a | ||||
| large number of parameters that can be set to arbitrary values or generated wit | ||||
| h a variety of algorithms with multiple parameters. | ||||
| <t> | </t> | |||
| Evasion of protocol-stack fingerprinting can prove to be a very difficult task: | <aside><t>NOTE: General protocol-based fingerprinting is discussed in | |||
| most systems make use of a wide variety of protocols, each of which have a large | <xref target="RFC6973" format="default"/>, | |||
| number of parameters that can be set to arbitrary values or generated with a va | ||||
| riety of algorithms with multiple parameters. | ||||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| General protocol-based fingerprinting is discussed in <xref target="RFC6973"/ | ||||
| >, | ||||
| along with guidelines to mitigate the associated vulnerability. | along with guidelines to mitigate the associated vulnerability. | |||
| <xref target="Fyodor1998"/> and <xref target="Fyodor2006"/> are classic refer | <xref target="Fyodor1998" format="default"/> and <xref target="Fyodor2006" fo | |||
| ences | rmat="default"/> are classic references | |||
| on Operating System detection via TCP/IP stack fingerprinting. | on OS detection via TCP/IP stack fingerprinting. | |||
| Nmap <xref target="nmap"/> is probably the most popular tool for remote OS | Network Mapper <xref target="nmap" format="default"/> is probably the most po | |||
| identification via active TCP/IP stack fingerprinting. p0f <xref target="Zale | pular tool for remote OS | |||
| wski2012"/>, | identification via active TCP/IP stack fingerprinting. p0f <xref target="Zale | |||
| wski2012" format="default"/>, | ||||
| on the other hand, is a tool for performing remote OS detection via | on the other hand, is a tool for performing remote OS detection via | |||
| passive TCP/IP stack fingerprinting. Finally, <xref target="TBIT"/> is a TCP | passive TCP/IP stack fingerprinting. Finally, <xref target="TBIT" format="def | |||
| fingerprinting tool that aims at characterizing the behaviour of a | ault"/> is a TCP | |||
| remote TCP peer based on active probes, and which has been widely | fingerprinting tool that aims at characterizing the behavior of a | |||
| remote TCP peer based on active probes, which has been widely | ||||
| used in the research community. | used in the research community. | |||
| </t></aside> | ||||
| <t> | ||||
| Algorithms that, from the perspective of an observer (e.g., the legitimate commu | ||||
| nicating peer), result in specific values or patterns will allow for at least so | ||||
| me level of fingerprinting. For example, | ||||
| the algorithm from <xref target="cat-3-alg" format="default"/> will typically al | ||||
| low fingerprinting within the context where the resulting identifiers are stable | ||||
| . Similarly, the algorithms from <xref target="cat-4-alg" format="default"/> wil | ||||
| l result in monotonically increasing sequences within a given context, thus allo | ||||
| wing for at least some level of fingerprinting (when the other communicating ent | ||||
| ity can correlate different sampled identifiers as belonging to the same monoton | ||||
| ically increasing sequence). | ||||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | Thus, where possible, algorithms from <xref target="cat-1-alg" format="default"/ | |||
| > should be preferred over algorithms that result in specific values or patterns | ||||
| <t> | . | |||
| Algorithms that, from the perspective of an observer (e.g., the legitimate commu | ||||
| nicating peer), result in specific values or patterns, will allow for at least s | ||||
| ome level of fingerprinting. For example, | ||||
| the algorithm from <xref target="cat-3-alg"/> will typically allow fingerprintin | ||||
| g within the context where the resulting identifiers are stable. Similarly, the | ||||
| algorithms from <xref target="cat-4-alg"/> will result in a monotonically-increa | ||||
| sing sequences within a given context, thus allowing for at least some level of | ||||
| fingerprinting (when the other communicating entity can correlate different samp | ||||
| led identifiers as belonging to the same monotonically-increasing sequence). | ||||
| </t> | ||||
| <t> | ||||
| Thus, where possible, algorithms from <xref target="cat-1-alg"/> should be prefe | ||||
| rred over algorithms that result in specific values or patterns. | ||||
| </t> | ||||
| </section> | ||||
| <section title="Exploitation of the Semantics of Transient Numeric Identifiers" | ||||
| anchor="id-semantics"> | ||||
| <t>Identifiers that are not semantically opaque tend to be more predictable than | ||||
| semantically-opaque identifiers. For example, a MAC address contains an OUI (Or | ||||
| ganizationally-Unique Identifier) which may identify the vendor that manufacture | ||||
| d the corresponding network interface card. This can be leveraged by an attacker | ||||
| trying to "guess" MAC addresses, who has some knowledge about the possible Netw | ||||
| ork Interface Card (NIC) vendor.</t> | ||||
| <t><xref target="RFC7707"/> discusses a number of techniques to reduce the searc | ||||
| h space when performing IPv6 address-scanning attacks by leveraging the semantic | ||||
| s of the IIDs produced by traditional SLAAC algorithms (eventually replaced by < | ||||
| xref target="RFC7217"/>) that embed MAC addresses in the IID of IPv6 addresses. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="id-semantics" numbered="true" toc="default"> | ||||
| <section title="Exploitation of Collisions of Transient Numeric Identifiers" anc | <name>Exploitation of the Semantics of Transient Numeric Identifiers</na | |||
| hor="id-collisions"> | me> | |||
| <t>In many cases, the collision of transient network identifiers can have a hard | <t>Identifiers that are not semantically opaque tend to be more predicta | |||
| failure severity (or result in a hard failure severity if an attacker can cause | ble than semantically opaque identifiers. For example, a Media Access Control (M | |||
| multiple collisions deterministically, one after another). For example, predict | AC) address contains an Organizationally Unique Identifier (OUI), which may ide | |||
| able Fragment Identification values open the door to Denial of Service (DoS) att | ntify the vendor that manufactured the corresponding network interface card. Thi | |||
| acks (see e.g. <xref target="RFC5722"/>.). | s can be leveraged by an attacker trying to "guess" MAC addresses, who has some | |||
| knowledge about the possible Network Interface Card (NIC) vendor.</t> | ||||
| <t><xref target="RFC7707" format="default"/> discusses a number of techn | ||||
| iques to reduce the search space when performing IPv6 address-scanning attacks b | ||||
| y leveraging the semantics of IPv6 IIDs. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="id-collisions" numbered="true" toc="default"> | ||||
| <section title="Exploitation of Predictable Transient Numeric Identifiers for In | <name>Exploitation of Collisions of Transient Numeric Identifiers</name> | |||
| jection Attacks" anchor="injection-attacks"> | <t>In many cases, the collision of transient network identifiers can hav | |||
| <t>Some protocols rely on "sequence numbers" for the validation of incoming pack | e a hard failure severity (or result in a hard failure severity if an attacker c | |||
| ets. For example, TCP employs sequence numbers for reassembling TCP segments, wh | an cause multiple collisions deterministically, one after another). For example, | |||
| ile IPv4 and IPv6 employ Fragment Identification values for reassembling IPv4 an | predictable IP Identification values open the door to Denial of Service (DoS) a | |||
| d IPv6 fragments (respectively). Lacking built-in cryptographic mechanisms for v | ttacks (see, e.g., <xref target="RFC5722" format="default"/>.). | |||
| alidating packets, these protocols are therefore vulnerable to on-path data (see | ||||
| e.g. <xref target="Joncheray1995"/>) and/or control-information (see e.g. <xref | ||||
| target="RFC4953"/> and <xref target="RFC5927"/>) injection attacks. The extent | ||||
| to which these protocols may resist off-path (i.e. "blind") injection attacks de | ||||
| pends on whether the associated "sequence numbers" are predictable, and effort r | ||||
| equired to successfully predict a valid "sequence number" (see e.g. <xref target | ||||
| ="RFC4953"/> and <xref target="RFC5927"/>). | ||||
| </t> | </t> | |||
| </section> | ||||
| <t>We note that the use of unpredictable "sequence numbers" is a completely-inef | <section anchor="injection-attacks" numbered="true" toc="default"> | |||
| fective mitigation for on-path injection attacks, and also a mostly-ineffective | <name>Exploitation of Predictable Transient Numeric Identifiers for Inje | |||
| mitigation for off-path (i.e. "blind") injection attacks. However, many legacy p | ction Attacks</name> | |||
| rotocols (such as TCP) do not natively incorporate cryptographic mitigations, bu | <t>Some protocols rely on "sequence numbers" for the validation of incom | |||
| t rather only as optional features (see e.g. <xref target="RFC5925"/>), if at al | ing packets. For example, TCP employs sequence numbers for reassembling TCP segm | |||
| l available. Additionally, ad-hoc use of cryptographic mitigations might not be | ents, while IPv4 and IPv6 employ Identification values for reassembling IPv4 and | |||
| sufficient to relieve a protocol implementation of generating appropriate transi | IPv6 fragments (respectively). Lacking built-in cryptographic mechanisms for va | |||
| ent numeric identifiers. For example, use of the Transport Layer Security (TLS) | lidating packets, these protocols are therefore vulnerable to on-path data (see, | |||
| protocol <xref target="RFC8446"/> with TCP will protect the application protocol | e.g., <xref target="Joncheray1995" format="default"/>) and/or control-informat | |||
| , but will not help to mitigate e.g. TCP-based connection-reset attacks (see e.g | ion (see, e.g., <xref target="RFC4953" format="default"/> and <xref target="RFC5 | |||
| . <xref target="RFC4953"/>). Similarly, use of SEcure Neighbor Discovery (SEND) | 927" format="default"/>) injection attacks. The extent to which these protocols | |||
| <xref target="RFC3971"/> will still imply reliance on the successful reassembly | may resist off-path (i.e., "blind") injection attacks depends on whether the ass | |||
| of IPv6 fragments in those cases where SEND packets do not fit into the link Max | ociated "sequence numbers" are predictable and the effort required to successful | |||
| imum Transmission Unit (MTU) (see <xref target="RFC6980"/>).</t> | ly predict a valid "sequence number" (see, e.g., <xref target="RFC4953" format=" | |||
| default"/> and <xref target="RFC5927" format="default"/>). | ||||
| </section> | ||||
| <section title="Cryptanalysis" anchor="crypto-analisis"> | ||||
| <t>A number of algorithms discussed in this document (such as those described in | ||||
| <xref target="simple-hash"/> and <xref target="double-hash"/>) rely on PRFs. Im | ||||
| plementations that employ weak PRFs or keys of inappropriate size can be subject | ||||
| to cryptanalysis, where an attacker can obtain the secret key employed for the | ||||
| PRF, predict numeric identifiers, etc. </t> | ||||
| <t>Furthermore, an implementation that overloads the semantics of the secret key | ||||
| can result in more trivial cryptanalysis, possibly resulting in the leakage of | ||||
| the value employed for the secret key. | ||||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| <xref target="IPID-DEV"/> describes two vulnerable transient numeric ID generato | ||||
| rs that employ cryptographically-weak hash functions. Additionally, one of such | ||||
| implementations employs 32-bits of a kernel address as the secret key for a hash | ||||
| function, and therefore successful cryptanalysis leaks the aforementioned kerne | ||||
| l address, allowing for Kernel Address Space Layout Randomization (KASLR) <xref | ||||
| target="KASLR"/> bypass. | ||||
| </t> | </t> | |||
| </list> | <t>We note that the use of unpredictable "sequence numbers" is a completely inef | |||
| fective mitigation for on-path injection attacks and also a mostly ineffective m | ||||
| itigation for off-path (i.e., "blind") injection attacks. | ||||
| However, many legacy protocols (such as TCP) do not incorporate cryptographic mi | ||||
| tigations as part of the core protocol but rather as optional features (see, e.g | ||||
| ., <xref target="RFC5925" format="default"/>), if available at all. | ||||
| Additionally, ad hoc use of cryptographic mitigations might not be sufficient to | ||||
| relieve a protocol implementation of generating appropriate transient numeric i | ||||
| dentifiers. For example, use of the Transport Layer Security (TLS) protocol <xre | ||||
| f target="RFC8446" format="default"/> with TCP will protect the application prot | ||||
| ocol but will not help to mitigate, e.g., TCP-based connection-reset attacks (se | ||||
| e, e.g., <xref target="RFC4953" format="default"/>). Similarly, use of SEcure Ne | ||||
| ighbor Discovery (SEND) <xref target="RFC3971" format="default"/> will still imp | ||||
| ly reliance on the successful reassembly of IPv6 fragments in those cases where | ||||
| SEND packets do not fit into the link Maximum Transmission Unit (MTU) (see <xref | ||||
| target="RFC6980" format="default"/>).</t> | ||||
| </section> | ||||
| <section anchor="crypto-analisis" numbered="true" toc="default"> | ||||
| <name>Cryptanalysis</name> | ||||
| <t>A number of algorithms discussed in this document (such as those desc | ||||
| ribed in Sections <xref target="simple-hash" format="counter"/> and <xref target | ||||
| ="double-hash" format="counter"/>) rely on PRFs. Implementations that employ wea | ||||
| k PRFs or keys of inappropriate size can be subject to cryptanalysis, where an a | ||||
| ttacker can obtain the secret key employed for the PRF, predict numeric identifi | ||||
| ers, etc. </t> | ||||
| <t>Furthermore, an implementation that overloads the semantics of the se | ||||
| cret key can result in more trivial cryptanalysis, possibly resulting in the lea | ||||
| kage of the value employed for the secret key. | ||||
| </t> | </t> | |||
| </section> | <aside><t>NOTE: <xref target="IPID-DEV" format="default"/> describes t | |||
| </section> | wo vulnerable transient numeric identifier generators that employ cryptographica | |||
| lly weak hash functions. Additionally, one of such implementations employs 32 bi | ||||
| <section title="Vulnerability Assessment of Transient Numeric Identifiers" ancho | ts of a kernel address as the secret key for a hash function, and therefore, suc | |||
| r="vuln-cats"> | cessful cryptanalysis leaks the aforementioned kernel address, allowing for Kern | |||
| <t> | el Address Space Layout Randomization (KASLR) <xref target="KASLR" format="defau | |||
| The following subsections analyze possible vulnerabilities associated with the a | lt"/> bypass.</t></aside> | |||
| lgorithms described in <xref target="common-algorithms"/>. | </section> | |||
| </section> | ||||
| <section anchor="vuln-cats" numbered="true" toc="default"> | ||||
| <name>Vulnerability Assessment of Transient Numeric Identifiers</name> | ||||
| <t> | ||||
| The following subsections analyze possible vulnerabilities associated with the a | ||||
| lgorithms described in <xref target="common-algorithms" format="default"/>. | ||||
| </t> | </t> | |||
| <section anchor="cat-1-vuln" numbered="true" toc="default"> | ||||
| <section title="Category #1: Uniqueness (soft failure)" anchor="cat-1-vuln"> | <name>Category #1: Uniqueness (Soft Failure)</name> | |||
| <t>Possible vulnerabilities associated with the algorithms from <xref target="ca | <t>Possible vulnerabilities associated with the algorithms from <xref ta | |||
| t-1-alg"/> include: | rget="cat-1-alg" format="default"/> include the following: | |||
| <list style="symbols"> | ||||
| <t>Use of flawed PRNGs (please see e.g. <xref target="Zalewski2001"/>, <xref tar | ||||
| get="Zalewski2002"/>, <xref target="Klein2007"/> and <xref target="CVEs"/>).</t> | ||||
| <t>Inadvertently affecting the distribution of an otherwise suitable PRNG (pleas | ||||
| e see e.g. <xref target="Romailler2020"/>).</t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <ul spacing="normal"> | ||||
| <li>use of flawed PRNGs (please see, e.g., <xref target="Zalewski2001" | ||||
| format="default"/>, <xref target="Zalewski2002" format="default"/>, <xref targe | ||||
| t="Klein2007" format="default"/>, and <xref target="CVEs" format="default"/>)</l | ||||
| i> | ||||
| <li>inadvertently affecting the distribution of an otherwise suitable | ||||
| PRNG (please see, e.g., <xref target="Romailler2020" format="default"/>)</li> | ||||
| </ul> | ||||
| <t>Where available, CSPRNGs should be preferred over regular PRNGs, such | ||||
| as, e.g., POSIX random(3) implementations. In scenarios where a CSPRNG is not r | ||||
| eadily available, a security and privacy assessment of employing a regular PRNG | ||||
| should be performed, supporting the implementation decision. | ||||
| <t>Where available, CSPRNGs should be preferred over regular PRNGs such as e.g. | ||||
| POSIX random(3) implementations. In scenarios where a CSPRNG is not readily avai | ||||
| lable, a security and privacy assessment of employing a regular PRNG should be p | ||||
| erformed, supporting the implementation decision. | ||||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| Please see <xref target="RFC4086"/> regarding randomness requirements for securi | ||||
| ty. <xref target="Aumasson2018"/>, <xref target="Press1992"/>, and <xref target= | ||||
| "Knuth1983"/>, discuss theoretical and practical aspects of random numbers gener | ||||
| ation, and provide guidance on how to evaluate PRNGs.</t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <aside><t>NOTE: Please see <xref target="RFC4086" format="default"/> r | ||||
| <t>When employing a PRNG, many implementations "adapt" the length of its output | egarding randomness requirements for security. <xref target="Aumasson2018" forma | |||
| with a modulo operator (e.g., C language's "%"), possibly changing the distribut | t="default"/>, <xref target="Press1992" format="default"/>, and <xref target="Kn | |||
| ion of the output of the PRNG.</t> | uth1983" format="default"/> discuss theoretical and practical aspects of random | |||
| number generation and provide guidance on how to evaluate PRNGs.</t></aside> | ||||
| <t> | <t>When employing a PRNG, many implementations "adapt" the length of its | |||
| output with a modulo operator (e.g., C language's "%"), possibly changing the d | ||||
| istribution of the output of the PRNG.</t> | ||||
| <t> | ||||
| For example, consider an implementation that employs the following code: | For example, consider an implementation that employs the following code: | |||
| <figure align="center"> | ||||
| <artwork align="center"><![CDATA[ | ||||
| id = random() % 50000; | ||||
| ]]></artwork> | ||||
| <postamble></postamble> | ||||
| </figure> | ||||
| This example implementation means to obtain a transient numeric identifier in th | ||||
| e range 0-49999. If random() produces e.g. a pseudorandom number of 16 bits (wit | ||||
| h uniform distribution), the selected transient numeric identifier will have a n | ||||
| on-uniform distribution with the numbers in the range 0-15535 having double-freq | ||||
| uency than the numbers in the range 15536-49999. | ||||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| For example, in our sample code both an output of 10 and output of 50010 from th | ||||
| e random() function will result in an 'id' value of 10. | ||||
| </t> | </t> | |||
| </list> | <sourcecode type="c"><![CDATA[ | |||
| id = random() % 50000; | ||||
| This effect is reduced if the PRNG produces an output that is much longer than t | ]]></sourcecode> | |||
| he length implied by the modulo operation. We note that to preserve a uniform di | <t> | |||
| stribution, the rejection sampling technique <xref target="Romailler2020"/> can | This example implementation means to obtain a transient numeric identifier in th | |||
| be used. | e range 0-49999. If random() produces, e.g., a pseudorandom number of 16 bits (w | |||
| ith uniform distribution), the selected transient numeric identifier will have a | ||||
| nonuniform distribution with the numbers in the range 0-15535 having double fre | ||||
| quency than the numbers in the range 15536-49999. | ||||
| </t> | </t> | |||
| <t keepWithPrevious="true"/> | ||||
| <aside><t>NOTE: For example, in our sample code, both an output of 10 | ||||
| and output of 50010 from the random() function will result in an "id" value of 1 | ||||
| 0. | ||||
| </t></aside> | ||||
| <t> | <t> | |||
| This effect is reduced if the PRNG produces an output that is much longer than t | ||||
| he length implied by the modulo operation. We note that to preserve a uniform di | ||||
| stribution, the rejection sampling technique <xref target="Romailler2020" format | ||||
| ="default"/> can be used. | ||||
| </t> | ||||
| <t> | ||||
| Use of algorithms other than PRNGs for generating identifiers of this category i s discouraged. | Use of algorithms other than PRNGs for generating identifiers of this category i s discouraged. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="cat-2-vuln" numbered="true" toc="default"> | |||
| <name>Category #2: Uniqueness (Hard Failure)</name> | ||||
| <section title="Category #2: Uniqueness (hard failure)" anchor="cat-2-vuln"> | <t>As noted in <xref target="cat-2-alg" format="default"/>, this categor | |||
| <t>As noted in <xref target="cat-2-alg"/>, this category can employ the same alg | y can employ the same algorithms as Category #4, since a monotonically increasin | |||
| orithms as Category #4, since a monotonically-increasing sequence tends to minim | g sequence tends to minimize the transient numeric identifier reuse frequency. T | |||
| ize the transient numeric identifier reuse frequency. Therefore, the vulnerabili | herefore, the vulnerability analysis in <xref target="cat-4-vuln" format="defaul | |||
| ty analysis in <xref target="cat-4-vuln"/> also applies to this category. | t"/> also applies to this category. | |||
| </t> | </t> | |||
| <t>Additionally, as noted in <xref target="cat-2-alg" format="default"/> | ||||
| <t>Additionally, as noted in <xref target="cat-2-alg"/>, some transient numeric | , some transient numeric identifiers of this category might be able to use the a | |||
| identifiers of this category might be able to use the algorithms from <xref tar | lgorithms from <xref target="cat-1-alg" format="default"/>, in which case the s | |||
| get="cat-1-alg"/>, in which case the same considerations as in <xref target="cat | ame considerations as in <xref target="cat-1-vuln" format="default"/> would appl | |||
| -1-vuln"/> would apply. | y. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="cat-3-vuln" numbered="true" toc="default"> | ||||
| <name>Category #3: Uniqueness, Stable within Context (Soft Failure)</nam | ||||
| e> | ||||
| <section title="Category #3: Uniqueness, stable within context (soft failure)" a | <t>Possible vulnerabilities associated with the algorithms from <xref target="ca | |||
| nchor="cat-3-vuln"> | t-3-alg" format="default"/> are the following: | |||
| <!-- | ||||
| <t>There are three main vulnerabilities that may be associated with identifiers | ||||
| of this category: | ||||
| <list style="numbers"> | ||||
| <t>Use algorithms or sources that result in predictable identifiers</t> | ||||
| <t>Use cryptographically-weak hash functions, or inappropriate secret key sizes | ||||
| that allow for cryptanalysis</t> | ||||
| <t>Employing the same identifier across contexts in which stability is not requi | ||||
| red (overloading the numeric identifier)</t> | ||||
| </list> | ||||
| </t> | ||||
| <t>Possible vulnerabilities associated with the algorithms from <xref target="ca | ||||
| t-3-alg"/> are: | ||||
| <list style="numbers"> | ||||
| <t>Use of weak PRFs, or inappropriate secret keys (whether inappropriate selecti | ||||
| on or inappropriate size) could allow for cryptanalysis, which could eventually | ||||
| be exploited by an attacker to predict future transient numeric identifiers.</t> | ||||
| <t>Since the algorithm generates a unique and stable identifier within a specifi | ||||
| ed context, it may allow for network activity correlation and fingerprinting wit | ||||
| hin the specified context.</t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <ul spacing="normal"><li>Use of weak PRFs or inappropriate secret keys ( | ||||
| </section> | whether inappropriate selection or inappropriate size) could allow for cryptanal | |||
| ysis, which could eventually be exploited by an attacker to predict future trans | ||||
| <section title="Category #4: Uniqueness, monotonically increasing within context | ient numeric identifiers.</li> | |||
| (hard failure)" anchor="cat-4-vuln"> | <li>Since the algorithm generates a unique and stable identifier withi | |||
| <t>The algorithm described in <xref target="per-context-counter"/> for generatin | n a specified context, it may allow for network activity correlation and fingerp | |||
| g identifiers of Category #4 will result in an identifiable pattern (i.e. a mono | rinting within the specified context.</li> | |||
| tonically-increasing sequence) for the transient numeric identifiers generated f | </ul> | |||
| or each CONTEXT, and thus will allow for fingerprinting and network activity cor | </section> | |||
| relation within each CONTEXT. | <section anchor="cat-4-vuln" numbered="true" toc="default"> | |||
| <name>Category #4: Uniqueness, Monotonically Increasing within Context ( | ||||
| Hard Failure)</name> | ||||
| <t>The algorithm described in <xref target="per-context-counter" format= | ||||
| "default"/> for generating identifiers of Category #4 will result in an identifi | ||||
| able pattern (i.e., a monotonically increasing sequence) for the transient numer | ||||
| ic identifiers generated for each CONTEXT, and thus will allow for fingerprintin | ||||
| g and network activity correlation within each CONTEXT. | ||||
| </t> | </t> | |||
| <t>On the other hand, a simple way to generalize and analyze the algorit | ||||
| <t>On the other hand, a simple way to generalize and analyze the algorithms desc | hms described in Sections <xref target="simple-hash" format="counter"/> and <xre | |||
| ribed in <xref target="simple-hash"/> and <xref target="double-hash"/> for gener | f target="double-hash" format="counter"/> for generating identifiers of Category | |||
| ating identifiers of Category #4, is as follows: | #4 is as follows: | |||
| <figure> | </t> | |||
| <artwork> | <sourcecode type="c"><![CDATA[ | |||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| retry = id_range; | retry = id_range; | |||
| id_inc = increment() % id_range; | id_inc = increment() % id_range; | |||
| do { | do { | |||
| update_mono(CONTEXT, id_inc); | update_mono(CONTEXT, id_inc); | |||
| next_id = min_id + (offset(CONTEXT) + \ | next_id = min_id + (offset(CONTEXT) + \ | |||
| mono(CONTEXT)) % id_range; | mono(CONTEXT)) % id_range; | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry = retry - id_inc; | retry = retry - id_inc; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| ]]></sourcecode> | ||||
| </artwork> | <t>NOTE:</t> | |||
| </figure> | <t indent="3">increment() returns a small integer that is employed to | |||
| </t> | generate a monotonically increasing function. Most implementations employ a cons | |||
| tant value for "increment()" (usually 1). The value returned by increment() must | ||||
| <t> | be much smaller than the value computed for "id_range". | |||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| increment() returns a small integer that is employed to generate a monotonically | ||||
| -increasing function. Most implementations employ a constant value for "incremen | ||||
| t()" (usually 1). The value returned by increment() must be much smaller than th | ||||
| e value computed for "id_range". | ||||
| </t> | ||||
| <t> | ||||
| update_mono(CONTEXT, id_inc) increments the counter corresponding to CONTEXT by | ||||
| "id_inc". | ||||
| </t> | ||||
| <t> | ||||
| mono(CONTEXT) reads the counter corresponding to CONTEXT. | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t>Essentially, an identifier (next_id) is generated by adding a monotonically-i | ||||
| ncreasing function (mono()) to an offset value, unknown to the attacker and stab | ||||
| le for given context (CONTEXT).</t> | ||||
| <t>The following aspects of the algorithm should be considered: | ||||
| <list style="symbols"> | ||||
| <t>For the most part, it is the offset() function that results in identifiers th | ||||
| at are unpredictable by an off-patch attacker. While the resulting sequence is k | ||||
| nown to be monotonically-increasing, the use of a randomized offset value makes | ||||
| the resulting values unknown to the attacker.</t> | ||||
| <t>The most straightforward "stateless" implementation of offset() is with a PRF | ||||
| that takes the values that identify the context and a "secret_key" (not shown i | ||||
| n the figure above) as arguments. | ||||
| </t> | ||||
| <t> | ||||
| One possible implementation of mono() would be to have mono() internally employ | ||||
| a single counter (as in the algorithm from <xref target="simple-hash"/>), or map | ||||
| the increments for different contexts into a number of counters/buckets, such t | ||||
| hat the number of counters that need to be maintained in memory is reduced (as i | ||||
| n the algorithm from algorithm in <xref target="double-hash"/>). | ||||
| </t> | ||||
| <!-- | ||||
| <t> | ||||
| One possible implementation approach for mono() is to maintain per-context count | ||||
| ers, initialized to random values (as the algorithm from <xref target="per-conte | ||||
| xt-counter"/>). When a new identifier is to be selected, the corresponding count | ||||
| er is looked-up (based on the context) and incremented, to obtain a new transien | ||||
| t numeric identifier. For example, the algorithm in <xref target="per-context-co | ||||
| unter"/> could be such an implementation of mono(). Another possible implementa | ||||
| tion of mono() would be to have mono() internally employ a single counter (as in | ||||
| the algorithm from <xref target="simple-hash"/>), or map the increments for dif | ||||
| ferent contexts into a number of counters/buckets, such that the number of count | ||||
| ers that need to be maintained in memory is reduced (as in the algorithm from al | ||||
| gorithm in <xref target="double-hash"/>). | ||||
| </t> | ||||
| <t>In all cases, a monotonically increasing function is implemented by increment | ||||
| ing the previous value of a counter by increment() units. In the most trivial ca | ||||
| se, increment() could return the constant "1". But increment() could also be imp | ||||
| lemented to return small random integers such that the increments are unpredicta | ||||
| ble (see Appendix A of <xref target="RFC7739"/>). This represents a trade-off be | ||||
| tween the unpredictability of the resulting transient numeric IDs and the transi | ||||
| ent numeric ID reuse frequency. | ||||
| </t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <t indent="3">update_mono(CONTEXT, id_inc) increments the counter corresponding | ||||
| <t>Considering the generic algorithm illustrated above, we can identify the foll | to CONTEXT by "id_inc". | |||
| owing possible vulnerabilities: | ||||
| <list style="symbols"> | ||||
| <t>Since the algorithms for this category are similar to those of <xref target=" | ||||
| cat-3-vuln"/>, with the addition of a monotonically-increasing function, all the | ||||
| issues discussed in <xref target="cat-3-vuln"/> ("Category #3: Uniqueness, stab | ||||
| le within context (soft failure)") also apply to this case. | ||||
| </t> | </t> | |||
| <t indent="3">mono(CONTEXT) reads the counter corresponding to CONTEXT. | ||||
| <t>mono() can be correlated to the number of identifiers generated for a given c | ||||
| ontext (CONTEXT). Thus, if mono() spans more than the necessary context, the "in | ||||
| crements" could be leaked to other parties, thus disclosing information about th | ||||
| e number of identifiers that have been generated by the algorithm for all contex | ||||
| ts. This is information disclosure becomes more evident when an implementation e | ||||
| mploys a constant increment of 1. For example, an implementation where mono() is | ||||
| actually a single global counter, will unnecessarily leak information the numbe | ||||
| r of identifiers that have been generated by the algorithm (globally, for all co | ||||
| ntexts). <xref target="Fyodor2003"/> is one example of how such information leak | ||||
| ages can be exploited. We note that limiting the span of the increments space wi | ||||
| ll require a larger number of counters to be stored in memory (i.e., a larger va | ||||
| lue for the TABLE_LENGTH parameter of the algorithm in <xref target="double-hash | ||||
| "/>). | ||||
| </t> | </t> | |||
| <t>Essentially, an identifier (next_id) is generated by adding a monoton | ||||
| ically increasing function (mono()) to an offset value, which is unknown to the | ||||
| attacker and stable for given context (CONTEXT).</t> | ||||
| <t>The following aspects of the algorithm should be considered: | ||||
| <t>Transient numeric identifiers generated with the algorithms described in <xre f target="simple-hash"/> and <xref target="double-hash"/> will normally allow fo r fingerprinting within CONTEXT since, for such context, the resulting identifie rs will have an identifiable pattern (i.e. a monotonically-increasing sequence). | ||||
| </t> | </t> | |||
| <ul spacing="normal"> | ||||
| <li>For the most part, it is the offset() function that results in ide | ||||
| ntifiers that are unpredictable by an off-patch attacker. While the resulting se | ||||
| quence is known to be monotonically increasing, the use of a randomized offset v | ||||
| alue makes the resulting values unknown to the attacker.</li> | ||||
| <li>The most straightforward "stateless" implementation of offset() is | ||||
| with a PRF that takes the values that identify the context and a secret key (no | ||||
| t shown in the figure above) as arguments. | ||||
| </li> | ||||
| <li> | ||||
| One possible implementation of mono() would be to have mono() internally employ | ||||
| a single counter (as in the algorithm from <xref target="simple-hash" format="de | ||||
| fault"/>) or map the increments for different contexts into a number of counters | ||||
| /buckets, such that the number of counters that need to be maintained in memory | ||||
| is reduced (as in the "Double-PRF Algorithm" from <xref target="double-hash" for | ||||
| mat="default"/>). | ||||
| </li> | ||||
| </list> | <li>In all cases, a monotonically increasing function is implemented by incremen | |||
| ting the previous value of a counter by increment() units. In the most trivial c | ||||
| ase, increment() could return the constant "1". But increment() could also be im | ||||
| plemented to return small random integers such that the increments are unpredict | ||||
| able (see <xref target="random-increments"/> of this document). This represents | ||||
| a trade-off between the unpredictability of the resulting transient numeric iden | ||||
| tifiers and the transient numeric identifier reuse frequency. | ||||
| </li> | ||||
| </ul> | ||||
| <t>Considering the generic algorithm illustrated above, we can identify | ||||
| the following possible vulnerabilities: | ||||
| </t> | </t> | |||
| </section> | <ul spacing="normal"> | |||
| </section> | <li>Since the algorithms for this category are similar to those of <xr | |||
| ef target="cat-3-vuln" format="default"/>, with the addition of a monotonically | ||||
| <section title="IANA Considerations" anchor="iana-considerations"> | increasing function, all the issues discussed in <xref target="cat-3-vuln" forma | |||
| <t>This document has no IANA actions.</t> | t="default"/> ("Category #3: Uniqueness, Stable within Context (Soft Failure)") | |||
| </section> | also apply to this case. | |||
| </li> | ||||
| <section title="Security Considerations"> | <li>mono() can be correlated to the number of identifiers generated for a given | |||
| context (CONTEXT). Thus, if mono() spans more than the necessary context, the "i | ||||
| ncrements" could be leaked to other parties, thus disclosing information about t | ||||
| he number of identifiers that have been generated by the algorithm for all conte | ||||
| xts. This information disclosure becomes more evident when an implementation emp | ||||
| loys a constant increment of 1. | ||||
| <t>The entire document is about the security and privacy implications of | For example, an implementation where mono() is actually a single global counter | |||
| transient numeric identifiers. <xref target="I-D.gont-numeric-ids-sec-considerat | will unnecessarily leak information about the number of identifiers that have be | |||
| ions"/> recommends that protocol specifications specify the interoperability req | en generated by the algorithm (globally, for all contexts). <xref target="Fyodor | |||
| uirements of their transient numeric identifiers, perform a vulnerability assess | 2003" format="default"/> describes one example of how such information leakages | |||
| ment of their transient numeric identifiers, and suggest an algorithm for genera | can be exploited. We note that limiting the span of the increment space will req | |||
| ting each of their transient numeric identifiers. This document analyzes possibl | uire a larger number of counters to be stored in memory (i.e., a larger value fo | |||
| e algorithms (and their implications) that could be employed to comply with the | r the TABLE_LENGTH parameter of the algorithm in <xref target="double-hash" form | |||
| interoperability properties of most common categories of transient numeric ident | at="default"/>). | |||
| ifiers, while minimizing the associated negative security and privacy implicatio | </li> | |||
| ns.</t> | <li>Transient numeric identifiers generated with the algorithms descri | |||
| bed in Sections <xref target="simple-hash" format="counter"/> and <xref target=" | ||||
| double-hash" format="counter"/> will normally allow for fingerprinting within CO | ||||
| NTEXT since, for such context, the resulting identifiers will have an identifiab | ||||
| le pattern (i.e., a monotonically increasing sequence). | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section anchor="iana-considerations" numbered="true" toc="default"> | ||||
| <section title="Acknowledgements"> | <name>IANA Considerations</name> | |||
| <t>This document has no IANA actions.</t> | ||||
| <t>The authors would like to thank (in alphabetical order) Bernard Aboba, Jean-P | </section> | |||
| hilippe Aumasson, Steven Bellovin, Luis Leon Cardenas Graide, Spencer Dawkins, T | <section numbered="true" toc="default"> | |||
| heo de Raadt, Guillermo Gont, Joseph Lorenzo Hall, Gre Norcie, Colin Perkins, Vi | <name>Security Considerations</name> | |||
| ncent Roca, Shivan Sahib, Rich Salz, Martin Thomson, and Michael Tuexen, for pro | <t>This entire document is about the security and privacy implications of | |||
| viding valuable comments on earlier versions of this document.</t> | transient numeric identifiers. <xref target="RFC9416" format="default"/> recomme | |||
| nds that protocol specifications specify the interoperability requirements of th | ||||
| <t>The authors would like to thank Shivan Sahib and Christopher Wood, for their | eir transient numeric identifiers, perform a vulnerability assessment of their t | |||
| guidance during the publication process of this document.</t> | ransient numeric identifiers, and recommend an algorithm for generating each of | |||
| their transient numeric identifiers. This document analyzes possible algorithms | ||||
| <t>The authors would like to thank Jean-Philippe Aumasson and Mathew D. Green (J | (and their implications) that could be employed to comply with the interoperabil | |||
| ohn Hopkins University) for kindly answering a number of questions.</t> | ity requirements of the most common categories of transient numeric identifiers | |||
| while minimizing the associated negative security and privacy implications.</t> | ||||
| <t>The authors would like to thank Diego Armando Maradona for his magic and ins | ||||
| piration.</t> | ||||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title='Normative References'> | ||||
| <!-- | ||||
| <?rfc include="reference.RFC.2119" ?> | ||||
| <?rfc include="reference.RFC.8174" ?> | ||||
| <!-- TCP sequence numbers --> | ||||
| <?rfc include="reference.RFC.0793" ?> | ||||
| <?rfc include="reference.RFC.6528" ?> <!-- TCP SEQ randomization --> | ||||
| <!-- Port Randomization --> | ||||
| <?rfc include="reference.RFC.6056" ?> | ||||
| <!-- TCP-AO --> | ||||
| <?rfc include="reference.RFC.5925" ?> | ||||
| <!-- IPv4 --> | ||||
| <?rfc include="reference.RFC.0791" ?> | ||||
| <!-- IPv6 --> | ||||
| <?rfc include="reference.RFC.2460" ?> | ||||
| <?rfc include="reference.RFC.8200" ?> | ||||
| <?rfc include="reference.RFC.4086" ?> | ||||
| <?rfc include="reference.RFC.4291" ?> | ||||
| <?rfc include="reference.RFC.8981" ?> | ||||
| <?rfc include="reference.RFC.4862" ?> | ||||
| <?rfc include="reference.RFC.5722" ?> | ||||
| <?rfc include="reference.RFC.7217" ?> | ||||
| <?rfc include="reference.RFC.8064" ?> | ||||
| <!-- IPv6 Flow Label --> | <references> | |||
| <?rfc include="reference.RFC.6437" ?> | <name>References</name> | |||
| <references> | ||||
| <!-- TCP timestamps --> | <name>Normative References</name> | |||
| <?rfc include="reference.RFC.6191" ?> | ||||
| <?rfc include="reference.RFC.7323" ?> | ||||
| <!-- MD5 --> | ||||
| <?rfc include="reference.RFC.1321" ?> | ||||
| <?rfc include="reference.RFC.6151" ?> | ||||
| <!-- DNS --> | ||||
| <?rfc include="reference.RFC.1035" ?> | ||||
| </references> | ||||
| <references title='Informative References'> | ||||
| <!-- Timing attacks --> | ||||
| <!-- | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.07 | |||
| <reference anchor="Mayer2014" target="https://www.blackhat.com/docs/us-14 | 93.xml"/> | |||
| /materials/us-14-Mayer-Time-Trial-Racing-Towards-Practical-Timing-Attacks-WP.pdf | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | |||
| "> | 528.xml"/> | |||
| <front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.60 | |||
| <title>Time Trial: Racing Towards Practical Remote Timing | 56.xml"/> | |||
| Attacks</title> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.59 | |||
| <author initials="D." surname="Mayer" fullname="Daniel Ma | 25.xml"/> | |||
| yer"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.07 | |||
| <organization>Matasano</organization> | 91.xml"/> | |||
| </author> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
| <author initials="J." surname="Sandin" fullname="Joel San | 460.xml"/> | |||
| din"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| <organization>Matasano</organization> | 200.xml"/> | |||
| </author> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
| <date year="2014"/> | 086.xml"/> | |||
| </front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
| <seriesInfo name="BlackHat USA 2014 Conference," value="August 6- | 291.xml"/> | |||
| 7"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| </reference> | 981.xml"/> | |||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
| 862.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
| 722.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 217.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 064.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.64 | ||||
| 37.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.61 | ||||
| 91.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 323.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.13 | ||||
| 21.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
| 151.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.10 | ||||
| 35.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.59 | ||||
| 05.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.92 | ||||
| 93.xml"/> | ||||
| <!-- | </references> | |||
| <reference anchor="Crosby2009" target="https://www.cs.rice.edu/~dwallach/ | <references> | |||
| pub/crosby-timing2009.pdf"> | <name>Informative References</name> | |||
| <front> | ||||
| <title>Opportunities and Limits of Remote Timing Attacks< | ||||
| /title> | ||||
| <author initials="S. A." surname="Crosby" fullname="Scott | ||||
| A. Crosby"> | ||||
| <organization>Rice University</organization> | ||||
| </author> | ||||
| <author initials="D. S." surname="Wallach" fullname="Dan | ||||
| S. Wallach"> | ||||
| <organization>Rice University</organization> | ||||
| </author> | ||||
| <author initials="R. H." surname="Riedi" fullname="Rudolf | ||||
| H. Riedi"> | ||||
| <organization>Rice University</organization> | ||||
| </author> | ||||
| <date year="2009"/> | ||||
| </front> | ||||
| <seriesInfo name="ACM Trans. Inf. Syst. Secur. 12, 3, " value="Ar | ||||
| ticle 17 "/> | ||||
| </reference> | ||||
| <reference anchor="KASLR" target="https://pax.grsecurity.net/docs/aslr.tx t"> | <reference anchor="KASLR" target="https://pax.grsecurity.net/docs/aslr.tx t"> | |||
| <front> | <front> | |||
| <title>Address Space Layout Randomization</title> | <title>Address Space Layout Randomization</title> | |||
| <author initials="" surname="PaX Team" fullname="The Pax | <author> | |||
| Team"> | <organization>PaX Team</organization> | |||
| <organization></organization> | </author> | |||
| </author> | </front> | |||
| <date/> | ||||
| </front> | ||||
| <!-- | ||||
| <seriesInfo name="" value="Federal Information Processing Standar | ||||
| ds Publication 180-4"/> | ||||
| </reference> | ||||
| <reference anchor="IANA-PROT" target="https://www.iana.org/protocols"> | ||||
| <front> | ||||
| <title>Protocol Registries</title> | ||||
| <author initials="" surname="IANA" fullname="IANA"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date/> | ||||
| </front> | ||||
| <!-- | ||||
| <seriesInfo name="" value="Federal Information Processing Standar | ||||
| ds Publication 180-4"/> | ||||
| </reference> | ||||
| <!-- Fingerprinting --> | ||||
| <?rfc include="reference.RFC.6973" ?> | ||||
| <reference anchor="Fyodor1998" target="http://www.phrack.org/archives/iss | ||||
| ues/54/9.txt"> | ||||
| <front> | ||||
| <title>Remote OS Detection via TCP/IP Stack Fingerprintin | ||||
| g</title> | ||||
| <author initials="" surname="Fyodor" fullname="Fyodor"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="1998"/> | ||||
| </front> | ||||
| <seriesInfo name="" value="Phrack Magazine, Volume 9, Issue 54"/> | ||||
| </reference> | </reference> | |||
| <reference anchor="Fyodor2006" target="https://nmap.org/book/osdetect.htm | <reference anchor="IANA-PROT" target="https://www.iana.org/protocols"> | |||
| l"> | <front> | |||
| <front> | <title>Protocol Registries</title> | |||
| <title>Chapter 8. Remote OS Detection</title> | <author> | |||
| <author initials="G." surname="Lyon" fullname="Gordon Lyo | <organization>IANA</organization> | |||
| n"> | </author> | |||
| <organization></organization> | </front> | |||
| </author> | ||||
| <date year="2006"/> | ||||
| </front> | ||||
| </reference> | </reference> | |||
| <reference anchor="nmap" target="https://www.insecure.org/nmap"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.69 | |||
| <front> | 73.xml"/> | |||
| <title>Nmap: Free Security Scanner For Network Exploratio | ||||
| n and Audit</title> | ||||
| <author> | ||||
| <organization>nmap</organization> | ||||
| </author> | ||||
| <date year="2020"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="EFF" target="https://coveryourtracks.eff.org/"> | <reference anchor="Fyodor1998" target="http://www.phrack.org/archives/is | |||
| <front> | sues/54/9.txt"> | |||
| <title>Cover your tracks: See how trackers view your brow | <front> | |||
| ser</title> | <title>Remote OS detection via TCP/IP Stack FingerPrinting</title> | |||
| <author initials="" surname="EFF" fullname="EFF"> | <author> | |||
| <organization></organization> | <organization>Fyodor</organization> | |||
| </author> | </author> | |||
| <date year="2020"/> | <date year="1998" month="December"/> | |||
| </front> | </front> | |||
| <refcontent>Phrack Magazine, Volume 8, Issue 54</refcontent> | ||||
| </reference> | ||||
| </reference> | <reference anchor="Fyodor2006" target="https://nmap.org/book/osdetect.ht | |||
| ml"> | ||||
| <front> | ||||
| <title>Chapter 8. Remote OS Detection</title> | ||||
| <author initials="G." surname="Lyon" fullname="Gordon Lyon"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2009" month="January"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="Schuba1993" target="http://ftp.cerias.purdue.edu/pub/papers/c | <reference anchor="nmap" target="https://nmap.org/"> | |||
| hristoph-schuba/schuba-DNS-msthesis.pdf"> | <front> | |||
| <front> | <title>Nmap: Free Security Scanner For Network Exploration and Audit | |||
| <title>ADDRESSING WEAKNESSES IN THE DOMAIN NAME SYSTEM PR | </title> | |||
| OTOCOL</title> | <author> | |||
| <author initials="C." surname="Schuba" fullname="Christop | <organization>nmap</organization> | |||
| h Schuba"> | </author> | |||
| <organization></organization> | <date year="2020"/> | |||
| </author> | </front> | |||
| <date year="1993"/> | </reference> | |||
| </front> | ||||
| </reference> | ||||
| <reference anchor="TBIT" target="https://www.icir.org/tbit/"> | <reference anchor="EFF" target="https://coveryourtracks.eff.org/"> | |||
| <front> | <front> | |||
| <title>TBIT, the TCP Behavior Inference Tool</title> | <title>Cover your tracks: See how trackers view your browser</title> | |||
| <author initials="" surname="TBIT" fullname="TBIT"> | <author> | |||
| <organization></organization> | <organization>EFF</organization> | |||
| </author> | </author> | |||
| <date year="2001"/> | </front> | |||
| </front> | </reference> | |||
| </reference> | <reference anchor="Schuba1993" target="http://ftp.cerias.purdue.edu/pub/ | |||
| papers/christoph-schuba/schuba-DNS-msthesis.pdf"> | ||||
| <front> | ||||
| <title>Addressing Weakness in the Domain Name System Protocol</title | ||||
| > | ||||
| <author initials="C." surname="Schuba" fullname="Christoph Schuba"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1993" month="August"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="C11"> | <reference anchor="TBIT" target="https://www.icir.org/tbit/"> | |||
| <front> | <front> | |||
| <title>Information technology - Programming | <title>TBIT, the TCP Behavior Inference Tool</title> | |||
| languages - C</title> | <author> | |||
| <author initials="" surname="ISO/IEC" fullname="ISO/IEC"> | <organization>TBIT</organization> | |||
| <organization></organization> | </author> | |||
| </author> | <date year="2001"/> | |||
| <date year="2011"/> | </front> | |||
| </front> | </reference> | |||
| <seriesInfo name="" value="ISO/IEC 9899:2011"/> | ||||
| </reference> | ||||
| <reference anchor="POSIX"> | <reference anchor="C11"> | |||
| <front> | <front> | |||
| <title>IEEE Standard for Information Technology -- Portab | <title>Information technology - Programming languages - C</title> | |||
| le Operating System Interface (POSIX)</title> | <author> | |||
| <author initials="" surname="IEEE" fullname="IEEE"> | <organization>ISO/IEC</organization> | |||
| <organization></organization> | </author> | |||
| </author> | <date year="2018" month="June"/> | |||
| <date year="2017"/> | </front> | |||
| </front> | <seriesInfo name="ISO/IEC" value="9899:2018"/> | |||
| <seriesInfo name="" value="IEEE Std 1003.1-2017"/> | </reference> | |||
| </reference> | ||||
| <reference anchor="ARC4RANDOM" target="https://man.openbsd.org/arc4random | <reference anchor="POSIX"> | |||
| "> | <front> | |||
| <front> | <title>IEEE Standard for Information Technology -- Portable Operatin | |||
| <title>arc4random(3)</title> | g System Interface (POSIX(TM)) Base Specifications, Issue 7</title> | |||
| <author initials="" surname="OpenBSD" fullname="OpenBSD"> | <author> | |||
| <organization></organization> | <organization>IEEE</organization> | |||
| </author> | </author> | |||
| <date year="Library Functions Manual, 2022"/> | <date year="2018" month="January"/> | |||
| </front> | </front> | |||
| <seriesInfo name="IEEE Std" value="1003.1-2017"/> | ||||
| <seriesInfo name="DOI" value="10.1109/IEEESTD.2018.8277153"/> | ||||
| </reference> | ||||
| </reference> | <reference anchor="ARC4RANDOM" target="https://man.openbsd.org/arc4rando | |||
| m"> | ||||
| <front> | ||||
| <title>arc4random(3)</title> | ||||
| <author> | ||||
| <organization>OpenBSD</organization> | ||||
| </author> | ||||
| <date month="September" year="2019"/> | ||||
| </front> | ||||
| <refcontent>Library Functions Manual</refcontent> | ||||
| </reference> | ||||
| <reference anchor="GETENTROPY" target="https://man7.org/linux/man-pages/m an3/getentropy.3.html"> | <reference anchor="GETENTROPY" target="https://man7.org/linux/man-pages/m an3/getentropy.3.html"> | |||
| <front> | <front> | |||
| <title>getentropy(3)</title> | <title>getentropy(3)</title> | |||
| <author initials="" surname="Linux" fullname="Linux"> | <author> | |||
| <organization></organization> | <organization>Linux</organization> | |||
| </author> | </author> | |||
| <date year="Linux Programmer's Manual, 2022"/> | <date month="March" year="2021"/> | |||
| </front> | </front> | |||
| <refcontent>Linux Programmer's Manual</refcontent> | ||||
| </reference> | </reference> | |||
| <reference anchor="CVEs" target="https://www.gont.com.ar/miscellanea/prng | ||||
| -cves/"> | ||||
| <front> | ||||
| <title>Vulnerability Advisories for Pseudo Random Number | ||||
| Generators</title> | ||||
| <author initials="" surname="NVD" fullname="NVD"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2022"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="Zalewski2012" target="https://lcamtuf.coredump.cx/p0f. | ||||
| shtml"> | ||||
| <front> | ||||
| <title>p0f v3 (version 3.09b)</title> | ||||
| <author initials="M." surname="Zalewski" fullname="M. Zal | ||||
| ewski"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2012"/> | ||||
| </front> | ||||
| </reference> | ||||
| <!-- HMAC --> | ||||
| <?rfc include="reference.RFC.2104" ?> | ||||
| <!-- md5 --> | ||||
| <!-- <?rfc include="reference.RFC.6151" ?> --> | ||||
| <!-- flow label --> | ||||
| <?rfc include="reference.RFC.7098" ?> | ||||
| <!-- MD5 | ||||
| <?rfc include="reference.RFC.1321" ?> | ||||
| <!-- Pervasive Monitoring --> | <reference anchor="CVEs" target="https://www.gont.com.ar/miscellanea/prn | |||
| <?rfc include="reference.RFC.7258" ?> | g-cves/"> | |||
| <front> | ||||
| <title>Vulnerability Advisories for PRNGs</title> | ||||
| <author> | ||||
| <organization>NVD</organization> | ||||
| </author> | ||||
| </front> | ||||
| </reference> | ||||
| <!-- TCP ISNs --> | <reference anchor="Zalewski2012" target="https://lcamtuf.coredump.cx/p0f | |||
| <!-- | .shtml"> | |||
| <?rfc include="reference.RFC.1948" ?> | <front> | |||
| <reference anchor="CPNI-TCP" target="https://www.gont.com.ar/papers/tn-03 | <title>p0f v3 (3.09b)</title> | |||
| -09-security-assessment-TCP.pdf"> | <author initials="M." surname="Zalewski" fullname="Michal Zalewski"> | |||
| <front> | <organization/> | |||
| <title>Security Assessment of the Transmission Control Pr | </author> | |||
| otocol (TCP)</title> | </front> | |||
| <author initials="F." surname="Gont" fullname= "Fernando | </reference> | |||
| Gont"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2009"/> | ||||
| </front> | ||||
| <seriesInfo name="" value="United Kingdom's Centre for the Protec | ||||
| tion of National Infrastructure (CPNI) Technical Report"/> | ||||
| </reference> | ||||
| <reference anchor="Zalewski2001" target="https://lcamtuf.coredump.cx/oldt | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.21 | |||
| cp/tcpseq.html"> | 04.xml"/> | |||
| <front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.70 | |||
| <title>Strange Attractors and TCP/IP Sequence Number Anal | 98.xml"/> | |||
| ysis</title> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.72 | |||
| <author initials="M." surname="Zalewski" fullname="M. Zal | 58.xml"/> | |||
| ewski"> | <reference anchor="CPNI-TCP" target="https://www.si6networks.com/files/pu | |||
| <organization></organization> | blications/tn-03-09-security-assessment-TCP.pdf"> | |||
| </author> | <front> | |||
| <date year="2001"/> | <title>Security Assessment of the Transmission Control Protocol (TCP | |||
| </front> | )</title> | |||
| </reference> | <author> | |||
| <organization>Centre for the Protection of National Infrastructure | ||||
| (CPNI)</organization> | ||||
| </author> | ||||
| <date month="February" year="2009"/> | ||||
| </front> | ||||
| <seriesInfo name="CPNI Technical Note" value="3/2009"/> | ||||
| </reference> | ||||
| <reference anchor="Zalewski2002" target="https://lcamtuf.coredump.cx/newt | <reference anchor="Zalewski2001" target="https://lcamtuf.coredump.cx/old | |||
| cp/"> | tcp/tcpseq.html"> | |||
| <front> | <front> | |||
| <title>Strange Attractors and TCP/IP Sequence Number Anal | <title>Strange Attractors and TCP/IP Sequence Number Analysis</title | |||
| ysis - One Year Later</title> | > | |||
| <author initials="M." surname="Zalewski" fullname="M. Zal | <author initials="M." surname="Zalewski" fullname="Michal Zalewski"> | |||
| ewski"> | <organization/> | |||
| <organization></organization> | </author> | |||
| </author> | <date year="2001" month="April"/> | |||
| <date year="2001"/> | </front> | |||
| </front> | </reference> | |||
| </reference> | ||||
| <!-- | <reference anchor="Zalewski2002" target="https://lcamtuf.coredump.cx/new | |||
| <reference anchor="Bellovin1989" target="https://www.cs.columbia.edu/~smb | tcp/"> | |||
| /papers/ipext.pdf"> | <front> | |||
| <front> | <title>Strange Attractors and TCP/IP Sequence Number Analysis - One | |||
| <title>Security Problems in the TCP/IP Protocol Suite</ti | Year Later (2002)</title> | |||
| tle> | <author initials="M." surname="Zalewski" fullname="Michal Zalewski"> | |||
| <author initials="S." surname="Bellovin" fullname="Bellov | <organization/> | |||
| in"> | </author> | |||
| <organization></organization> | </front> | |||
| </author> | </reference> | |||
| <date year="Computer Communications Review, vol. 19, no. | ||||
| 2, pp. 32-48, 1989"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="Joncheray1995" target="https://www.usenix.org/legacy/p ublications/library/proceedings/security95/full_papers/joncheray.pdf"> | <reference anchor="Joncheray1995" target="https://www.usenix.org/legacy/p ublications/library/proceedings/security95/full_papers/joncheray.pdf"> | |||
| <front> | <front> | |||
| <title>A Simple Active Attack Against TCP</title> | <title>Simple Active Attack Against TCP</title> | |||
| <author initials="L." surname="Joncheray" fullname="L. Jo | <author initials="L." surname="Joncheray" fullname="Laurent Jonchera | |||
| ncheray"> | y"> | |||
| <organization></organization> | <organization/> | |||
| </author> | </author> | |||
| <date year="Proc. Fifth Usenix UNIX Security Symposium, 1 | <date year="1995" month="June"/> | |||
| 995"/> | </front> | |||
| </front> | <refcontent>Proceedings of the Fifth USENIX UNIX Security Symposium</re | |||
| </reference> | fcontent> | |||
| </reference> | ||||
| <reference anchor="Morris1985" target="https://pdos.csail.mit.edu/~rtm/pa | ||||
| pers/117.pdf"> | ||||
| <front> | ||||
| <title>A Weakness in the 4.2BSD UNIX TCP/IP Software</tit | ||||
| le> | ||||
| <author initials="R." surname="Morris" fullname="Robert M | ||||
| orris"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="1985"/> | ||||
| </front> | ||||
| <seriesInfo name="CSTR 117," value="AT&T Bell Laboratories, M | ||||
| urray Hill, NJ"/> | ||||
| </reference> | ||||
| <!-- | ||||
| <reference anchor="USCERT2001" target="https://www.kb.cert.org/vuls/id/49 | ||||
| 8440"> | ||||
| <front> | ||||
| <title>US-CERT Vulnerability Note VU#498440: Multiple TCP | ||||
| /IP implementations may use statistically predictable initial sequence numbers | ||||
| </title> | ||||
| <author initials="" surname="US-CERT" fullname= "US-CERT" | ||||
| > | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2001"/> | ||||
| </front> | ||||
| </reference> | ||||
| <!-- | ||||
| <reference anchor="CERT2001" target="https://www.cert.org/advisories/CA-2 | ||||
| 001-09.html"> | ||||
| <front> | ||||
| <title>CERT Advisory CA-2001-09: Statistical Weaknesses i | ||||
| n TCP/IP Initial Sequence Numbers | ||||
| </title> | ||||
| <author initials="" surname="CERT" fullname= "CERT"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2001"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="Shimomura1995" target="https://www.gont.com.ar/docs/po | ||||
| st-shimomura-usenet.txt"> | ||||
| <front> | ||||
| <title>Technical details of the attack described by Marko | ||||
| ff in NYT</title> | ||||
| <author initials="T." surname="Shimomura" fullname= "Tsut | ||||
| omu Shimomura"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="1995"/> | ||||
| </front> | ||||
| <seriesInfo name="Message posted in USENET's comp.security.misc n | ||||
| ewsgroup" value=" Message-ID: <3g5gkl$5j1@ariel.sdsc.edu>"/> | ||||
| </reference> | ||||
| <!-- ICMP attacks --> | ||||
| <?rfc include="reference.RFC.5927" ?> | ||||
| <!-- TCP based attacks --> | ||||
| <?rfc include="reference.RFC.4953" ?> | ||||
| <!-- TLS --> | ||||
| <?rfc include="reference.RFC.8446" ?> | ||||
| <!-- SEND --> | ||||
| <?rfc include="reference.RFC.3971" ?> | ||||
| <!-- Frag con ND --> | ||||
| <?rfc include="reference.RFC.6980" ?> | ||||
| <!-- IPv6 Flow Label --> | ||||
| <!-- | ||||
| <?rfc include="reference.I-D.gont-6man-flowlabel-security" ?> | ||||
| <!-- Fragment ID --> | ||||
| <!-- | ||||
| <?rfc include="reference.I-D.ietf-6man-predictable-fragment-id" ?> | ||||
| <?rfc include="reference.RFC.7739" ?> | ||||
| <?rfc include="reference.RFC.4963" ?> <!-- IPv4 Reassembly Errors at High | ||||
| Data Rates --> | ||||
| <!-- IPv4 Security Assessment --> | ||||
| <?rfc include="reference.RFC.6274" ?> | ||||
| <reference anchor="Press1992"> | ||||
| <front> | ||||
| <title>Numerical Recipes in C: The Art of Scientific Comp | ||||
| uting</title> | ||||
| <author initials="W. H." surname="Press" fullname="Willia | ||||
| m H. Press"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <author initials="S. A." surname="Teukolsky" fullname="Sa | ||||
| ul A. Teukolsky"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <author initials="W. T." surname="Vetterling" fullname="W | ||||
| illiam T. Vetterling"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <author initials="B. P." surname="Flannery" fullname="Bri | <reference anchor="Morris1985" target="https://pdos.csail.mit.edu/~rtm/p | |||
| an P. Flannery"> | apers/117.pdf"> | |||
| <organization></organization> | <front> | |||
| </author> | <title>A Weakness in the 4.2BSD UNIX TCP/IP Software</title> | |||
| <author initials="R." surname="Morris" fullname="Robert T. Morris"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1985" month="February"/> | ||||
| </front> | ||||
| <refcontent>CSTR 117, AT&T Bell Laboratories, Murray Hill, NJ</refc | ||||
| ontent> | ||||
| </reference> | ||||
| <date year="2nd ed. ISBN 0-521-43108-5. Cambridge Univers | <reference anchor="Shimomura1995" target="https://www.gont.com.ar/files/p | |||
| ity Press, 1992"/> | ost-shimomura-usenet.txt"> | |||
| </front> | <front> | |||
| </reference> | <title>Technical details of the attack described by Markoff in NYT</ | |||
| title> | ||||
| <author initials="T." surname="Shimomura" fullname="Tsutomu Shimomur | ||||
| a"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date day="25" year="1995" month="January"/> | ||||
| </front> | ||||
| <refcontent>message to the USENET comp.security.misc newsgroup</refcon | ||||
| tent> | ||||
| </reference> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.59 | ||||
| 27.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.49 | ||||
| 53.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.84 | ||||
| 46.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.39 | ||||
| 71.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.69 | ||||
| 80.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.77 | ||||
| 39.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
| 963.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.62 | ||||
| 74.xml"/> | ||||
| <reference anchor="Romailler2020" target="https://research.kudelskisecuri | <reference anchor="Press1992"> | |||
| ty.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/"> | <front> | |||
| <front> | <title>Numerical Recipes in C: The Art of Scientific Computing</titl | |||
| <title>THE DEFINITIVE GUIDE TO "MODULO BIAS AND HOW TO AV | e> | |||
| OID IT"!</title> | <author initials="W." surname="Press" fullname="William H. Press"> | |||
| <author initials="Y." surname="Romailler" fullname="Yolan | <organization/> | |||
| Romailler"> | </author> | |||
| <organization></organization> | <author initials="S." surname="Teukolsky" fullname="Saul A. Teukolsk | |||
| </author> | y"> | |||
| <date year="Kudelski Security Research, 2020"/> | <organization/> | |||
| </front> | </author> | |||
| </reference> | <author initials="W." surname="Vetterling" fullname="William T. Ve | |||
| tterling"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="B." surname="Flannery" fullname="Brian P. Flannery | ||||
| "> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="December" year="1992"/> | ||||
| </front> | ||||
| <seriesInfo name="ISBN" value="0-521-43108-5"/> | ||||
| <refcontent>2nd Ed., Cambridge University Press</refcontent> | ||||
| </reference> | ||||
| <reference anchor="Aumasson2018"> | <reference anchor="Romailler2020" target="https://research.kudelskisecur | |||
| <front> | ity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/"> | |||
| <title>Serious Cryptography: A Practical Introduction to | <front> | |||
| Modern Encryption</title> | <title>The Definitive Guide to "Modulo Bias and How to Avoid It"!</t | |||
| <author initials="J.P." surname="Aumasson" fullname="Jean | itle> | |||
| -Philippe Aumasson"> | <author initials="Y." surname="Romailler" fullname="Yolan Romailler" | |||
| <organization></organization> | > | |||
| </author> | <organization/> | |||
| <date year="ISBN-10: 1-59327-826-8, No Starch Press, Inc. | </author> | |||
| , 2018"/> | <date month="July" year="2020"/> | |||
| </front> | </front> | |||
| </reference> | <refcontent>Kudelski Security Research</refcontent> | |||
| </reference> | ||||
| <reference anchor="Knuth1983"> | <reference anchor="Aumasson2018"> | |||
| <front> | <front> | |||
| <title>The Art of Computer Programming</title> | <title>Serious Cryptography: A Practical Introduction to Modern Encr | |||
| <author initials="D." surname="Knuth" fullname="Donald Kn | yption</title> | |||
| uth"> | <author initials="J-P." surname="Aumasson" fullname="Jean-Philippe A | |||
| <organization></organization> | umasson"> | |||
| </author> | <organization/> | |||
| <date year="volume 2 (Seminumerical Algorithms), 2nd ed. | </author> | |||
| Reading, Massachusetts: Addison-Wesley Publishing Company, 1981"/> | <date month="November" year="2017"/> | |||
| </front> | </front> | |||
| </reference> | <seriesInfo name="ISBN-10" value="1-59327-826-8"/> | |||
| <refcontent>No Starch Press, Inc.</refcontent> | ||||
| </reference> | ||||
| <reference anchor="Bellovin1989" target="https://www.cs.columbia.edu/~smb | <reference anchor="Knuth1983"> | |||
| /papers/ipext.pdf"> | <front> | |||
| <front> | <title>The Art of Computer Programming</title> | |||
| <title>Security Problems in the TCP/IP Protocol Suite</ti | <author initials="D." surname="Knuth" fullname="Donald Knuth"> | |||
| tle> | <organization/> | |||
| <author initials="S." surname="Bellovin" fullname="Bellov | </author> | |||
| in"> | <date year="1981" month="January"/> | |||
| <organization></organization> | </front> | |||
| </author> | <refcontent>Volume 2 (Seminumerical Algorithms), 2nd Ed., Reading, Mass | |||
| <date year="Computer Communications Review, vol. 19, no. | achusetts, Addison-Wesley Publishing Company</refcontent> | |||
| 2, pp. 32-48, 1989"/> | </reference> | |||
| </front> | ||||
| </reference> | ||||
| <reference anchor="Bellovin2002" target="https://www.cs.columbia.edu/~smb | <reference anchor="Bellovin1989" target="https://www.cs.columbia.edu/~sm | |||
| /papers/fnat.pdf"> | b/papers/ipext.pdf"> | |||
| <front> | <front> | |||
| <title>A Technique for Counting NATted Hosts</title> | <title>Security Problems in the TCP/IP Protocol Suite</title> | |||
| <author initials="S. M." surname="Bellovin" fullname= "Be | <author initials="S." surname="Bellovin" fullname="Steven M. Bellovi | |||
| llovin, S. M."> | n"> | |||
| <organization></organization> | <organization/> | |||
| </author> | </author> | |||
| <date year="2002"/> | <date month="April" year="1989"/> | |||
| </front> | </front> | |||
| <seriesInfo name="IMW'02" value="Nov. 6-8, 2002, Marseille, Franc | <refcontent>Computer Communications Review, Vol. 19, No. 2, pp. 32-48</ | |||
| e"/> | refcontent> | |||
| </reference> | </reference> | |||
| <reference anchor="Fyodor2003" target="https://nmap.org/presentations/Can | <reference anchor="Bellovin2002" target="https://www.cs.columbia.edu/~sm | |||
| SecWest03/CD_Content/idlescan_paper/idlescan.html"> | b/papers/fnat.pdf"> | |||
| <front> | <front> | |||
| <title>Idle scanning and related IP ID games</title> | <title>A Technique for Counting NATted Hosts</title> | |||
| <author initials="" surname="Fyodor" fullname= "Fyodor"> | <author initials="S." surname="Bellovin" fullname="Steven M. Bellovi | |||
| <organization></organization> | n"> | |||
| </author> | <organization/> | |||
| <date year="2003"/> | </author> | |||
| </front> | <date year="2002" month="November"/> | |||
| </reference> | </front> | |||
| <seriesInfo name="ISBN" value="1-58113-603-X/02/0011"/> | ||||
| <refcontent>IMW'02, Marseille, France</refcontent> | ||||
| </reference> | ||||
| <reference anchor="Sanfilippo1998a" target="http://seclists.org/bugtraq/1 | <reference anchor="Fyodor2003" target="https://nmap.org/presentations/Ca | |||
| 998/Dec/48"> | nSecWest03/CD_Content/idlescan_paper/idlescan.html"> | |||
| <front> | <front> | |||
| <title>about the ip header id</title> | <title>Idle Scanning and related IPID games</title> | |||
| <author initials="S." surname="Sanfilippo" fullname="S. S | <author> | |||
| anfilippo"> | <organization>Fyodor</organization> | |||
| <organization></organization> | </author> | |||
| </author> | <date year="2003"/> | |||
| <date/> | </front> | |||
| </front> | </reference> | |||
| <seriesInfo name="Post to Bugtraq mailing-list," value="Mon Dec 1 | ||||
| 4 1998" /> | ||||
| </reference> | ||||
| <reference anchor="Sanfilippo1998b" target="https://github.com/antirez/hp | <reference anchor="Sanfilippo1998a" target="http://seclists.org/bugtraq/ | |||
| ing/raw/master/docs/SPOOFED_SCAN.txt"> | 1998/Dec/48"> | |||
| <front> | <front> | |||
| <title>Idle scan</title> | <title>about the ip header id</title> | |||
| <author initials="S." surname="Sanfilippo" fullname="S. S | <author initials="S." surname="Sanfilippo" fullname="Salvatore Sanfi | |||
| anfilippo"> | lippo"> | |||
| <organization></organization> | <organization/> | |||
| </author> | </author> | |||
| <date year="1998"/> | <date month="December" year="1998"/> | |||
| </front> | </front> | |||
| <seriesInfo name="Post to Bugtraq" value="mailing-list" /> | <refcontent>message to the Bugtraq mailing list</refcontent> | |||
| </reference> | </reference> | |||
| <reference anchor="Sanfilippo1999" target="https://github.com/antirez/hpi | <reference anchor="Sanfilippo1998b" target="https://seclists.org/bugtraq | |||
| ng/raw/master/docs/MORE-FUN-WITH-IPID"> | /1998/Dec/79"> | |||
| <front> | <front> | |||
| <title>more ip id</title> | <title>new tcp scan method</title> | |||
| <author initials="S." surname="Sanfilippo" fullname="S. S | <author initials="S." surname="Sanfilippo" fullname="Salvatore Sanfi | |||
| anfilippo"> | lippo"> | |||
| <organization></organization> | <organization/> | |||
| </author> | </author> | |||
| <date year="1999"/> | <date year="1998" month="December" day="18"/> | |||
| </front> | </front> | |||
| <seriesInfo name="Post to Bugtraq" value="mailing-list" /> | <refcontent>message to the Bugtraq mailing list</refcontent> | |||
| </reference> | </reference> | |||
| <reference anchor="Silbersack2005" target="https://citeseerx.ist.psu.edu/ | <reference anchor="Sanfilippo1999" target="https://github.com/antirez/hp | |||
| viewdoc/download?doi=10.1.1.91.4542&rep=rep1&type=pdf"> | ing/raw/master/docs/MORE-FUN-WITH-IPID"> | |||
| <front> | <front> | |||
| <title>Improving TCP/IP security through randomization wi | <title>more ip id</title> | |||
| thout sacrificing interoperability</title> | <author initials="S." surname="Sanfilippo" fullname="Salvatore Sanfi | |||
| <author initials="M.J." surname="Silbersack" fullname="Mi | lippo"> | |||
| chael James Silbersack"> | <organization/> | |||
| <organization>The FreeBSD Project</organization> | </author> | |||
| </author> | <date year="1999" month="November"/> | |||
| <date year="2005"/> | </front> | |||
| </front> | <refcontent>message to the Bugtraq mailing list</refcontent> | |||
| <seriesInfo name="EuroBSDCon 2005" value="Conference"/> | </reference> | |||
| </reference> | ||||
| <!-- | <reference anchor="Silbersack2005" target="https://www.silby.com/eurobsd | |||
| <reference anchor="Zalewski2003" target="http://lcamtuf.coredump.cx/ipfra | con05/eurobsdcon_silbersack.pdf"> | |||
| g.txt"> | <front> | |||
| <front> | <title>Improving TCP/IP security through randomization without sacri | |||
| <title>A new TCP/IP blind data injection technique?</titl | ficing interoperability</title> | |||
| e> | <author initials="M." surname="Silbersack" fullname="Michael James S | |||
| <author initials="M." surname="Zalewski" fullname="M. Zal | ilbersack"> | |||
| ewski"> | <organization>The FreeBSD Project</organization> | |||
| <organization></organization> | </author> | |||
| </author> | </front> | |||
| <date year="2003"/> | <refcontent>EuroBSDCon 2005 Conference</refcontent> | |||
| </front> | </reference> | |||
| </reference> | ||||
| <reference anchor="Klein2007" target="https://dl.packetstormsecurity.net/ papers/attack/OpenBSD_DNS_Cache_Poisoning_and_Multiple_OS_Predictable_IP_ID_Vuln erability.pdf"> | <reference anchor="Klein2007" target="https://dl.packetstormsecurity.net/ papers/attack/OpenBSD_DNS_Cache_Poisoning_and_Multiple_OS_Predictable_IP_ID_Vuln erability.pdf"> | |||
| <front> | <front> | |||
| <title>OpenBSD DNS Cache Poisoning and Multiple O/S Predi | <title>OpenBSD DNS Cache Poisoning and Multiple O/S Predictable IP I | |||
| ctable IP ID Vulnerability</title> | D Vulnerability</title> | |||
| <author initials="A." surname="Klein" fullname="Amit Klei | <author initials="A." surname="Klein" fullname="Amit Klein"> | |||
| n"> | <organization/> | |||
| <organization></organization> | </author> | |||
| </author> | <date month="November" year="2007"/> | |||
| <date year="2007"/> | </front> | |||
| </front> | </reference> | |||
| </reference> | ||||
| <reference anchor="IPID-DEV" target="https://arxiv.org/pdf/1906.10478.pdf | ||||
| "> | ||||
| <front> | ||||
| <title>From IP ID to Device ID and KASLR Bypass (Extended | ||||
| Version)</title> | ||||
| <author initials="A." surname="Klein" fullname="Amit Klei | ||||
| n"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <author initials="B." surname="Pinkas" fullname="Benny Pi | ||||
| nkas"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2019" month="June"/> | ||||
| </front> | ||||
| <!-- | ||||
| <seriesInfo name="Journal of Research of the National Institute o | ||||
| f Standards and Technology" value="Volume 121" /> | ||||
| </reference> | ||||
| <!-- | ||||
| <reference anchor="Gont2011"> | ||||
| <front> | ||||
| <title>Hacking IPv6 Networks (training course)</title> | ||||
| <author initials="F." surname="Gont" fullname="Fernando G | ||||
| ont"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date month="June" year="2011"/> | ||||
| </front> | ||||
| <seriesInfo name="Hack In Paris 2011 Conference" value="P | ||||
| aris, France"/> | ||||
| </reference> | ||||
| <!-- | <reference anchor="IPID-DEV" target="https://arxiv.org/pdf/1906.10478.pd | |||
| <reference anchor="Gont2012"> | f"> | |||
| <front> | <front> | |||
| <title>Recent Advances in IPv6 Security</title> | <title>From IP ID to Device ID and KASLR Bypass (Extended Version)</ | |||
| <author initials="F." surname="Gont" fullname="Fernando G | title> | |||
| ont"> | <author initials="A." surname="Klein" fullname="Amit Klein"> | |||
| <organization></organization> | <organization/> | |||
| </author> | </author> | |||
| <date month="May" year="2012"/> | <author initials="B." surname="Pinkas" fullname="Benny Pinkas"> | |||
| </front> | <organization/> | |||
| <seriesInfo name="BSDCan 2012 Conference" value="Ottawa, | </author> | |||
| Canada. May 11-12, 2012"/> | <date year="2019" month="October"/> | |||
| </front> | ||||
| <seriesInfo name="DOI" value="10.48550/arXiv.1906.10478"/> | ||||
| </reference> | </reference> | |||
| <!-- IPv6 addresses --> | ||||
| <?rfc include="reference.I-D.irtf-pearg-numeric-ids-history" ?> | ||||
| <?rfc include="reference.I-D.gont-numeric-ids-sec-considerations" ?> | ||||
| <!-- | <reference anchor='RFC9414' target='https://www.rfc-editor.org/info/rfc9414'> | |||
| <?rfc include="reference.I-D.ietf-6man-default-iids" ?> | <front> | |||
| <title>Unfortunate History of Transient Numeric Identifiers</title> | ||||
| <?rfc include="reference.RFC.7721" ?> | <author initials='F' surname='Gont' fullname='Fernando Gont'> | |||
| <?rfc include="reference.RFC.7707" ?> | <organization /> | |||
| </author> | ||||
| <!-- CSPRNG --> | <author initials='I' surname='Arce' fullname='Ivan Arce'> | |||
| <?rfc include="reference.RFC.8937" ?> | <organization /> | |||
| </author> | ||||
| <date year='2023' month='July'/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="9414"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC9414"/> | ||||
| </reference> | ||||
| <reference anchor="TCPT-uptime" target="https://securiteam.com/securityne | <reference anchor='RFC9416' target='https://www.rfc-editor.org/info/rfc9416'> | |||
| ws/5np0c153pi/"> | <front> | |||
| <front> | <title>Security Considerations for Transient Numeric Identifiers Employed in Net | |||
| <title>TCP Timestamping - Obtaining System Uptime Remotel | work Protocols</title> | |||
| y</title> | <author initials='F' surname='Gont' fullname='Fernando Gont'> | |||
| <author initials="B." surname="McDanel" fullname="B. McDa | <organization /> | |||
| nel"> | </author> | |||
| <organization>Securiteam</organization> | <author initials='I' surname='Arce' fullname='Ivan Arce'> | |||
| </author> | <organization /> | |||
| <date month="March" day="14" year="2001"/> | </author> | |||
| </front> | <date year='2023' month='July'/> | |||
| </front> | ||||
| <seriesInfo name="BCP" value="72"/> | ||||
| <seriesInfo name="RFC" value="9416"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC9416"/> | ||||
| </reference> | ||||
| </reference> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.77 | |||
| 21.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
| 707.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.89 | ||||
| 37.xml"/> | ||||
| <!-- SipHash OLD | <reference anchor="TCPT-uptime" target="https://seclists.org/bugtraq/200 | |||
| <reference anchor="SipHash" target="https://www.aumasson.jp/siphash/sipha | 1/Mar/182"> | |||
| sh.pdf"> | <front> | |||
| <front> | <title>TCP Timestamping - Obtaining System Uptime Remotely</title> | |||
| <title>SipHash: a fast short-input PRF</title> | <author initials="B." surname="McDanel" fullname="Bret McDanel"> | |||
| <author initials="J. P." surname="Aumasson" fullname="Jea | <organization>Securiteam</organization> | |||
| n-Philippe Aumasson"> | </author> | |||
| <organization>NAGRA</organization> | <date month="March" year="2001"/> | |||
| </author> | </front> | |||
| <author initials="D. J." surname="Bernstein" fullname="Da | <refcontent>message to the Bugtraq mailing list</refcontent> | |||
| niel J. Bernstein"> | </reference> | |||
| <organization>University of Illinois at Chicago</ | ||||
| organization> | ||||
| </author> | ||||
| <date year="2012"/> | ||||
| </front> | ||||
| <seriesInfo name="" value="Indocrypt 2012. 13th International Con | ||||
| ference on Cryptology. December 9-12, 2012"/> | ||||
| </reference> | ||||
| <reference anchor="SipHash" target="https://github.com/veorq/SipHash"> | <reference anchor="SipHash" target="https://github.com/veorq/SipHash"> | |||
| <front> | <front> | |||
| <title>SipHash: a fast short-input PRF</title> | <title>SipHash: a fast short-input PRF</title> | |||
| <author initials="J. P." surname="Aumasson" fullname="Jea | <author> | |||
| n-Philippe Aumasson"> | <organization/> | |||
| <organization>NAGRA</organization> | </author> | |||
| </author> | <date year="2023" month="February"/> | |||
| <author initials="D. J." surname="Bernstein" fullname="Da | </front> | |||
| niel J. Bernstein"> | </reference> | |||
| <organization>University of Illinois at Chicago</ | ||||
| organization> | ||||
| </author> | ||||
| <date year="2012"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="BLAKE3" target="https://blake3.io/"> | ||||
| <front> | ||||
| <title>BLAKE3: one function, fast everywhere</title> | ||||
| <author initials="J." surname="O'Connor" fullname="Jack O | ||||
| 'Connor"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <author initials="J. P." surname="Aumasson" fullname="Jea | ||||
| n-Philippe Aumasson"> | ||||
| <organization>NAGRA</organization> | ||||
| </author> | ||||
| <author initials="S." surname="Neves" fullname="Samuel Ne | ||||
| ves"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <author initials="Z." surname="Wilcox-O'Hearn" fullname=" | ||||
| Zooko Wilcox-O'Hearn"> | ||||
| <organization></organization> | ||||
| </author> | ||||
| <date year="2020"/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="FIPS-SHS" target="https://nvlpubs.nist.gov/nistpubs/FI | ||||
| PS/NIST.FIPS.180-4.pdf"> | ||||
| <front> | ||||
| <title>Secure Hash Standard (SHS)</title> | ||||
| <author> | ||||
| <organization>NIST</organization> | ||||
| </author> | ||||
| <date month="August" year="2015"/> | ||||
| </front> | ||||
| <seriesInfo name="" value="Federal Information Processing Standar | ||||
| ds Publication 180-4"/> | ||||
| </reference> | ||||
| <!-- Deprecate SHA-1 --> | ||||
| <?rfc include="reference.RFC.6194" ?> | <reference anchor="BLAKE3" target="https://blake3.io/"> | |||
| <front> | ||||
| <title>BLAKE3: one function, fast everywhere</title> | ||||
| <author> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2022" month="September"/> | ||||
| </front> | ||||
| </reference> | ||||
| <!-- | <reference anchor="FIPS-SHS" target="https://nvlpubs.nist.gov/nistpubs/F | |||
| <reference anchor="FIPS-HMAC" target="https://nvlpubs.nist.gov/nistpubs/F | IPS/NIST.FIPS.180-4.pdf"> | |||
| IPS/NIST.FIPS.198-1.pdf"> | <front> | |||
| <front> | <title>Secure Hash Standard (SHS)</title> | |||
| <title>The Keyed-Hash Message Authentication Code (HMAC)) | <author> | |||
| </title> | <organization>NIST</organization> | |||
| </author> | ||||
| <date month="August" year="2015"/> | ||||
| </front> | ||||
| <seriesInfo name="FIPS PUB" value="180-4"/> | ||||
| <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/> | ||||
| </reference> | ||||
| <author> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.61 | |||
| <organization>NIST</organization> | 94.xml"/> | |||
| </author> | ||||
| <date month="July" year="2008"/> | ||||
| </front> | ||||
| <seriesInfo name="" value="Federal Information Processing Standar | ||||
| ds Publication 198-1"/> | ||||
| </reference> | ||||
| </references> | </references> | |||
| </references> | ||||
| <section anchor="fawed-algorithms" numbered="true" toc="default"> | ||||
| <name>Algorithms and Techniques with Known Issues</name> | ||||
| <t>The following subsections discuss algorithms and techniques with known | ||||
| negative security and privacy implications. | ||||
| <section title="Algorithms and Techniques with Known Issues" anchor="fawed-algor | ||||
| ithms"> | ||||
| <t>The following subsections discuss algorithms and techniques with known negati | ||||
| ve security and privacy implications. | ||||
| <list style="hanging"> | ||||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| As discussed in <xref target="intro"/>, the use of cryptographic techniques migh | ||||
| t allow for the safe use of some of these algorithms and techniques. However, th | ||||
| is should be evaluated on a case by case basis. | ||||
| </t> | </t> | |||
| </list> | <aside><t>NOTE: As discussed in <xref target="intro" format="default"/>, | |||
| </t> | the use of cryptographic techniques might allow for the safe use of some of the | |||
| se algorithms and techniques. However, this should be evaluated on a case-by-cas | ||||
| <section title="Predictable Linear Identifiers Algorithm" anchor="trad_selection | e basis. | |||
| "> | </t></aside> | |||
| <t>One of the most trivial ways to achieve uniqueness with a low identifier reus | <section anchor="trad_selection" numbered="true" toc="default"> | |||
| e frequency is to produce a linear sequence. This type of algorithm has been emp | <name>Predictable Linear Identifiers Algorithm</name> | |||
| loyed in the past to generate identifiers of Categories #1, #2, and #4 (please s | <t>One of the most trivial ways to achieve uniqueness with a low identif | |||
| ee <xref target="categorizing"/> for an analysis of these categories). <!-- This | ier reuse frequency is to produce a linear sequence. This type of algorithm has | |||
| obviously assumes that each identifier will be used for a similar period of tim | been employed in the past to generate identifiers of Categories #1, #2, and #4 ( | |||
| e.--></t> | please see <xref target="categorizing" format="default"/> for an analysis of the | |||
| se categories). | ||||
| <t> | </t> | |||
| For example, the following algorithm has been employed (see e.g. <xref target="M | <t> | |||
| orris1985"/>, <xref target="Shimomura1995"/>, <xref target="Silbersack2005"/> an | For example, the following algorithm has been employed (see, e.g., <xref target= | |||
| d <xref target="CPNI-TCP"/>) in a number of operating systems for selecting IP f | "Morris1985" format="default"/>, <xref target="Shimomura1995" format="default"/> | |||
| ragment IDs, TCP ephemeral ports, etc.:</t> | , <xref target="Silbersack2005" format="default"/>, and <xref target="CPNI-TCP" | |||
| format="default"/>) in a number of operating systems for selecting IP IDs, TCP e | ||||
| <t> | phemeral port numbers, etc.:</t> | |||
| <figure> | <sourcecode type="c"><![CDATA[ | |||
| <artwork> | ||||
| /* Initialization code */ | /* Initialization code */ | |||
| next_id = min_id; | next_id = min_id; | |||
| id_inc= 1; | id_inc= 1; | |||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| retry = id_range; | retry = id_range; | |||
| skipping to change at line 1768 ¶ | skipping to change at line 1305 ¶ | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry--; | retry--; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| </artwork> | ]]></sourcecode> | |||
| </figure> | <t>NOTE:</t> | |||
| </t> | ||||
| <t> | <t indent="3">suitable_id() checks whether a candidate numeric identifier is sui | |||
| <list style="hanging"> | table (e.g., whether it is unique or not). | |||
| <t hangText="NOTE:"> | ||||
| <vspace blankLines="0"/> | ||||
| suitable_id() is a function that checks whether the resulting identifier is acce | ||||
| ptable (e.g., whether it's in use, etc.). | ||||
| </t> | ||||
| </list> | ||||
| </t> | </t> | |||
| <t>For obvious reasons, this algorithm results in predictable sequences. | ||||
| <t>For obvious reasons, this algorithm results in predictable sequences. Since a | Since a global counter is used to generate the transient numeric identifiers (" | |||
| global counter is used to generate the transient numeric identifiers ("next_id" | next_id" in the example above), an entity that learns one numeric identifier can | |||
| in the example above), an entity that learns one numeric identifier can infer p | infer past numeric identifiers and predict future values to be generated by the | |||
| ast numeric identifiers and predict future values to be generated by the same al | same algorithm. Since the value employed for the increments is known (such as " | |||
| gorithm. Since the value employed for the increments is known (such as "1" in th | 1" in this case), an attacker can sample two values and learn the number of iden | |||
| is case), an attacker can sample two values, and learn the number of identifiers | tifiers that were generated in between the two sampled values. Furthermore, if t | |||
| that have been were generated in-between the two sampled values. Furthermore, i | he counter is initialized, to some known value (e.g., when the system is bootstr | |||
| f the counter is initialized e.g. when the system its bootstrapped to some known | apped), the algorithm will leak additional information, such as the number of tr | |||
| value, the algorithm will leak additional information, such as the number of tr | ansmitted fragmented datagrams in the case of an IP ID generator <xref target="S | |||
| ansmitted fragmented datagrams in the case of an IP ID generator <xref target="S | anfilippo1998a" format="default"/> or the system uptime in the case of TCP times | |||
| anfilippo1998a"/>, or the system uptime in the case of TCP timestamps <xref targ | tamps <xref target="TCPT-uptime" format="default"/>. | |||
| et="TCPT-uptime"/>. | ||||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="random-increments" numbered="true" toc="default"> | |||
| <name>Random-Increments Algorithm</name> | ||||
| <section title="Random-Increments Algorithm" anchor="random-increments"> | <t>This algorithm offers a middle ground between the algorithms that | |||
| <t>This algorithm offers a middle ground between the algorithms that | generate randomized transient numeric identifiers (such as those described in | |||
| generate randomized transient numeric identifiers (such as those described in | Sections <xref target="simple-randomization" format="counter"/> and <xref target | |||
| <xref target="simple-randomization"/> and <xref target="simple-randomization2"/ | ="simple-randomization2" format="counter"/>) and those that generate identifiers | |||
| >), and those that generate identifiers with a predictable monotonically-increas | with a predictable monotonically increasing function (see <xref target="trad_se | |||
| ing function (see <xref target="trad_selection"/>). | lection" format="default"/>). | |||
| </t> | </t> | |||
| <t> | <sourcecode type="c"><![CDATA[ | |||
| <figure> | ||||
| <artwork> | ||||
| /* Initialization code */ | /* Initialization code */ | |||
| next_id = random(); /* Initialization value */ | next_id = random(); /* Initialization value */ | |||
| id_rinc = 500; /* Determines the trade-off */ | id_rinc = 500; /* Determines the trade-off */ | |||
| /* Transient Numeric ID selection function */ | /* Transient Numeric ID selection function */ | |||
| id_range = max_id - min_id + 1; | id_range = max_id - min_id + 1; | |||
| retry = id_range; | retry = id_range; | |||
| skipping to change at line 1823 ¶ | skipping to change at line 1349 ¶ | |||
| if (suitable_id(next_id)) { | if (suitable_id(next_id)) { | |||
| return next_id; | return next_id; | |||
| } | } | |||
| retry = retry - id_inc; | retry = retry - id_inc; | |||
| } while (retry > 0); | } while (retry > 0); | |||
| return ERROR; | return ERROR; | |||
| ]]></sourcecode> | ||||
| </artwork> | <t>NOTE:</t> | |||
| </figure> | <t indent="3">random() is a PRNG that returns a pseudorandom unsigned i | |||
| </t> | nteger number of appropriate size. Beware that "adapting" the length of the outp | |||
| ut of random() with a modulo operator (e.g., C language's "%") may change the di | ||||
| <t> | stribution of the PRNG. To preserve a uniform distribution, the rejection sampli | |||
| This algorithm aims at producing a global monotonically-increasing sequence of t | ng technique <xref target="Romailler2020" format="default"/> can be used.</t> | |||
| ransient numeric identifiers, while avoiding the | ||||
| use of fixed increments, which would lead to trivially predictable sequences. T | ||||
| he value "id_inc" allows for direct control of the trade-off between unpredictab | ||||
| ility and identifier reuse frequency. The smaller the value of "id_inc" | ||||
| ;, the more similar this algorithm is to a predicable, global linear ID generati | ||||
| on algorithm (as the one in <xref target="trad_selection"/>). The larger the val | ||||
| ue of "id_inc", the more similar this algorithm is to the algorithm described in | ||||
| <xref target="simple-randomization"/> of this document.</t> | ||||
| <t> | <t indent="3">suitable_id() is a function that checks whether a candidate iden | |||
| When the identifiers wrap, there is a risk of collisions of transient numeric id | tifier is suitable (e.g., whether it is unique or not). | |||
| entifiers (i.e., identifier reuse). Therefore, "id_inc" should be selected accor | ||||
| ding to the following criteria: | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| <list style="symbols"> | This algorithm aims at producing a global monotonically increasing sequence of t | |||
| <t>It should maximize the wrapping time of the identifier space.</t> | ransient numeric identifiers while avoiding the | |||
| <t>It should minimize identifier reuse frequency.</t> | use of fixed increments, which would lead to trivially predictable sequences. T | |||
| <t>It should maximize unpredictability.</t> | he value "id_rinc" allows for direct control of the trade-off between unpredicta | |||
| </list> | bility and identifier reuse frequency. The smaller the value of "id_rinc", the m | |||
| </t> | ore similar this algorithm is to a predicable, global linear identifier generati | |||
| on algorithm (as the one in <xref target="trad_selection" format="default"/>). T | ||||
| <t> | he larger the value of "id_rinc", the more similar this algorithm is to the algo | |||
| Clearly, these are competing goals, and the decision of which value of "id_inc" | rithm described in <xref target="simple-randomization" format="default"/> of thi | |||
| to use is a trade-off. Therefore, the value of "id_inc" is at times a configurab | s document.</t> | |||
| le parameter so that system administrators can make the trade-off for themselves | <t> | |||
| . We note that the alternative algorithms discussed throughout this document off | When the identifiers wrap, there is a risk of collisions of transient numeric id | |||
| er better interoperability, security and privacy properties than this algorithm, | entifiers (i.e., identifier reuse). Therefore, "id_rinc" should be selected acco | |||
| and hence implementation of this algorithm is discouraged. | rding to the following criteria: | |||
| </t> | </t> | |||
| </section> | <ul spacing="normal"> | |||
| <li>It should maximize the wrapping time of the identifier space.</li> | ||||
| <section title="Re-using Identifiers Across Different Contexts" anchor="reuse-ac | <li>It should minimize identifier reuse frequency.</li> | |||
| ross-context"> | <li>It should maximize unpredictability.</li> | |||
| </ul> | ||||
| <t>Employing the same identifier across contexts in which stability is not requi | <t> | |||
| red (i.e. overloading the semantics of transient numeric identifier) usually has | Clearly, these are competing goals, and the decision of which value of "id_rinc" | |||
| negative security and privacy implications.</t> | to use is a trade-off. Therefore, the value of "id_rinc" is at times a configur | |||
| able parameter so that system administrators can make the trade-off for themselv | ||||
| <t>For example, in order to generate transient numeric identifiers of Category # | es. We note that the alternative algorithms discussed throughout this document o | |||
| 2 or Category #3, an implementation or specification might be tempted to employ | ffer better interoperability, security, and privacy properties than this algorit | |||
| a source for the numeric identifiers which is known to provide unique values, bu | hm, and hence, implementation of this algorithm is discouraged. | |||
| t that may also be predictable or leak information related to the entity generat | ||||
| ing the identifier. This technique has been employed in the past for e.g. genera | ||||
| ting IPv6 IIDs by re-using the MAC address of the underlying network interface. | ||||
| However, as noted in <xref target="RFC7721"/> and <xref target="RFC7707"/>, embe | ||||
| dding link-layer addresses in IPv6 IIDs not only results in predictable values, | ||||
| but also leaks information about the manufacturer of the underlying network inte | ||||
| rface card, allows for network activity correlation, and makes address-based sca | ||||
| nning attacks feasible. | ||||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="reuse-across-context" numbered="true" toc="default"> | |||
| </section> | <name>Reusing Identifiers Across Different Contexts</name> | |||
| <t>Employing the same identifier across contexts in which stability is n | ||||
| ot required (i.e., overloading the semantics of transient numeric identifiers) u | ||||
| sually has negative security and privacy implications.</t> | ||||
| <t>For example, in order to generate transient numeric identifiers of Ca | ||||
| tegory #2 or #3, an implementation or specification might be tempted to employ a | ||||
| source for the numeric identifiers that is known to provide unique values but t | ||||
| hat may also be predictable or leak information related to the entity generating | ||||
| the identifier. This technique has been employed in the past for, e.g., generat | ||||
| ing IPv6 IIDs by reusing the MAC address of the underlying network interface car | ||||
| d. However, as noted in <xref target="RFC7721" format="default"/> and <xref targ | ||||
| et="RFC7707" format="default"/>, embedding link-layer addresses in IPv6 IIDs not | ||||
| only results in predictable values but also leaks information about the manufac | ||||
| turer of the underlying network interface card, allows for network activity corr | ||||
| elation, and makes address-based scanning attacks feasible. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>The authors would like to thank (in alphabetical order) <contact fullna | ||||
| me="Bernard Aboba"/>, <contact fullname="Jean-Philippe Aumasson"/>, <contact ful | ||||
| lname="Steven Bellovin"/>, <contact fullname="Luis León Cárdenas Graide"/>, <con | ||||
| tact fullname="Spencer Dawkins"/>, <contact fullname="Theo de Raadt"/>, <contact | ||||
| fullname="Guillermo Gont"/>, <contact fullname="Joseph Lorenzo Hall"/>, <contac | ||||
| t fullname="Gre Norcie"/>, <contact fullname="Colin Perkins"/>, <contact fullnam | ||||
| e="Vincent Roca"/>, <contact fullname="Shivan Sahib"/>, <contact fullname="Rich | ||||
| Salz"/>, <contact fullname="Martin Thomson"/>, and <contact fullname="Michael Tü | ||||
| xen"/> for providing valuable comments on earlier draft versions of this documen | ||||
| t.</t> | ||||
| <t>The authors would like to thank <contact fullname="Shivan Sahib"/> and | ||||
| <contact fullname="Christopher Wood"/> for their guidance during the publication | ||||
| process of this document.</t> | ||||
| <t>The authors would like to thank <contact fullname="Jean-Philippe Aumass | ||||
| on"/> and <contact fullname="Mathew D. Green"/> (John Hopkins University) for ki | ||||
| ndly answering a number of questions.</t> | ||||
| <t>The authors would like to thank <contact fullname="Diego Armando Marado | ||||
| na"/> for his magic and inspiration.</t> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 195 change blocks. | ||||
| 2296 lines changed or deleted | 1805 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||