Re: [TLS] Server-side missing_extension MUSTs

David Benjamin <davidben@chromium.org> Wed, 13 July 2016 15:58 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 69EE012D162 for <tls@ietfa.amsl.com>; Wed, 13 Jul 2016 08:58:38 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -3.986
X-Spam-Level:
X-Spam-Status: No, score=-3.986 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.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RP_MATCHES_RCVD=-1.287, SPF_PASS=-0.001] 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 IvVPsI6g2Um7 for <tls@ietfa.amsl.com>; Wed, 13 Jul 2016 08:58:36 -0700 (PDT)
Received: from mail-io0-x22b.google.com (mail-io0-x22b.google.com [IPv6:2607:f8b0:4001:c06::22b]) (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 B665F12D14D for <tls@ietf.org>; Wed, 13 Jul 2016 08:58:34 -0700 (PDT)
Received: by mail-io0-x22b.google.com with SMTP id b62so50276606iod.3 for <tls@ietf.org>; Wed, 13 Jul 2016 08:58:34 -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=JASZrPjobG9wqR6xuwtj9UGHLPC9i4EYPeg0fXlq8As=; b=lFlxaQbiotBIpisSANij7+uxveuScaXZ75dGkDEGoDJKounJnT5k4hc169Djv40j42 3p07DTGYBPDJaWqFswKDJVJyX3gAbS/GH2liVgMo+O7TQ+990X9T9aHFq8gM+xaqsuyy A+4r/NcN9jd3RYb8/QKXN867ymvCtHeAZhW1g=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=JASZrPjobG9wqR6xuwtj9UGHLPC9i4EYPeg0fXlq8As=; b=Is2wmZfSuvZiKjNFhQ75YkBm039r+C5w1sAwX1FZ9sfY59anQwJi5IjXs8qlryt1HM n86/U/crmtqcCukEdKb5STuUnmcy6pnicyDiyhxM8bATDAl64DdEBOEyqL5WqDOSZ2sx N+eMkeC4hgwzt2JQS+Zk9VejAmGUPxcjGyC4YboY0h+D/heC0F/7HdmZgfEWnTDB/YDg ThPBVOzbpTm01hyE8gAvbPLjgeCqOUBwnszs7kK5EaeF721rZfa1OeRZRJYhuoYRM5Iz ilZfTeKdTeoavxyt2jhaQIFtBULxqY8dlI3xeSp6HC+MyWCgooI2u+5be7YsYQ9pNX0E AMUQ==
X-Gm-Message-State: ALyK8tJST4tmc142nKLkXb2NYfuwje6MeAxYooaAlnaEObpXvtleWe/XGLELiQHjaEHjxTPlsU9kVhi9us1ey1Lg
X-Received: by 10.107.52.133 with SMTP id b127mr10092678ioa.6.1468425513859; Wed, 13 Jul 2016 08:58:33 -0700 (PDT)
MIME-Version: 1.0
References: <CAF8qwaAAw6zA9jRPMQ5MXqHptBtsarhNPcH6KJzzSE-h1XiFDg@mail.gmail.com> <CAF8qwaBoi-P+NQghrWp+qdx9Q4wKcr+K21jz--xX9yvWmCtJew@mail.gmail.com> <CAF8qwaDP+_R0LF38UX8X=DSVxtDz4hCJPJxyGB2T=YGcMGHSkw@mail.gmail.com> <3111426.zLZNlvgK9Q@pintsize.usersys.redhat.com>
In-Reply-To: <3111426.zLZNlvgK9Q@pintsize.usersys.redhat.com>
From: David Benjamin <davidben@chromium.org>
Date: Wed, 13 Jul 2016 15:58:24 +0000
Message-ID: <CAF8qwaBiToiAdH+e-ei2LZiSa6UY4OZ+th_iMS3-SuKfKSB-5w@mail.gmail.com>
To: Hubert Kario <hkario@redhat.com>
Content-Type: multipart/alternative; boundary="001a11440f1c2279220537867596"
Archived-At: <https://mailarchive.ietf.org/arch/msg/tls/1GnEG3dvwZFS3-ylZqVLqe_bGl0>
Cc: tls@ietf.org
Subject: Re: [TLS] Server-side missing_extension MUSTs
X-BeenThere: tls@ietf.org
X-Mailman-Version: 2.1.17
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 Jul 2016 15:58:38 -0000

On Wed, Jul 13, 2016 at 11:06 AM Hubert Kario <hkario@redhat.com> wrote:

> On Wednesday 13 July 2016 14:43:58 David Benjamin wrote:
> > To be clear, I am not at all opposed to useful errors or strict policing
> of
> > what the peer sends. That's all great. Indeed the linked test below makes
> > use of more specific error codes than TLS provides. But I would like such
> > things to:
> >
> > 1. Be useful, either for debugging or because it rejects an invalid
> > handshake that would otherwise go unnoticed.
> > 2. Come out naturally out of what the implementation would do anyway, to
> > keep complexity down.
> >
> > I'm also quite okay with budging on #2 where #1 is strong. Complexity is
> > the currency we pay for adding things. But I do not think this particular
> > error code passes #1 (the special-case is not useful and such a peer
> would
> > not be able to handshake against correct implementations anyway), so I'm
> > not willing to sacrifice #2 for it.
>
> Then I fail to see how missing_extension does not flow out of correct
> implementation (and from general RFC recommendations).
>
> You need to parse the Client Hello, and then sanity check it (length of
> session ID, validity of ciphers, lack of duplicate extensions, etc.).
> Making sure that mandatory extensions are in place in the same code
> seems to me like a obvious place to do it.
>

