RFC 9287 PROPOSED STANDARD QUIC · TRANSPORT · EXTENSIBILITY

Greasing the QUIC Bit

A QUIC extension that lets endpoints scramble one fixed header bit so networks cannot come to depend on it.

On rfc-editor.org ↗
PUBLISHED
August 2022
AUTHORS
M. Thomson
STREAM
IETF
TRANSPORT PARAMETER
grease_quic_bit (0x2ab2)
PARAMETER VALUE
Empty
QUIC BIT MASK
0x40 of the first byte
TOKEN LIFETIME FOR EARLY USE
Under 604800 seconds (7 days)
APPLIES TO
QUIC version 1
DOI
10.17487/RFC9287

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Internet Engineering Task Force (IETF)                        M. Thomson
Request for Comments: 9287                                       Mozilla
Category: Standards Track                                    August 2022
ISSN: 2070-1721


                         Greasing the QUIC Bit

Abstract

   This document describes a method for negotiating the ability to send
   an arbitrary value for the second-most significant bit in QUIC
   packets.

Status of This Memo

   This is an Internet Standards Track document.

   This document is a product of the Internet Engineering Task Force
   (IETF).  It represents the consensus of the IETF community.  It has
   received public review and has been approved for publication by the
   Internet Engineering Steering Group (IESG).  Further information on
   Internet Standards is available in Section 2 of RFC 7841.

   Information about the current status of this document, any errata,
   and how to provide feedback on it may be obtained at
   https://www.rfc-editor.org/info/rfc9287.

