<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.12 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duke-taps-transport-discovery-02" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->
  <front>
    <title abbrev="transport-discovery">TAPS Transport Discovery</title>
    <seriesInfo name="Internet-Draft" value="draft-duke-taps-transport-discovery-02"/>
    <author initials="M." surname="Duke" fullname="Martin Duke">
      <organization>F5 Networks, Inc.</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>
    <date year="2021" month="October" day="25"/>
    <area>Transport</area>
    <workgroup>taps</workgroup>
    <abstract>
      <t>The Transport Services architecture decouples applications from the
protocol implementations that transport their data. While it is often
straightforward to connect applications with transports that are
present in the host operating system, providing a means of discovering
user-installed implementations dramatically enlarges the use cases.
This document discusses considerations for the design of a discovery
mechanism and an example of such a design.</t>
      <t>Discussion of this work is encouraged to happen on the TAPS IETF
mailing list <eref target="taps@ietf.org"/> or on the GitHub repository which
contains the draft: 
<eref target="https://github.com/martinduke/draft-duke-taps-transport-discovery"/>.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    mailing list (taps@ietf.org),
  which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/taps/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/martinduke/draft-duke-taps-transport-discovery"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>The Transport Services architecture <xref target="I-D.ietf-taps-arch" format="default"/> enables
applications to be protocol-agnostic by presenting an interface where
applications can specify their required properties, and the service will
select whichever protocol implementation available in the system best
meets those requirements. This increases application portability and
eases the introduction of new transport innovations by not requiring
changes to applications.</t>
      <t>It is sometimes straightforward for a Transport Services interface to
identify the transports available in the host operating system. However,
including transports installed by the user greatly expands use cases for
the architecture. This document presents considerations for the secure
design of a system for discovery of new protocol implementations.</t>
      <t>Protocol Discovery would ideally have several desirable properties.</t>
      <ul spacing="normal">
        <li>The transport services API should not have to recompile when
installing new implementations. This would not only disrupt ongoing
connections, but also involve ordinary users in the complex business of
downloading and building source code.</li>
        <li>It should support user-space implementations. Most protocol
innovation begins with user space implementations, and many transports
(e.g. TLS, HTTP, QUIC) are usually implemented outside the kernel long
after reaching maturity.</li>
        <li>Protocol Discovery should not subject ordinary users to security
vulnerabilities. A new protocol installation is an opportunity to hijack
a user's networking stack, and Protocol Discovery requires strong
protections against arbitrary code performing operations other than
advertised on application data.</li>
        <li>Conversely, sophisticated users need a means of discovering
implementations that are too new to have fully developed internet trust
mechanisms. This is the only means of initially deploying new protocols
for existing apps, and is the most plausible model to deploy transport
services API shims for existing protocol libraries (e.g., the common
TLS implementations) before their proponents deploy native support.</li>
        <li>Applications should not have to bring their own implementations.
The Transport Services API has the concept of "framers" (see Sec. 7.1
of <xref target="I-D.ietf-taps-interface" format="default"/>) that provide some ability for
applications to provide additional protocol encapsulation around their
messages. However, one important advantage of Transport Services is that
applications do not have to rely on a third-party implementation that
might not offer long term support, or add to their footprint where a
functionally equivalent protocol implementation is already present on
the system.</li>
      </ul>
      <t>This document attempts to resolve the tension between some of these
properties.</t>
    </section>
    <section anchor="conventions" numbered="true" toc="default">
      <name>Conventions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 <xref target="RFC2119" format="default"/>.</t>
      <t>"TAPS" is an abbreviation for the transport services API.</t>
      <t>For brevity, this document will use "app" as a shorthand for
"application."</t>
      <t>As in other TAPS documents, the concept of a "transport protocol" is
expanded beyond the traditional "transport layer" to include other
protocols that encapsulate application data, such as TLS, HTTP, and
Websockets.</t>
    </section>
    <section anchor="entities" numbered="true" toc="default">
      <name>Entities</name>
      <t>The Transport Services API (TAPS) is responsible for matching protocol
capabilities with application requirements, and mediating further app
communication with the selected protocol implementation. In this
document, it actively discovers what implementations are available in
the system.</t>
      <t>The protocol implementation instantiates the transport. In this
document, it offers a dynamically linked library that conforms to
standard interfaces so that TAPS can interchangeability interact with
it. In practice, this may be a shim layer if the underlying
implementation does not support TAPS.</t>
      <t>The protocol installer, aside from installing the implementation
library and/or a TAPS shim layer, also is responsible for notifying TAPS
that the implementation is present, and what its capabilities are.</t>
      <t>Finally, the application leverages TAPS to initiate, manage, and
terminate communications with other endpoints. This document does not
require any changes to application behavior beyond those in the core
TAPS design.</t>
      <t>More detailed requirements for each of these entities is below.</t>
    </section>
    <section anchor="protocol-implementation" numbered="true" toc="default">
      <name>Protocol Implementation</name>
      <t>The protocol implementation must offer a dynamically linked library that
