<?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-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-optimistic-upgrade-05" category="std" consensus="true" submissionType="IETF" updates="9112, 9298" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="Optimistic HTTP Upgrade Security">Security Considerations for Optimistic Protocol Transitions in HTTP/1.1</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-optimistic-upgrade-05"/>
    <author fullname="Benjamin M. Schwartz">
      <organization>Meta Platforms, Inc.</organization>
      <address>
        <email>ietf@bemasc.net</email>
      </address>
    </author>
    <date year="2025" month="August" day="20"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTPBIS</workgroup>
    <abstract>
      <?line 33?>

<t>In HTTP/1.1, the client can request a change to a new protocol on the existing connection.  This document discusses the security considerations that apply to data sent by the client before this request is confirmed, and updates RFC 9112 and RFC 9298 to avoid related security issues.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-optimistic-upgrade/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions"/>.</t>
    </note>
  </front>
  <middle>
    <?line 38?>

<section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="background">
      <name>Background</name>
      <t>In HTTP/1.1 and later, a single connection can be used for many requests.  In HTTP/2 and HTTP/3, these requests can be multiplexed, as each request is distinguished explicitly by its stream ID.  However, in HTTP/1.1, requests are strictly sequential, and each new request is distinguished implicitly by the closure of the preceding request.</t>
      <t>HTTP/1.1 is also the only version of HTTP that allows the client to change the protocol used for the remainder of the connection.  There are two mechanisms to request such a protocol transition.  One mechanism is the Upgrade request header field (<xref section="7.8" sectionFormat="comma" target="HTTP"/>), which indicates that the client would like to use this connection for a protocol other than HTTP/1.1.  The server replies with a 101 (Switching Protocols) status code if it accepts the protocol change.</t>
      <t>The other mechanism is the HTTP CONNECT method.  This method indicates that the client wishes to establish a TCP connection to the specified host and port.  The server replies with a 2xx (Successful) response to indicate that the request was accepted and a TCP connection was established.  After this point, the TCP connection is acting as a TCP tunnel, not an HTTP/1.1 connection.</t>
      <t>Both of these mechanisms also permit the server to reject the request.  For example, <xref target="HTTP"/> says:</t>
      <ul empty="true">
        <li>
          <t>A server <bcp14>MAY</bcp14> ignore a received Upgrade header field if it wishes to continue using the current protocol on that connection.</t>
        </li>
      </ul>
      <t>and</t>
      <ul empty="true">
        <li>
          <t>A server <bcp14>MUST</bcp14> reject a CONNECT request that targets an empty or invalid port number, typically by responding with a 400 (Bad Request) status code.</t>
        </li>
      </ul>
      <t>Rejections are common, and can happen for a variety of reasons.  A request using Upgrade might be rejected if:</t>
      <ul spacing="normal">
        <li>
          <t>The server does not support any of the client's indicated upgrade tokens (i.e., the client's proposed new protocols), so it continues to use HTTP/1.1.</t>
        </li>
        <li>
          <t>The server knows that an upgrade to the offered protocol will not provide any improvement over HTTP/1.1 for this request to this resource, so it chooses to respond in HTTP/1.1.</t>
        </li>
        <li>
          <t>The server requires the client to authenticate before upgrading the protocol, so it replies with the status code 401 (Authentication Required) and provides a challenge in an Authorization response header field (<xref section="11.6.2" sectionFormat="comma" target="HTTP"/>).</t>
        </li>
        <li>
          <t>The resource has moved, so the server replies with a 3xx (Redirection) status code (<xref section="3.4" sectionFormat="comma" target="HTTP"/>).</t>
        </li>
      </ul>
      <t>Similarly, a CONNECT request might be rejected if:</t>
      <ul spacing="normal">
        <li>
          <t>The server does not support HTTP CONNECT.</t>
        </li>
        <li>
          <t>The specified destination is not allowed under server policy.</t>
        </li>
        <li>
          <t>The destination cannot be resolved, is unreachable, or does not accept the connection.</t>
        </li>
        <li>
          <t>The proxy requires the client to authenticate before proceeding.</t>
        </li>
      </ul>
      <t>After rejecting a request, the server will continue to interpret subsequent bytes on that connection in accordance with HTTP/1.1.</t>
      <t><xref target="HTTP"/> also states:</t>
      <ul empty="true">
        <li>
          <t>A client cannot begin using an upgraded protocol on the connection until it has completely sent the request message (i.e., the client can't change the protocol it is sending in the middle of a message).</t>
        </li>
      </ul>
      <t>However, because of the possibility of rejection, the converse is not true: a client cannot necessarily begin using a new protocol merely because it has finished sending the corresponding request message.</t>
      <t>In some cases, the client might expect that the protocol transition will succeed.  If this expectation is correct, the client might be able to reduce delay by immediately sending the first bytes of the new protocol "optimistically", without waiting for the server's response.  This document explores the security implications of this "optimistic" behavior.</t>
    </section>
    <section anchor="possible-security-issues">
      <name>Possible Security Issues</name>
      <t>When there are only two distinct parties involved in an HTTP/1.1 connection (i.e., the client and the server), protocol transitions introduce no new security issues: each party must already be prepared for the other to send arbitrary data on the connection at any time.  However, HTTP connections often involve more than two parties, if the requests or responses include third-party data.  For example, a browser (party 1) might send an HTTP request to an origin (party 2) with path, headers, or content controlled by a website from a different origin (party 3).  Post-transition protocols such as WebSocket similarly are often used to convey data chosen by a third party.</t>
      <t>If the third-party data source is untrusted, we call the data it provides "attacker-controlled".  The combination of attacker-controlled data and optimistic protocol transitions results in two significant security issues.</t>
      <section anchor="request-smuggling">
        <name>Request Smuggling</name>
        <t>In a Request Smuggling attack (<xref section="11.2" sectionFormat="comma" target="RFC9112"/>) the attacker-controlled data is chosen in such a way that it is interpreted by the server as an additional HTTP request.  These attacks allow the attacker to speak on behalf of the client while bypassing the client's own rules about what requests it will issue.  Request Smuggling can occur if the client and server have distinct interpretations of the data that flows between them.</t>
        <t>If the server accepts a protocol transition request, it interprets the subsequent bytes in accordance with the new protocol.  If it rejects the request, it interprets those bytes as HTTP/1.1.  However, the client cannot know which interpretation the server will take until it receives the server's response status code.  If it uses the new protocol optimistically, this creates a risk that the server will interpret attacker-controlled data in the new protocol as an additional HTTP request issued by the client.</t>
        <t>As a trivial example, consider an HTTP CONNECT client providing connectivity to an untrusted application.  If the client is authenticated to the proxy server using a connection-level authentication method such as TLS Client Certificates, the attacker could send an HTTP/1.1 POST request for the proxy server at the beginning of its TCP connection.  If the client delivers this data optimistically, and the CONNECT request fails, the server would misinterpret the application's data as a subsequent authenticated request issued by the client.</t>
      </section>
      <section anchor="parser-exploits">
        <name>Parser Exploits</name>
        <t>A related category of attacks use protocol disagreement to exploit vulnerabilities in the server's request parsing logic.  These attacks apply when the HTTP client is trusted by the server, but the post-transition data source is not.  If the server software was developed under the assumption that some or all of the HTTP request data is not attacker-controlled, optimistic transmission can cause this assumption to be violated, exposing vulnerabilities in the server's HTTP request parser.</t>
      </section>
    </section>
    <section anchor="operational-issues">
      <name>Operational Issues</name>
      <t>If the server rejects the transition request, the connection can continue to be used for HTTP/1.1.  There is no requirement to close the connection in response to a rejected transition, and keeping the connection open has performance advantages if additional HTTP requests to this server are likely.  Thus, it is normally inappropriate to close the connection in response to a rejected transition.</t>
    </section>
    <section anchor="existing">
      <name>Impact on HTTP Upgrade with Existing Upgrade Tokens</name>
      <t>This section describes the impact of this document's considerations on some registered upgrade tokens that are believed to be in use at the time of writing.</t>
      <section anchor="tls">
        <name>"TLS"</name>
        <t>The "TLS" family of upgrade tokens was defined in <xref target="RFC2817"/>, which correctly highlights the possibility of the server rejecting the upgrade. If a client ignores this possibility and sends TLS data optimistically, the result cannot be valid HTTP/1.1: the first octet of a TLS connection must be 22 (ContentType.handshake), but this is not an allowed character in an HTTP/1.1 method.  A compliant HTTP/1.1 server will treat this as a parsing error and close the connection without processing further requests.</t>
      </section>
      <section anchor="websocketwebsocket">
        <name>"WebSocket"/"websocket"</name>
        <t><xref section="4.1" sectionFormat="of" target="WEBSOCKET"/> says:</t>
        <ul empty="true">
          <li>
            <t>Once the client's opening handshake has been sent, the client <bcp14>MUST</bcp14> wait for a response from the server before sending any further data.</t>
          </li>
        </ul>
        <t>Thus, optimistic use of HTTP Upgrade is already forbidden in the WebSocket protocol.  Additionally, the WebSocket protocol requires high-entropy masking of client-to-server frames (<xref section="5.1" sectionFormat="of" target="WEBSOCKET"/>).</t>
      </section>
      <section anchor="connect-udp">
        <name>"connect-udp"</name>
        <t><xref section="5" sectionFormat="of" target="CONNECT-UDP"/> says:</t>
        <ul empty="true">
          <li>
            <t>A client <bcp14>MAY</bcp14> optimistically start sending UDP packets in HTTP Datagrams before receiving the response to its UDP proxying request.</t>
          </li>
        </ul>
        <t>However, in HTTP/1.1, this "proxying request" is an HTTP Upgrade request.  This upgrade is likely to be rejected in certain circumstances, such as when the UDP destination address (which is attacker-controlled) is invalid.  Additionally, the contents of the "connect-udp" protocol stream can include untrusted material (i.e., the UDP packets, which might come from other applications on the client device).  This creates the possibility of Request Smuggling attacks.  To avoid these concerns, this document replaces that text to exclude HTTP/1.1 from any optimistic sending, as follows:</t>
        <ul empty="true">
          <li>
            <t>A client <bcp14>MAY</bcp14> optimistically start sending UDP packets in HTTP Datagrams before receiving the response to its UDP proxying request, but only if the HTTP version in use is HTTP/2 or later. Clients <bcp14>MUST NOT</bcp14> send UDP packets optimistically in HTTP/1.x due to the risk of request smuggling attacks.</t>
          </li>
        </ul>
      </section>
      <section anchor="connect-ip">
        <name>"connect-ip"</name>
        <t>The "connect-ip" upgrade token is defined in <xref target="CONNECT-IP"/>.  <xref section="11" sectionFormat="of" target="CONNECT-IP"/> forbids clients from sending packets optimistically in HTTP/1.1, avoiding this issue.</t>
      </section>
    </section>
    <section anchor="guidance-for-future-upgrade-tokens">
      <name>Guidance for Future Upgrade Tokens</name>
      <t>There are now several good examples of designs that reduce or eliminate the security concerns discussed in this document and may be applicable in future specifications:</t>
      <ul spacing="normal">
        <li>
          <t>Forbid optimistic use of HTTP Upgrade (<xref section="4.1" sectionFormat="of" target="WEBSOCKET"/>, <xref section="11" sectionFormat="of" target="CONNECT-IP"/>).</t>
        </li>
        <li>
          <t>Embed a fixed preamble that deliberately terminates HTTP/1.1 processing (<xref section="3.4" sectionFormat="of" target="RFC9113"/>).</t>
        </li>
        <li>
          <t>Apply high-entropy masking of client-to-server data (<xref section="5.1" sectionFormat="of" target="WEBSOCKET"/>).</t>
        </li>
      </ul>
      <t>Future specifications for upgrade tokens should account for the security issues discussed here and provide clear guidance on how implementations can avoid them.</t>
      <section anchor="selection-of-request-methods">
        <name>Selection of Request Methods</name>
        <t>Some upgrade tokens, such as "TLS", are defined for use with any ordinary HTTP method.  The upgraded protocol continues to provide HTTP semantics, and will convey the response to this HTTP request.</t>
        <t>The other upgrade tokens mentioned in <xref target="existing"/> do not preserve HTTP semantics, so the method is not relevant.  All of these upgrade tokens are specified only for GET requests with no content.</t>
        <t>Future specifications for upgrade tokens should restrict their use to GET requests with no content if the HTTP method is otherwise irrelevant and the request does not need to carry any message content.  This improves consistency with other upgrade tokens and simplifies server implementation.</t>
      </section>
    </section>
    <section anchor="guidance-for-http-connect">
      <name>Guidance for HTTP CONNECT</name>
      <t>This document updates RFC 9112 to include the remaining text of this section.  The requirements in this section apply only to HTTP/1.1.</t>
      <t>Proxy clients that send CONNECT requests on behalf of untrusted TCP clients <bcp14>MUST</bcp14> do one or both of the following:</t>
      <ol spacing="normal" type="1"><li>
          <t>Wait for a 2xx (Successful) response before forwarding any TCP payload data.</t>
        </li>
        <li>
          <t>Send a "Connection: close" request header.</t>
        </li>
      </ol>
      <t>Proxy clients that don't implement at least one of these two behaviors are vulnerable to a trivial request smuggling attack (<xref section="11.2" sectionFormat="comma" target="RFC9112"/>).</t>
      <t>At the time of writing, some proxy clients are believed to be vulnerable as described.  As a mitigation, proxy servers <bcp14>MUST</bcp14> close the underlying connection when rejecting a CONNECT request, without processing any further requests on that connection, unless the client is known to wait for a 2xx (Successful) response before forwarding TCP payload data.  This requirement applies whether or not the request includes a "close" connection option.</t>
      <t>Note that this mitigation will frequently impair the performance of correctly implemented clients, especially when returning a 407 (Proxy Authentication Required) response.  This performance loss can be avoided by using HTTP/2 or HTTP/3, which are not vulnerable to this attack.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document describes security considerations related to optimistic use of protocol transitions in HTTP/1.1.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </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"/>
            <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>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="CONNECT-UDP">
          <front>
            <title>Proxying UDP in HTTP</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC2817">
          <front>
            <title>Upgrading to TLS Within HTTP/1.1</title>
            <author fullname="R. Khare" initials="R." surname="Khare"/>
            <author fullname="S. Lawrence" initials="S." surname="Lawrence"/>
            <date month="May" year="2000"/>
            <abstract>
              <t>This memo explains how to use the Upgrade mechanism in HTTP/1.1 to initiate Transport Layer Security (TLS) over an existing TCP connection. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2817"/>
          <seriesInfo name="DOI" value="10.17487/RFC2817"/>
        </reference>
        <reference anchor="WEBSOCKET">
          <front>
            <title>The WebSocket Protocol</title>
            <author fullname="I. Fette" initials="I." surname="Fette"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6455"/>
          <seriesInfo name="DOI" value="10.17487/RFC6455"/>
        </reference>
        <reference anchor="CONNECT-IP">
          <front>
            <title>Proxying IP in HTTP</title>
            <author fullname="T. Pauly" initials="T." role="editor" surname="Pauly"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="A. Chernyakhovsky" initials="A." surname="Chernyakhovsky"/>
            <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document describes how to proxy IP packets in HTTP. This protocol is similar to UDP proxying in HTTP but allows transmitting arbitrary IP packets. More specifically, this document defines a protocol that allows an HTTP client to create an IP tunnel through an HTTP server that acts as an IP proxy. This document updates RFC 9298.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9484"/>
          <seriesInfo name="DOI" value="10.17487/RFC9484"/>
        </reference>
      </references>
    </references>
    <?line 196?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document benefited from valuable reviews and suggestions by:</t>
      <ul spacing="normal">
        <li>
          <t>Mike Bishop</t>
        </li>
        <li>
          <t>Mark Nottingham</t>
        </li>
        <li>
          <t>Kazuho Oku</t>
        </li>
        <li>
          <t>Lucas Pardue</t>
        </li>
        <li>
          <t>David Schinazi</t>
        </li>
        <li>
          <t>Glenn Strauss</t>
        </li>
        <li>
          <t>Michael Sweet</t>
        </li>
        <li>
          <t>Willy Tarreau</t>
        </li>
        <li>
          <t>Martin Thomson</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA81bzXLbSJK+4ylq6IOtCZJtyfK0rZjpXlmWuxVjW1pLDkfH
xh6KQJGsEQhgUYAotkPvss8yTzZfZlYBBZKyd3sve7FFCqjK3y+/zCpNJpOk
sU1uTtTo2qRtbZuNOisLZzNT68biJzUva3VZNXZlXWNTdVWXTZmWubqpNZ6T
Z2yhfr25ufrhcHo4SvRsVps7rBi9Rb9Vn6tFrTOjwk6jJNWNWZT15kS5JkuS
rEwLvYIwWa3nzcSaZj5ZNk01s25SdotNWlln8vxl4toZvnQQotlUePHi/OZd
UrSrmalPkgyrnyQpBDSFa92JaurWJJDsRaJroyHhFzNTusjURdGYujCNKFWV
dTNK1mV9u6jLtsJzJP6bi+tRcms2+D47Se5M0WJxpRa2WbYzPEOCrhc/0H8T
c99gSzLNKGkrkgO7vz48PBqr10evXyWJbptlCRHVBEsoNW/zXDR/Y4p/6BXs
+WGqrtPlWtfN7/xIWS90YX9np5yoD6bR6irXDbyzcmMokE75MbPSNj9RZLp/
m+GDS6fQK0kKPId371jmT+/OSJgTfiOzrso1XBA8mNhivvv0i31PHyVJMplM
lJ65ptYp9rnoI2GsmqVRaW5N0ahUF6o2/9Ua1yit0qUuFkY1JX4uzFpVIajK
gl8y9+TpYqHgvMKkpPNUqZuldQox0q5oRUiSts4Zx2+4EL3pMHqbpcaGVZVv
aDd4QuNRvD3bxNLNDDSGPLRBkBI/Yq25rVcmG3OUeE+SQdiZ/CV/gE9ZmbvS
ZlgAfjFZLxICFCtOva1WNstykyRPKNEQRiInLfXWzG0hGZUkN5AO0aYo3Jwa
ffh8fTMay//q4yX//On83z9ffDp/Sz9f/3r6/n33Q+KfuP718vP7t/1P/Ztn
lx8+nH98Ky/jWzX4Khl9OP1tJFqPLq9uLi4/nr4fUZo3Ax/omp04M/gVMqiq
DSmuXZIZl9Z2hg94583Z1T//+/BYff36J1jr6PDw9cOD//Dq8MdjfFgvTSG7
lQU8JR/hn00C1xld0yo6zxFFlW10joDXTrlluS7U0tQGpv3zf5Bl/vNE/XWW
VofHP/kvSOHBl8Fmgy/ZZrvf7LwsRtzz1Z5tOmsOvt+y9FDe098Gn4Pdoy//
+nNuC6Mmh69+/imhEHqjUwYpWO7rk1n34WGQiGxYiskadlMOeZWbKLM4N+HC
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
iATj/Pzl/M315dnfz2/ouPAvxy9fxucul5TfQ9IOBKB9O1sxHMyIL9PobEAy
+aCEBiT+BKLLU+5Jo8DxA8gwkaH2PejF/TTFNAFEBPV+UjZIZT7llTkC1pvZ
LJO+iHbqG9iIXJ92WBXia/exfoJKeTAxVHiqjVppd+tpjWg7acqJV2de6xWe
f9Yb++W2sWVCTZ7y7p20WTXwz0t64U+e5Ew+v5Xj3KPXr4bnYsHUp79t5QuR
8LrpbIoFEGWkWXf/S72FbWG5lQsOEFofEnhwJInXeAnieFuH7HvP/WV+tf34
iH20hcBxw0nNf+9NqQ8eAPtBPWojGKum/20NpIWmiFPER+C2Hd0hkeMBO4oT
tIJrfM/j9lGKA+maGVn2BokfuXQN5MCHfeD4yxFUy8OkqKf9K7rgQf1ENGOL
fBRQWMZEKZUMThqZhUUM1nUTsECg72xqDoIxQyu1B7gfG0bQseBNuB0l57rQ
DxYv3HhY3vikRqfd8bm59wRWlO2PzHgERYeDff76uORbJ/OSL178/4hogX4e
m9qIjoYLI74MWxcu2QDZ+LLO1HdTToWbTNI2xWJu6dMnzL3K2u6EkpteHvn7
6yE7Dhoih61C0Y++GVZ8vk8zqPcBWC4EV45fHT88wPE9/hwKYvXPAXcEVZ13
kRPHBn98V0mgAgeVeINLK412iJv90loZg1CheNc2dK9nSMVYQz/TpqGFI8xB
+izKMgs9OSck0h0kw4ekn//TMDaHUIVcqhjeP+TI7u4nZnuuzRWUrjyb9olH
g3c8NhdB/Qmgz0c+RHzHhvpevXr2jWpMROybzuAD1fMVXdrTYDz3fNwFvOGT
D9KdWukZEU+GULqJUTAUdGkZsYhIkhfTY0YHuUbq9znlLvJ/XACZvn2//L3b
Zz8OgS266pbcydO4DAganbUMZq+RDyVU+vNsiEj3EhchzCDTEkFEhy7cMfmt
Cao73FtJml2bPDQ/PWZ+YKaHoLwmZB5K25chJuFjDtmQfKyc810HQ2KNfKDT
DI6M6JaS2XOMObgAEVTjF51BL4Y4c9K+hXNZmsZvAx8H92DSG9+i2rL8Sm68
BtjouqEHpIe/NGHY6Tti+DP9cNNKWHQNY1KzSGW16/fdtgXlrmB3rs5YTIb7
5fymbyfZgkUZivEfCCdIzvcRSQYrboF5vrXJoCL0mrHl1pbKQh007MZU3Rwj
HNoXxh+W6LrecAyEI+agiq/d/g6K7yHBGop0IxLtdRV3UHyMOKfZhU/FYYjv
gm08ufQtbgd8Ozeo+YA/nHmFm48M51T6Q/fr4suP8VzCddgaumiZTskZZRmf
/V/xLDHUGRkUUTXdGvq54clDT694zBjXY4Qrwpgqway/suaZBzQAah9O1Ze+
V3n8gp5nFvhnreuuX6ENK73JS535ngXrXfPcVI3OuhbuRBq70dbNzf0aZyVd
MOg8SL0/YIxa28L0uUMnUuFsWFInjLFyPxEJo+vHCMW3jp9o/L135DCWQUY1
EHvP3CIShocO/qY5IQB1vissttAyeIoHyN5tfRvME8R8M/wzA2H68S2VrQAZ
7+uZ4/4yDqSt6ylj7JlTtzCcyNOZCc8Q138sWnYixad7PMBjnmG4kWEpsQnf
8ojwxCci2XDkY2owqPPp/rHs75HSxdfO3FIj5rVMvHO+gaCtn+RH0z2q790o
qItFGoOIz8fKMOIy2fPuAA4X4o7j5z+qZxLaj947274pEe8OxbrL6lyZZVgt
Zx49Aw+33KVpEo7YbOWBTFs44BkGH/kLqm0Q7Ad9j/3RSpj0Y49dwvfI/YgY
656oi9OPp98Rg6YsKET8pJYbDOFPVOgPCWiV05RCEw3sgsE2+Xoit0xN9rfR
XOeIkIftVWemADEh4ZnKo+Vt2Vw1ukiz9jUFYEEtNAk+2zC9/UA3w99Y1NGK
Pun6ViHOKAOXeoVv/q5/b5elurxt8eF9m0L2K0R/a/DxLYAqoz+WAu353eKL
X3JTFOoa9gF348XTpTa5ul4b0+DzF0uRdYNqaXQr22EnhEq5cmWR/AuCaeh1
FTcAAA==

-->

</rfc>
