Re: [TLS] Enforcing Protocol Invariants

David Benjamin <davidben@chromium.org> Wed, 13 June 2018 21:22 UTC

Return-Path: <davidben@google.com>
X-Original-To: tls@ietfa.amsl.com
Delivered-To: tls@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 06B1E130F9A for <tls@ietfa.amsl.com>; Wed, 13 Jun 2018 14:22:22 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -9.951
X-Spam-Level:
X-Spam-Status: No, score=-9.951 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_PASS=-0.001, USER_IN_DEF_SPF_WL=-7.5] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=chromium.org
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hXlUcZG014OF for <tls@ietfa.amsl.com>; Wed, 13 Jun 2018 14:22:19 -0700 (PDT)
Received: from mail-qk0-x229.google.com (mail-qk0-x229.google.com [IPv6:2607:f8b0:400d:c09::229]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 0F7C8130F83 for <tls@ietf.org>; Wed, 13 Jun 2018 14:22:19 -0700 (PDT)
Received: by mail-qk0-x229.google.com with SMTP id k86-v6so2421738qkh.13 for <tls@ietf.org>; Wed, 13 Jun 2018 14:22:19 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=pOBlHPd9+SzUtWVd+BKcIWfOd5G+JOjAUqEwWIqNXF4=; b=D9/5sQWEGFybfybxtIXAAzVXkIdH/cmbGgz1qwF5JjUs4F7FB7ybgga9lxH4VFbfpo Zqwa29FMSFl/iQeiM3zFHW1YBYIx9JnATR/GLh76isuu5LchKgjYDEnE0ghMszhQG87W grKd/49wrNAt3UGDpG3q/X4uz5e6ZlA5GU9+s=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=pOBlHPd9+SzUtWVd+BKcIWfOd5G+JOjAUqEwWIqNXF4=; b=EckCDDEZx7m+suELHTfg0CXD9VIB2SgueRI7Im+4Y+OmehVCKDq7d3hzhNsBD1tmip YxZ+amSk2wTePR7wpNU4A/GiuwQJqWr/XZ9z0iSHMjDFZbBODfCWghCWxSNeUxH3/Nf0 VPhVAEWz+yLeHP515kpYUzlawgz8fXx1RlM8Ro5+uhoKCqVci48uybxcC/fbkj5qMDtV zHGFeK/o1Wb8RaoJQb5e9XQBXVEmK91+izemEIN94P+3s6m3EoMgLr2cH1wSUt1a4Z8f Y9aRG3SXqbxWSvaF8JCCPR7mOLjtn4SYrBqGjpGRdYgie39Ecra4njJp7FMQvCE0uH41 r48A==
X-Gm-Message-State: APt69E270R9h1pwgzmdewqHoee74DkRX0t2wJIEHM0MeXBUkNxCULmIJ UIuDywGBlcJ5nnSoUiDmp9Fu7fqOCT0tCt7fFC0Bm8g=
X-Google-Smtp-Source: ADUXVKKJJfmWF7Tugi+b6oezotX2LEIsrx1Z3bTo2gVmI9Qr4QanmOIc8PpLoJZU8r8uRVot2dhE40hezhAap3tIq1I=
X-Received: by 2002:a37:a608:: with SMTP id p8-v6mr5789386qke.82.1528924937936; Wed, 13 Jun 2018 14:22:17 -0700 (PDT)
MIME-Version: 1.0
References: <CAF8qwaBfG2aQTMCTQ9=8Uj1yRB7PRAaZNeNQnTPtvboxfAh6HQ@mail.gmail.com> <20180613180603.GA27662@mandy> <CAO8oSXnT-5_oudcU-Msf+ZrPbJ6bCZtGBXhe+HkVue+4bL_Ksg@mail.gmail.com>
In-Reply-To: <CAO8oSXnT-5_oudcU-Msf+ZrPbJ6bCZtGBXhe+HkVue+4bL_Ksg@mail.gmail.com>
From: David Benjamin <davidben@chromium.org>
Date: Wed, 13 Jun 2018 17:22:05 -0400
Message-ID: <CAF8qwaDBbwvMTN=h_1Xoq7LZQ3A=T+Ygkgjq2qXDa26WULiEGA@mail.gmail.com>
To: Christopher Wood <christopherwood07@gmail.com>
Cc: alessandro@ghedini.me, "<tls@ietf.org>" <tls@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000d0df57056e8c937c"
Archived-At: <https://mailarchive.ietf.org/arch/msg/tls/eOKDnj3E1ykCzu9P9Hidy3y13mU>
Subject: Re: [TLS] Enforcing Protocol Invariants
X-BeenThere: tls@ietf.org
X-Mailman-Version: 2.1.26
Precedence: list
List-Id: "This is the mailing list for the Transport Layer Security working group of the IETF." <tls.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/tls>, <mailto:tls-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/tls/>
List-Post: <mailto:tls@ietf.org>
List-Help: <mailto:tls-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/tls>, <mailto:tls-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 13 Jun 2018 21:22:23 -0000

On Wed, Jun 13, 2018 at 5:04 PM Christopher Wood <
christopherwood07@gmail.com> wrote:

> On Wed, Jun 13, 2018 at 11:06 AM Alessandro Ghedini
> <alessandro@ghedini.me> wrote:
> >
> > On Tue, Jun 12, 2018 at 12:27:39PM -0400, David Benjamin wrote:
> > > Hi all,
> > >
> > > Now that TLS 1.3 is about done, perhaps it is time to reflect on the
> > > ossification problems.
> > >
> > > TLS is an extensible protocol. TLS 1.3 is backwards-compatible and may
> be
> > > incrementally rolled out in an existing compliant TLS 1.2 deployment.
> Yet
> > > we had problems. Widespread non-compliant servers broke on the TLS 1.3
> > > ClientHello, so versioning moved to supported_versions. Widespread
> > > non-compliant middleboxes attempted to parse someone else’s
> ServerHellos,
> > > so the protocol was further hacked to weave through their many defects.
> > >
> > > I think I can speak for the working group that we do not want to repeat
> > > this adventure again. In general, I think the response to ossification
> is
> > > two-fold:
> > >
> > > 1. It’s already happened, so how do we progress today?
> > > 2. How do we avoid more of this tomorrow?
> > >
> > > The workarounds only answer the first question. For the second, TLS
> 1.3 has
> > > a section which spells out a few protocol invariants
> > > <
> https://tlswg.github.io/tls13-spec/draft-ietf-tls-tls13.html#rfc.section.9..3
> >.
> > > It is all corollaries of existing TLS specification text, but hopefully
> > > documenting it explicitly will help. But experience has shown
> specification
> > > text is only necessary, not sufficient.
> > >
> > > For extensibility problems in servers, we have GREASE
> > > <https://tools.ietf.org/html/draft-ietf-tls-grease-01>. This enforces
> the
> > > key rule in ClientHello processing: ignore unrecognized parameters.
> GREASE
> > > enforces this by filling the ecosystem with them. TLS 1.3’s middlebox
> woes
> > > were different. The key rule is: if you did not produce a ClientHello,
> you
> > > cannot assume that you can parse the response. Analogously, we should
> fill
> > > the ecosystem with such responses. We have an idea, but it is more
> involved
> > > than GREASE, so we are very interested in the TLS community’s feedback.
> > >
> > > In short, we plan to regularly mint new TLS versions (and likely other
> > > sensitive parameters such as extensions), roughly every six weeks
> matching
> > > Chrome’s release cycle. Chrome, Google servers, and any other
> deployment
> > > that wishes to participate, would support two (or more) versions of TLS
> > > 1.3: the standard stable 0x0304, and a rolling alternate version.
> Every six
> > > weeks, we would randomly pick a new code point. These versions will
> > > otherwise be identical to TLS 1.3, save maybe minor details to separate
> > > keys and exercise allowed syntax changes. The goal is to pave the way
> for
> > > future versions of TLS by simulating them (“draft negative one”).
> > >
> > > Of course, this scheme has some risk. It grabs code points everywhere.
> Code
> > > points are plentiful, but we do sometimes have collisions (e.g. 26 and
> 40).
> > > The entire point is to serve and maintain TLS’s extensibility, so we
> > > certainly do not wish to hamper it! Thus we have some safeguards in
> mind:
> > >
> > > * We will document every code point we use and what it refers to. (If
> the
> > > volume is fine, we can email them to the list each time.) New
> allocations
> > > can always avoid the lost numbers. At a rate of one every 6 weeks, it
> will
> > > take over 7,000 years to exhaust everything.
> > >
> > > * We will avoid picking numbers that the IETF is likely to allocate, to
> > > reduce the chance of collision. Rolling versions will not start with
> 0x03,
> > > rolling cipher suites or extensions will not be contiguous with
> existing
> > > blocks, etc.
> > >
> > > * BoringSSL will not enable this by default. We will only enable it
> where
> > > we can shut it back off. On our servers, we of course regularly deploy
> > > changes. Chrome is also regularly updated and, moreover, we will gate
> it on
> > > our server-controlled field trials
> > > <https://textslashplain.com/2017/10/18/chrome-field-trials/>
> mechanism. We
> > > hope that, in practice, only the last several code points will be in
> use at
> > > a time.
> > >
> > > * Our clients would only support the most recent set of rolling
> parameters,
> > > and our servers the last handful. As each value will be short-lived,
> the
> > > ecosystem is unlikely to rely on them as de facto standards.
> Conversely,
> > > like other extensions, implementations without them will still
> interoperate
> > > fine. We would never offer a rolling parameter without the
> corresponding
> > > stable one.
> > >
> > > * If this ultimately does not work, we can stop at any time and only
> have
> > > wasted a small portion of code points.
> > >
> > > * Finally, if the working group is open to it, these values could be
> > > summarized in regular documents to reserve them, so that they are
> > > ultimately reflected in the registries. A new document every six weeks
> is
> > > probably impractical, but we can batch them up.
> > >
> > > We are interested in the community’s feedback on this proposal—anyone
> who
> > > might participate, better safeguards, or thoughts on the mechanism as a
> > > whole. We hope it will help the working group evolve its protocols more
> > > smoothly in the future.
> >
> > This looks interesting and I very much agree that we should do
> *somthing* to
> > try to avoid the pain we've seen with deploying TLS 1.3 for future
> versions.
> >
> > We (Cloudflare) would be happy to help with developing and deploying it,
> and
> > see how the experiment goes (and maybe even help put a draft together if
> needed,
> > if that is the form this proposal will take).
>
> +1
>
> We (Apple) are interested in experimenting with this as well. Would it
> be possible for
> participating servers to support multiple random versions
> simultaneously? That would
> help address potentially longer release cycles.


That's great to hear (both of you)!

Supporting multiple values should be easy. Any participating stack already
must support two variants of TLS 1.3, the standard one and this rolling
version. Going from two to several is an easy step, on client or server.
(For us, this machinery is all a remnant of the middlebox experiments we
ran.) We were expecting our servers to support a handful of values anyway
to account for our own release cycles. We can experiment with the exact
cadence and code point lifetimes based on who all wishes to do this and
what works.

(At the worst case, mismatch is fine as both sides will just negotiate the
standard TLS 1.3. But an individual connection only exercises the
ServerHello when both sides match, so we'll want to maximize matches.)

David