offers certain APIs. TAPS SHOULD, in its documentation, provide a template for
the format of these functions.</t>
      <section anchor="functions" numbered="true" toc="default">
        <name>Functions</name>
        <t>The objects below need not follow the semantics of the TAPS application API.
In particular, a "message" is unlikely to have all the property information
described there, instead being a more primitive buffer in which raw data is
stored.</t>
        <t>'''
Listener := Listen(localEndpoint)
'''</t>
        <t>Listen opens a socket and listens on the specified address, and returns a
handle to the resulting listener.</t>
        <t>'''
Listener.Stop()
'''</t>
        <t>Stop causes the listener to stop accepting connections. Subsequent events will
return handles to the resulting connection.</t>
        <t>'''
Connection.Send(Message)
Connection.Receive(Message)
'''</t>
        <t>TAPS will provide a Message object for the protocol to either send, or use to
store incoming data.</t>
        <t>Further APIs are TBD.</t>
      </section>
      <section anchor="events" numbered="true" toc="default">
        <name>Events</name>
        <t>The protocol needs to throw all the events described in the TAPS Application
API, although the return values may not exactly conform to the same semantics.</t>
        <t>TAPS SHOULD provide an event framework that frees the protocol implementation
from running its own thread for a polling loop. TAPS also SHOULD account for
the possibility that the implementation may have its own polling architecture.
If true, the protocol MUST conform to the API by translating its events into
the signals or callbacks that TAPS expects.</t>
      </section>
    </section>
    <section anchor="protocol-installer" numbered="true" toc="default">
      <name>Protocol Installer</name>
      <t>The installer might use the operating system's package manager or "app
store", or be a simple script. Besides installing the implementation,
the installer also writes data to a registry that TAPS will access to
discover the implementation.</t>
      <t>This data will include:</t>
      <ul spacing="normal">
        <li>the name of the supported protocol(s);</li>
        <li>optionally, the versions of those protocols;</li>
        <li>the path to the implementations TAPS-compliant library;</li>
        <li>the properties that the protocol implementation supports, as described
in Section 4.2 of <xref target="I-D.ietf-taps-interface" format="default"/>; and</li>
        <li>information to authenticate the entry (see <xref target="security" format="default"/>).</li>
      </ul>
      <t>Of course, a de-installer should remove the appropriate registry entry.</t>
      <t>A TAPS implementation SHOULD provide a template for this registry information.</t>
      <t>One potential instantiation of this would have protocol installers write a
file to a directory that, in a specified markup language, described the
information above.</t>
    </section>
    <section anchor="taps" numbered="true" toc="default">
      <name>TAPS</name>
      <t>TAPS creates a registry for protocol implementations, which might be a
database or a directory. To prevent inadvertent security
vulnerabilities, the host system SHOULD, at minimum, require
administrative privileges to write to the registry.</t>
      <t>No later than upon receipt of request for a Preconnection, TAPS MUST
access the registry to determine the available protocols and their
properties. It is perfectly valid for there to be multiple
implementations of a protocol.</t>
      <t>TAPS SHOULD validate entries in the registry using the provided
authentication data.</t>
      <t>One potential instaniation would start daemon that monitored the status of the
registry. Upon any change to the registry, the daemon might:</t>
      <ul spacing="normal">
        <li>authenticate any new entry in accordance with security policy;</li>
        <li>verify that the required function handles are present;</li>
        <li>run tests to verify the installation's claimed properties;</li>
        <li>inform the user of the new protocol, requesting permission to trust it; and</li>
        <li>write the information into shared memory for the use of Preconnections.</li>
      </ul>
    </section>
    <section anchor="security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>User-space installation of protocols provides enormous opportunities
for attackers to hijack a network stack. While this has always been
possible with arbitrary protocol implementations, with TAPS applications
completely unaware of the installation can be victims of such an attack.</t>
      <t>An implementation might advertise properties it does not actually
provide to attract more traffic. For example, a "TLS" implementation
might not encrypt anything at all. A TAPS implementation MAY run tests on
newly installed protocols to verify it provides the advertised properties.</t>
      <t>Moreover, in principle an implementation could deliver application data
anywhere it wanted with little visibility to the application, much less
the user.</t>
      <t>The origin of the protocol installer is important to the trust model.
Obviously, transports in the kernel do not introduce vulnerabilities
specific to TAPS. A trusted package manager (e.g. the Apple App Store
or yum) may imply a minimal level of veracity of the available packages.
Protocol implementations directly downloaded from the internet without
mediation through these mechanisms require the greatest care.</t>
      <t>Ongoing work on this document will largely focus on building mechanisms
