[Curdle] AD Review of draft-ietf-curdle-gss-keyex-sha2-05

Eric Rescorla <ekr@rtfm.com> Fri, 06 April 2018 23:25 UTC

Return-Path: <ekr@rtfm.com>
X-Original-To: curdle@ietfa.amsl.com
Delivered-To: curdle@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 34AAC126CD6 for <curdle@ietfa.amsl.com>; Fri, 6 Apr 2018 16:25:11 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.899
X-Spam-Level:
X-Spam-Status: No, score=-1.899 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=rtfm-com.20150623.gappssmtp.com
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 WzbVrHpYXze9 for <curdle@ietfa.amsl.com>; Fri, 6 Apr 2018 16:25:09 -0700 (PDT)
Received: from mail-ot0-x22b.google.com (mail-ot0-x22b.google.com [IPv6:2607:f8b0:4003:c0f::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 CFB94126BF0 for <curdle@ietf.org>; Fri, 6 Apr 2018 16:25:08 -0700 (PDT)
Received: by mail-ot0-x22b.google.com with SMTP id v64-v6so2910703otb.13 for <curdle@ietf.org>; Fri, 06 Apr 2018 16:25:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rtfm-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:date:message-id:subject:to; bh=84cHU/icdHTmk11c0twi00FFTnGYEKlqjb3APmChYwk=; b=LQ+kY/nad8FrHKXMrmOVg7npp4qrbpeo11PenGint16hKGe/Q/sMqgaTHmDV3rlIEv Ei1Fi9mhhBCwyLy1gx/eKnKvklme7v6pEnVY66l033Ck/8WAkob1fhp6HDjPd4l4bpsn ehHatkTrS8Td/3txPmFSStuftSdOcZ+jCUSdLE5WJILIWPFUJ2Gka+LYc5NoN95udOXV xhYc4sp2ojsgQgwB0aGq3rFON1y5WBeN0BlpScOG/86zfYEQC5eRvE6CEkgVaq11+oSL PezF19UorrCxxE9lAKrQperrrQgFFXutfFe2qVpnZMbVXRDbRSyROCR1A6nS0kzGfjm9 CzbA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=84cHU/icdHTmk11c0twi00FFTnGYEKlqjb3APmChYwk=; b=pjv/QShuOiKfxLrkeARtUeT+v43j27A7pvhGIEpOhXEba4ciQtmjXaDNdLzk7iIeSk KLxG1rZ91VNhlxufpIf5u81uaPajVdJutoW3FEcUKwRm2sug7NuDYYXxDvewBabnrM2p dahgVEBtVT5ilnm9PNL2boAnTmpfOXm3g+CdAuvFq2sLYu2RNdxXqW5umy7mM9mhFPaX xVxr3aSDsWUOtId0ir5EH/PD/jZQAGN8AxtJgleaD4rgiJDTtrV+5T5nUmrZLW2xZw6Y /MLZR0iFRHh0v4j9oFRC8SGpUxWOUfwCW1mxqtUWOTo5AeqGToJC9XFFXEcwfA6czqja Q0lg==
X-Gm-Message-State: ALQs6tCflPA6DdnTXX09ND607sST/TjrcafwujqkNJlCf2xe/HXWrr5x msxR9dsmHJEU/osclS54D+5RnHbR3ScfUFS80ZUdEHUO3wE=
X-Google-Smtp-Source: AIpwx49/KImJ+Aiy11K/3XO9V4qZJyT37YmLQfOqHl+oGX1nUCua7eqJ9SstHeLNtTC6a0pPxxo/SPfOW2pfGp+Ste4=
X-Received: by 2002:a9d:4c16:: with SMTP id l22-v6mr3812793otf.176.1523057108068; Fri, 06 Apr 2018 16:25:08 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.138.18.130 with HTTP; Fri, 6 Apr 2018 16:24:27 -0700 (PDT)
From: Eric Rescorla <ekr@rtfm.com>
Date: Fri, 6 Apr 2018 16:24:27 -0700
Message-ID: <CABcZeBNCUSpGihHz6bPBSALS4-34Tm7W36BCZ_Ev8OQz3KtVag@mail.gmail.com>
To: draft-ietf-curdle-gss-keyex-sha2@tools.ietf.org, curdle <curdle@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000e642f20569365d19"
Archived-At: <https://mailarchive.ietf.org/arch/msg/curdle/dayCjb1EA0u1xAu6SaGgYMm8xB0>
Subject: [Curdle] AD Review of draft-ietf-curdle-gss-keyex-sha2-05
X-BeenThere: curdle@ietf.org
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: "List for discussion of potential new security area wg." <curdle.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/curdle>, <mailto:curdle-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/curdle/>
List-Post: <mailto:curdle@ietf.org>
List-Help: <mailto:curdle-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/curdle>, <mailto:curdle-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 06 Apr 2018 23:25:11 -0000

Rich version of this review at:
https://mozphab-ietf.devsvcdev.mozaws.net/D4544

This document has a huge amount of duplicated material which makes it
very hard to read. Please refactor so that the common material is in
one place.




COMMENTS
>      Due to security concerns with SHA-1 [RFC6194] and with MODP groups
>      with less than 2048 bits [NIST-SP-800-131Ar1]  we propose the use of
>      the SHA-2 based hashes with DH group14, group15, group16, group17 and
>      group18 [RFC3526].  Additionally we add support for key exchange
>      based on Elliptic Curve Diffie Hellman with NIST P-256, P-384 and
>      P-521 as well as X25519 and X448 curves.  Following the rationale of

"the X25519..."


>          +--------------------------+--------------------------------+
>          | Key Exchange Method Name | Implementation Recommendations |
>          +--------------------------+--------------------------------+
>          | gss-group14-sha256-*     | SHOULD/RECOMMENDED             |
>          | gss-group15-sha512-*     | MAY/OPTIONAL                   |
>          | gss-group16-sha512-*     | SHOULD/RECOMMENDED             |

Why are you only specifying SHA-512 with 4096-bit groups. SHA-256 is
still reasonable at that size?


>
>      Each of these methods specifies GSS-API-authenticated Diffie-Hellman
>      key exchange as described in Section 2.1 of [RFC4462]  with SHA-256
>      as HASH, and the group defined in Section 8.2 of [RFC4253] The method
>      name for each method is the concatenation of the string "gss-
>      group14-sha256-" with the Base64 encoding of the MD5 hash [RFC1321]

Why is this MD5? Is there some legacy reason for this? It's not
necessarily bad but it's odd to modern eyes.


>      Each of these methods specifies GSS-API-authenticated Diffie-Hellman
>      key exchange as described in Section 2.1 of [RFC4462]  with SHA-512
>      as HASH, and the group defined in Section 7 of [RFC3526] The method
>      name for each method is the concatenation of the string "gss-
>      group18-sha512-" with the Base64 encoding of the MD5 hash of the
>      ASN.1 DER encoding of the underlying GSS-API mechanism's OID.

These all seem to be boilerplate. is there a way to refactor into a
single paragraph with a table that describes the substitutions?


>      ASN.1 DER encoding of the underlying GSS-API mechanism's OID.
>
>   5.  New Elliptic Curve Diffie-Hellman Key Exchange methods
>
>      In [RFC5656] new SSH key exchange algorithms based on Elliptic Curve
>      Cryptography are introduced.  We reuse much of section 4 to implement

s/implement/define/


>      This section defers to [RFC7546] as the source of information on GSS-
>      API context establishment operations, Section 3 being the most
>      relevant.  All Security Considerations described in [RFC7546] apply
>      here too.
>
>      The Client:

This section should be refactored to put all the EC mechanics (which
are symmetrical) in one place.


>            and then y coordinate.  The coordinate coversion MUST preserve
>            leading zero octets.  Thus for nistp521 curve the encoded x
>            coordinate will always have a length of 66 octets while the Q_C
>            representation will be 133 octets long.  This is the
>            uncompressed representation specified in Section 4.3.6 of
>            [ANSI-X9-62-2005].

I have two questions about this:  1. Why are you specifying the
detailed computation of the public key? This seems like you could
defer it to another spec. 2. Why are you specifying uncompressed
representations for NIST curves? We did this in TLS because people
already supported them, but in general they are worse. Is there a
reason here?


>            by 31 zero octets for curve255519 and as an octect of value
>            0x05 followed by 55 zero octets.
>
>            Calculating Q_C as the result of the call to X25519 or X448
>            function, respectively for curve25519 and curve448 key
>            exchange, with parameters d_C and g.

This material all seems to be in RFC 7748 S 6.1 and 6.2.


>
>         For NIST curves, the server verifies that the q_C is not a point
>         at infinity, that both coordinates are in the interval [0, p - 1],
>         where p is the prime associated with the curve of the selected key
>         exchange and that the point lies on the curve (satisfies the curve
>         equation).

You should probably cite to the X9.62 or SP-800 for this procedure.


>         For curve25519, the server verifies that the the high-order bit of
>         the last octet is not set - this prevents distinguishing attacks
>         between implementations that use Montgomery ladder implementation
>         of the curve and ones that use generic elliptic-curve libraries.
>         If the bit is set, the key exchange SHOULD fail.  For curve448 any
>         bit can be set.

I'm not following what this is supposed to do. If you are worried
about this, why don't you just mask off the top bit.


>            For NIST curves, the peers perform point multiplication using
>            d_U and q_V to get point P.
>
>            For NIST curves, peers verify that P is not a point at
>            infinity.  If P is a point at infinity, the key exchange MUST
>            fail.

Why is this text here? It describes the client's behavior.


>            and q_V.  The result of the function is the shared secret.
>
>            For curve25519 and curve448, if all the octets of the shared
>            secret are zero octets, the key exchange MUST fail.
>
>         H = hash(V_C || V_S || I_C || I_S || K_S || Q_C || Q_S || K).

This kind of just comes out of nowhere. You probably want some
prefatory text.


>
>      7.  C verifies that the key Q_S is valid the same way it is done in
>      step 3.  If the key is not valid the key exchange MUST fail.
>
>      8.  C computes the shared secret K and H and verifies that it is
>      valid the same way it is done in step 5.  It then calls

This check only applies to CFRG curves.


>          string    server public host key and certificates (K_S)
>
>      Since this key exchange method does not require the host key to be
>      used for any encryption operations, this message is OPTIONAL.  If the
>      "null" host key algorithm described in Section 5 of [RFC4462] is
>      used, this message MUST NOT be sent.

I am assuming in this situation there is some other form of
authentication?


>          string    I_C, payload of the client's SSH_MSG_KEXINIT
>          string    I_S, payload of the server's SSH_MSG_KEXINIT
>          string    K_S, server's public host key
>          string    Q_C, client's ephemeral public key octet string
>          string    Q_S, server's ephemeral public key octet string
>          mpint     K,   shared secret

The actual equation is way up above this in the document, which is
presumably not great.


>      Each key exchange method is implicitly registered by this document.
>      The IESG is considered to be the owner of all these key exchange
>      methods; this does NOT imply that the IESG is considered to be the
>      owner of the underlying GSS-API mechanism.
>
>   5.2.1.  gss-nistp256-sha256-*

Again, can you refactor this section so it's not so duplicative.


>      the target the user intended.  Some mechanisms implementations (like
>      commonly used krb5 libraries) may use insecure DNS resolution to
>      canonicalize the target name; in these cases spoofing a DNS response
>      that points to an attacker-controlled machine may results in the user
>      silently delegating credentials to the attacker, who can then
>      impersonate the user at will.

Is this something new in this document?