Copyright Notice

   Copyright (c) 2022 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (https://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Revised BSD License text as described in Section 4.e of the
   Trust Legal Provisions and are provided without warranty as described
   in the Revised BSD License.

Table of Contents

   1.  Introduction
   2.  Conventions and Definitions
   3.  The Grease QUIC Bit Transport Parameter
     3.1.  Clearing the QUIC Bit
     3.2.  Using the QUIC Bit
   4.  Security Considerations
   5.  IANA Considerations
   6.  References
     6.1.  Normative References
     6.2.  Informative References
   Author's Address

1.  Introduction

   The version-independent definition of QUIC [QUIC-INVARIANTS]
   intentionally describes a very narrow set of fields that are visible
   to entities other than endpoints.  Beyond those characteristics that
   are invariant, very little about the "wire image" [RFC8546] of QUIC
   is visible.

   The second-most significant bit of the first byte in every QUIC
   packet is defined as having a fixed value in QUIC version 1 [QUIC].
   The purpose of having a fixed value is to allow endpoints to
   efficiently distinguish QUIC from other protocols; see [DEMUX] for a
   description of a system that might use this property.  As this bit
   can identify a packet as QUIC, it is sometimes referred to as the
   "QUIC Bit".

   Where endpoints and the intermediaries that support them do not
   depend on the QUIC Bit having a fixed value, sending the same value
   in every packet is more of a liability than an asset.  If systems
   come to depend on a fixed value, then it might become infeasible to
   define a version of QUIC that attributes semantics to this bit.

   In order to safeguard future use of this bit, this document defines a
   QUIC transport parameter that indicates that an endpoint is willing
   to receive QUIC packets containing any value for this bit.  By
   sending different values for this bit, the hope is that the value
   will remain available for future use [USE-IT].

2.  Conventions and Definitions

   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 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

   This document uses terms and notational conventions from [QUIC].

3.  The Grease QUIC Bit Transport Parameter

   The grease_quic_bit transport parameter (0x2ab2) is defined for QUIC
   version 1 [QUIC].  This transport parameter can be sent by both
   client and server.  The transport parameter is sent with an empty
   value; an endpoint that understands this transport parameter MUST
   treat receipt of a non-empty value of the transport parameter as a
   connection error of type TRANSPORT_PARAMETER_ERROR.

   An endpoint that advertises the grease_quic_bit transport parameter
   MUST accept packets with the QUIC Bit set to a value of 0.  The QUIC
   Bit is defined as the second-most significant bit of the first byte
   of QUIC packets (that is, the value 0x40).

3.1.  Clearing the QUIC Bit

   Endpoints that receive the grease_quic_bit transport parameter from a
   peer SHOULD set the QUIC Bit to an unpredictable value unless another
   extension assigns specific meaning to the value of the bit.

   Endpoints can set the QUIC Bit to 0 on all packets that are sent
   after receiving and processing transport parameters.  This could
   include Initial, Handshake, and Retry packets.

   A client MAY also set the QUIC Bit to 0 in Initial, Handshake, or
   0-RTT packets that are sent prior to receiving transport parameters
   from the server.  However, a client MUST NOT set the QUIC Bit to 0
   unless the Initial packets it sends include a token provided by the
   server in a NEW_TOKEN frame (Section 19.7 of [QUIC]), received less
   than 604800 seconds (7 days) prior on a connection where the server
   also included the grease_quic_bit transport parameter.

      |  This 7-day limit allows for changes in server configuration.
      |  If server configuration changes and a client does not set the
      |  QUIC Bit, then it is possible that a server will drop packets,
      |  resulting in connection failures.

   A server MUST set the QUIC Bit to 0 only after processing transport
   parameters from a client.  A server MUST NOT remember that a client
   negotiated the extension in a previous connection and set the QUIC
   Bit to 0 based on that information.

   An endpoint MUST NOT set the QUIC Bit to 0 without knowing whether
   the peer supports the extension.  As Stateless Reset packets
   (Section 10.3 of [QUIC]) are only used after a loss of connection
   state, endpoints are unlikely to be able to set the QUIC Bit to 0 on
   Stateless Reset packets.

3.2.  Using the QUIC Bit

   The purpose of this extension is to allow for the use of the QUIC Bit
   by later extensions.

   Extensions to QUIC that define semantics for the QUIC Bit can be
   negotiated at the same time as the grease_quic_bit transport
   parameter.  In this case, a recipient needs to be able to distinguish
   a randomized value from a value carrying information according to the
   extension.  Extensions that use the QUIC Bit MUST negotiate their use
   prior to acting on any semantic.

   For example, an extension might define a transport parameter that is
   sent in addition to the grease_quic_bit transport parameter.  Though
   the value of the QUIC Bit in packets received by a peer might be set
   according to rules defined by the extension, they might also be
   randomized as specified in this document.

   The receipt of a transport parameter for an extension that uses the
   QUIC Bit could be used to confirm that a peer supports the semantic
   defined in the extension.  To avoid acting on a randomized signal,
   the extension can require that endpoints set the QUIC Bit according
   to the rules of the extension but defer acting on the information
   conveyed until the transport parameter for the extension is received.

   Extensions that define semantics for the QUIC Bit can be negotiated
   without using the grease_quic_bit transport parameter.  However,
   including both extensions allows for the QUIC Bit to be greased even
   if the alternative use is not supported.

4.  Security Considerations

   This document introduces no new security considerations for endpoints
   or entities that can rely on endpoint cooperation.  However, this
   change makes the task of identifying QUIC more difficult without
   cooperation of endpoints.  This sometimes works counter to the
   security goals of network operators who rely on network
   classification to identify threats; see Section 3.1 of
   [MANAGEABILITY] for a more comprehensive treatment of this topic.

5.  IANA Considerations

   This document registers the grease_quic_bit transport parameter in
   the "QUIC Transport Parameters" registry established in Section 22.3
   of [QUIC].  The following fields are registered:

   Value:  0x2ab2

   Parameter Name:  grease_quic_bit

   Status:  Permanent

   Specification:  RFC 9287

   Date:  2022-07-13

   Change Controller:  IETF (iesg@ietf.org)

   Contact:  QUIC Working Group (quic@ietf.org)

   Notes:  (none)

6.  References

6.1.  Normative References

   [QUIC]     Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
              Multiplexed and Secure Transport", RFC 9000,
              DOI 10.17487/RFC9000, May 2021,
              <https://www.rfc-editor.org/info/rfc9000>.

   [QUIC-INVARIANTS]
              Thomson, M., "Version-Independent Properties of QUIC",
              RFC 8999, DOI 10.17487/RFC8999, May 2021,
              <https://www.rfc-editor.org/info/rfc8999>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/info/rfc8174>.

6.2.  Informative References

   [DEMUX]    Aboba, B., Salgueiro, G., and C. Perkins, "Multiplexing
              Scheme Updates for QUIC", Work in Progress, Internet-
              Draft, draft-ietf-avtcore-rfc7983bis-06, 5 August 2022,
              <https://datatracker.ietf.org/doc/html/draft-ietf-avtcore-
              rfc7983bis-06>.

   [MANAGEABILITY]
              Kuehlewind, M. and B. Trammell, "Manageability of the QUIC
              Transport Protocol", Work in Progress, Internet-Draft,
              draft-ietf-quic-manageability-18, 15 July 2022,
              <https://datatracker.ietf.org/doc/html/draft-ietf-quic-
              manageability-18>.

   [RFC8546]  Trammell, B. and M. Kuehlewind, "The Wire Image of a
              Network Protocol", RFC 8546, DOI 10.17487/RFC8546, April
              2019, <https://www.rfc-editor.org/info/rfc8546>.

   [USE-IT]   Thomson, M. and T. Pauly, "Long-Term Viability of Protocol
              Extension Mechanisms", RFC 9170, DOI 10.17487/RFC9170,
              December 2021, <https://www.rfc-editor.org/info/rfc9170>.

Author's Address

   Martin Thomson
   Mozilla
   Email: mt@lowentropy.net

AI ELI5

On this page
PROBLEMThe second-most significant bit of the first byte of every QUIC version 1 packet has a fixed value. If networks start relying on it, nobody will be able to give that bit a meaning later.
MECHANISMEndpoints advertise an empty grease_quic_bit transport parameter (0x2ab2). A peer that sees it may then set the QUIC Bit to an unpredictable value, and the advertiser MUST accept packets where it is 0.
THE CATCHThe bit stays free for future extensions, at the cost of making QUIC harder to identify for network operators who classify traffic without endpoint cooperation.

§1Why the QUIC Bit Needs Protecting

The version-independent definition of QUIC (RFC 8999) deliberately describes only a very narrow set of fields that anyone other than the endpoints can see. Beyond those invariant characteristics, very little of QUIC's "wire image" (RFC 8546) is visible.

In QUIC version 1 (RFC 9000), the second-most significant bit of the first byte of every packet has a fixed value. The point of the fixed value is to let endpoints efficiently tell QUIC apart from other protocols. Because it can identify a packet as QUIC, it is sometimes called the QUIC Bit.

The RFC argues that where endpoints and their intermediaries do not need the fixed value, sending the same value in every packet is more of a liability than an asset. If systems come to depend on it, it might become infeasible to define a QUIC version that gives the bit a meaning.

One tiny switch on every QUIC message is always set the same way. If people start counting on that, nobody can ever use the switch for something new.

§3The Grease QUIC Bit Transport Parameter

The extension defines the grease_quic_bit transport parameter, with value 0x2ab2, for QUIC version 1. Both client and server can send it. It is sent with an empty value, and an endpoint that understands it MUST treat a non-empty value as a connection error of type TRANSPORT_PARAMETER_ERROR.

An endpoint that advertises the parameter MUST accept packets with the QUIC Bit set to 0. The QUIC Bit is the second-most significant bit of the first byte, that is, the value 0x40.

In other words, sending the parameter is a promise: "I do not depend on this bit, so you can put anything in it." The hope stated in the RFC is that by sending different values the bit will remain available for future use.

Each side says "I will not be upset if that switch is off." Only after hearing that is the other side allowed to flip it.

§3.1Clearing the QUIC Bit

An endpoint that receives the parameter from its peer SHOULD set the QUIC Bit to an unpredictable value, unless another extension assigns the bit a specific meaning. Once an endpoint has received and processed the peer's transport parameters, it can set the bit to 0 on all packets it sends, which could include Initial, Handshake and Retry packets.

A client MAY also set the bit to 0 in Initial, Handshake or 0-RTT packets sent before it has the server's transport parameters. It MUST NOT do so unless its Initial packets carry a token from the server's NEW_TOKEN frame, received less than 604800 seconds (7 days) earlier on a connection where the server also included the parameter. The RFC says this limit allows for changes in server configuration: if a server stops supporting the extension and the client does not set the bit, the server might drop packets and the connection fails.

A server MUST set the bit to 0 only after processing the client's transport parameters. A server MUST NOT remember from a previous connection that a client negotiated the extension. In general, an endpoint MUST NOT set the bit to 0 without knowing the peer supports the extension. Stateless Reset packets are only used after connection state is lost, so endpoints are unlikely to be able to clear the bit on them.

You may only flip the switch once you are sure the other side said it is fine. Servers must ask again each time and cannot just remember from last time.

WHEN THE QUIC BIT MAY BE CLEARED
EndpointMay set the bit to 0Must not
Any endpointAfter processing the peer's transport parametersWithout knowing the peer supports the extension
ClientEarlier, in Initial, Handshake or 0-RTT, with a NEW_TOKEN token less than 604800 seconds oldDo so without such a token
ServerOnly after processing the client's transport parametersRemember the extension from a previous connection

§3.2Using the QUIC Bit for Something Else

The purpose of the extension is to let later extensions use the QUIC Bit. An extension that gives the bit a meaning can be negotiated at the same time as grease_quic_bit. The recipient then has to be able to tell a randomized value from one that carries information. Extensions that use the bit MUST negotiate their use before acting on any semantic.

For example, an extension might define its own transport parameter alongside grease_quic_bit. The bit might be set by the extension's rules, or it might be randomized. To avoid acting on a randomized signal, the extension can require endpoints to set the bit by its rules but defer acting on it until the extension's transport parameter has been received.

Such an extension can also be negotiated without grease_quic_bit, but including both lets the bit be greased even when the alternative use is not supported.

If someone invents a real job for the switch, both sides first agree to it. Until then, a flip might just be random, so you do not act on it.

§4Security Considerations

The RFC says it introduces no new security considerations for endpoints or for entities that can rely on endpoint cooperation. However, the change makes it more difficult to identify QUIC without the endpoints' cooperation.

That sometimes works against the security goals of network operators who rely on network classification to identify threats. The RFC points to a draft on the manageability of QUIC for a fuller treatment.

Hiding the always-the-same switch makes it harder for network guards to spot QUIC traffic by looking at it, and some guards do not like that.

§5IANA Considerations

The RFC registers the grease_quic_bit transport parameter in the "QUIC Transport Parameters" registry. The registration has value 0x2ab2, status Permanent, specification RFC 9287 and date 2022-07-13. The change controller is the IETF and the contact is the QUIC Working Group.

The number 0x2ab2 is officially written down in a list so nobody else uses it for something different.

§7References