to mitigate this weakness. Some promising approaches include:</t>
      <ul spacing="normal">
        <li>administrative privileges to alter the TAPS registry;</li>
        <li>a special certificate authority that provides an authentication of
the implementation's explicit and implicit claims, as well as the
integrity of the installed binary;</li>
        <li>each installer generates a private key and provides the corresponding
public key, so that only possessors of the private key can modify or
delete the registry entry;</li>
        <li>confirmation by a human, prominently warned of potential
consequences, if the installation is not mediated through a trusted
authority.</li>
      </ul>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document has no IANA requirements.</t>
    </section>
    <section anchor="implementation-status" numbered="true" toc="default">
      <name>Implementation Status</name>
      <ul empty="true">
        <li>
          <t><strong>RFC Editor's Note:</strong>  Please remove this section prior to
publication of a final version of this document.</t>
        </li>
      </ul>
      <t>The <eref target="https://github.com/f5networks/dynamic-taps">Dynamic TAPS project</eref> is a
preliminary effort to implement the concepts in this document.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Informative References</name>
      <reference anchor="I-D.ietf-taps-arch">
        <front>
          <title>An Architecture for Transport Services</title>
          <author fullname="Tommy Pauly">
            <organization>Apple Inc.</organization>
          </author>
          <author fullname="Brian Trammell">
            <organization>Google Switzerland GmbH</organization>
          </author>
          <author fullname="Anna Brunstrom">
            <organization>Karlstad University</organization>
          </author>
          <author fullname="Godred Fairhurst">
            <organization>University of Aberdeen</organization>
          </author>
          <author fullname="Colin Perkins">
            <organization>University of Glasgow</organization>
          </author>
          <author fullname="Philipp S. Tiesel">
            <organization>SAP SE</organization>
          </author>
          <author fullname="Christopher A. Wood">
            <organization>Cloudflare</organization>
          </author>
          <date day="12" month="July" year="2021"/>
          <abstract>
            <t>   This document describes an architecture for exposing transport
   protocol features to applications for network communication, the
   Transport Services architecture.  The Transport Services Application
   Programming Interface (API) is based on an asynchronous, event-driven
   interaction pattern.  It uses messages for representing data transfer
   to applications, and it describes how implementations can use
   multiple IP addresses, multiple protocols, and multiple paths, and
   provide multiple application streams.  This document further defines
   common terminology and concepts to be used in definitions of
   Transport Services APIs and implementations.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-taps-arch-11"/>
      </reference>
      <reference anchor="I-D.ietf-taps-interface">
        <front>
          <title>An Abstract Application Layer Interface to Transport Services</title>
          <author fullname="Brian Trammell">
            <organization>Google Switzerland GmbH</organization>
          </author>
          <author fullname="Michael Welzl">
            <organization>University of Oslo</organization>
          </author>
          <author fullname="Theresa Enghardt">
            <organization>Netflix</organization>
          </author>
          <author fullname="Godred Fairhurst">
            <organization>University of Aberdeen</organization>
          </author>
          <author fullname="Mirja Kuehlewind">
            <organization>Ericsson</organization>
          </author>
          <author fullname="Colin Perkins">
            <organization>University of Glasgow</organization>
          </author>
          <author fullname="Philipp S. Tiesel">
            <organization>SAP SE</organization>
          </author>
          <author fullname="Christopher A. Wood">
            <organization>Cloudflare</organization>
          </author>
          <author fullname="Tommy Pauly">
            <organization>Apple Inc.</organization>
          </author>
          <author fullname="Kyle Rose">
            <organization>Akamai Technologies, Inc.</organization>
          </author>
          <date day="12" month="July" year="2021"/>
          <abstract>
            <t>   This document describes an abstract application programming
   interface, API, to the transport layer that enables the selection of
   transport protocols and network paths dynamically at runtime.  This
   API enables faster deployment of new protocols and protocol features
   without requiring changes to the applications.  The specified API
   follows the Transport Services Architecture by providing
   asynchronous, atomic transmission of messages.  It is intended to
   replace the traditional BSD sockets API as the common interface to
   the transport layer, in an environment where endpoints could select
   from multiple interfaces and potential transport protocols.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-taps-interface-13"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner">
            <organization/>
          </author>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
    </references>
    <section anchor="acknowledgments" numbered="true" toc="default">
      <name>Acknowledgments</name>
      <t>Tim Worsley contributed important ideas to this document.</t>
    </section>
    <section anchor="change-log" numbered="true" toc="default">
      <name>Change Log</name>
      <ul empty="true">
        <li>
          <t><strong>RFC Editor's Note:</strong>  Please remove this section prior to
publication of a final version of this document.</t>
        </li>
      </ul>
      <section anchor="since-draft-duke-taps-transport-discovery-00" numbered="true" toc="default">
        <name>since draft-duke-taps-transport-discovery-00</name>
        <ul spacing="normal">
          <li>Added output of initial implementation work</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