The extension is not mandatory. Whether it is mandatory or not depends on
the cipher suite selected. The cipher suite selected depends on the
contents (or lack of) the extension. This makes checking things somewhat
circular.

If it were simply mandatory, by all means, mandate a missing_extension
alert. I still do not think it'd be very useful (I'm more interested in
non-syntax-error cases), but I have no objections.


> In other words, you shouldn't delay checking if a particular extension
> is present until the time you want to use it. If there is any chance
> (or possible configuration) in which you would end up using it, you
> should complain that the extension is missing or it is malformed.
>
> This way when you start to depend on it, things won't start breaking
> suddenly and you end up writing Yet Another Workaround for Broken
> Implementations™
>

I still do not see how returning handshake_failure (or whatever the "no
common cipher" error is) for this case instead of missing_extension will
cause broken implementations to come up.

David


> > On Wed, Jul 13, 2016 at 10:02 AM David Benjamin <davidben@chromium.org>
> > wrote:
> >
> > > On Wed, Jul 13, 2016 at 3:31 AM Dave Garrett <davemgarrett@gmail.com>
> > > wrote:
> > >
> > >> To be clear though, completely mandatory extensions, at least as we're
> > >> doing them here, are a new thing. TLS 1.2 relied on separate messages
> for
> > >> stuff, but we're front-loading everything into the ClientHello to get
> > >> reliable 1RTT (with the exception of HRR).
> > >
> > >
> > > On Wed, Jul 13, 2016 at 8:12 AM Hubert Kario <hkario@redhat.com>
> wrote:
> > >
> > >> On Wednesday 13 July 2016 05:23:53 David Benjamin wrote:
> > >> > I don't believe an implementation which fails to send
> supported_groups,
> > >> > etc., in 1.3 would ever leave a developer's workstation. It would
> not
> > >> > interoperate with anything.
> > >>
> > >> it would interoperate with itself, and for some deployments that's
> enough
> > >> of a passing grade... (Even if you do interoperatbility testing you
> > >> do not check all possible permutations of features and settings)
> > >>
> > >> I wholeheartedly agree with Dave here, error definitions should be
> strict
> > >> (both on the when and what to do). One, because it allows to better
> > >> diagnose (in general, maybe not in this specific situation) problems.
> > >> Two, because you can write a strict negative test case that actually
> > >> checks for it.
> > >
> > >
> > >
> > >
> https://boringssl.googlesource.com/boringssl/+/1c256544dda26e4042c1af082580a1b87c9a690f/ssl/test/runner/runner.go#5646
> > > Also something I have plenty of experience with. We're obsessive about
> > > adding this kind of test in BoringSSL[0]. :-)
> > >
> > > One doesn't need this alert to write a test for curve negotiation. Just
> > > test that the handshake hits the usual codepath for there not being a
> > > common cipher.
> > >
> > > This semi-mandatory extension isn't new in TLS 1.3, depending on your
> 1.2
> > > behavior. BoringSSL will already refuse to select an ECDHE cipher if
> > > supported_curves is missing. 1.2 does not require this, but we opted
> to do
> > > it for simplicity[1].
> > >
> > > David
> > >
> > > [0] If anyone wants to try, I'm sure there is an
> implementation-agnostic
> > > TLS protocol test suite one could extract out of that. It would take
> some
> > > wrangling as we cheat and condition on BoringSSL error codes, but the
> nice
> > > thing is I've already built up a large battery of tests here.
> > >
> > > [1] Previously we always picking our most preferred curve if the
> extension
> > > was missing, like OpenSSL. But now our most preferred curve is X25519,
> not
> > > P-256. It did not seem worth kludging that when we could just decline
> the
> > > cipher. No one's noticed, so I would say that worked.
> > >
>
> --
> Regards,
> Hubert Kario
> Senior Quality Engineer, QE BaseOS Security team
> Web: www.cz.redhat.com
> Red Hat Czech s.r.o., Purkyňova 99/71, 612 45, Brno, Czech Republic