Subject: Protocol Action: 'Extension Negotiation in Secure Shell (SSH)' to Proposed Standard (draft-ietf-curdle-ssh-ext-info-15.txt)

From: The IESG <[email-masked]>
Date: Sun, 12 Nov 2017 17:50:33 -0800

The IESG has approved the following document:
- 'Extension Negotiation in Secure Shell (SSH)'
  (draft-ietf-curdle-ssh-ext-info-15.txt) as Proposed Standard

This document is the product of the CURves, Deprecating and a Little more
Encryption Working Group.

The IESG contact persons are Kathleen Moriarty and Eric Rescorla.

A URL of this Internet Draft is:
https://datatracker.ietf.org/doc/draft-ietf-curdle-ssh-ext-info/

Technical Summary

This memo updates RFC 4252, RFC 4253, and RFC 4254 to define a
mechanism for SSH clients and servers to exchange information about
supported protocol extensions confidentially after SSH key exchange.

Working Group Summary

 The only discussion of this draft concerned some incompatibilities with the current implementations of OpenSSH 7.3/7.4 and  the "server-sig-algs" extension described in the document. The issue is that 7.3 and 7.4 does not provide the full list of supported algorithms, so client that assume the full list is provided in order to narrow down the identities/keys (adaptive public key algorithm selection) to use for the authentication may not be able to find the appropriated identity. The consensus was that work around should be found when adaptive public key algorithm selection is needed and when interacting with these two implementations.  Romen announced "21 May 2017 : Version x509-10.2" [1] that PKIX-SSH implemented such work around. He is the only one that raised this issue.   

Further explanation can be found in "work with broken "server-sig-algs" extension" [1] as well as Denis email [2]. I am copying the text from [2], as I believe it provides a complete description of the issue:

*Server-side situation:*

OpenSSH versions before 7.5 (such as 7.3) send the "server-sig-algs"
extension, but they only use it to indicate support for "rsa-sha2-512" and
"rsa-sha2-256". They do not include other public key algorithms that the
server supports, even though the server will accept those algorithms if
they are attempted.

It is intended that the server should send a complete set of accepted
public key algorithms. My understanding is that OpenSSH versions 7.5 and
later do this. Bitvise SSH Server has always sent a complete list.

*Client-side situation:*

There exist clients which have problems with OpenSSH 7.3 behavior, and
clients that don't.

*Clients with explicit public key configuration.* Bitvise SSH Client does
not have a problem with this behavior, because it does not use public keys
opportunistically. Our SSH Client will use a public key to authenticate
only if the key is explicitly configured by the user. It will use only the
requested key, and not other keys that it may find in various places of
storage.

As a result, our SSH Client has no use for a hint from the server about
which key types are OK to use. It already knows the key it's going to use.
The question is what signature algorithm (now renamed "public key
algorithm") to use with that key. For this purpose, the information sent by
OpenSSH is sufficient, regardless of version. For RSA keys, the
"server-sig-algs" extension provides the info. For non-RSA keys, there's
only one algorithm possible anyway, so we use it.

*Clients with opportunistic key search.* Other SSH clients, including
OpenSSH and PKIXSSH (Roumen's work) do not require a public key to be
explicitly configured in order to be used. Such clients perform an
opportunistic search, and try to use any and all keys that might work that
can be found in various places of storage. This includes the user's .ssh
directory, keys available via the SSH agent protocol, and keys specified on
the command line.

These types of clients have a problem, because:

- In OpenSSH versions 7.5 and higher, the client can use the list of
algorithms sent in the server's "server-sig-algs" extension to narrow down
the public keys it's going to try. If the server doesn't list ECDSA or DSA,
for example, the client can take that as authoritative, and can exclude
those keys from authentication. This is nice because it may involve trying
fewer keys.

- In OpenSSH version 7.3, the server will only send "rsa-sha2-256" and
"rsa-sha2-512", even if the server also accepts ECDSA and other algorithms.
This means the client needs to have explicit treatment to detect the
OpenSSH protocol version. If the OpenSSH version is older than 7.5,
"server-sig-algs" can still be used to enable the use of "rsa-sha2-XXXX"
instead of "ssh-rsa", but it cannot be used to exclude non-RSA keys in
authentication.

*Options:*

*(A) Rename extension.* Roumen has requested that we rename the
"server-sig-algs" extension and make it clear that the server must send all
algorithms it will accept.

I think this is not the best thing to do for the following reasons:

- There are multiple implementations of this extension which are not
impacted by the OpenSSH 7.3 issue. These implementations would suffer from
the rename.

- Implementations that are impacted by the OpenSSH 7.3 issue may still have
a requirement to interoperate with OpenSSH 7.5, as well as other servers
that currently send "server-sig-algs" with a complete list of algorithms.
For such implementations, renaming the extension is again not a fix, but a
further complication.

*(B) Workaround by clients that need it.* My suggestion is that clients
that use opportunistic key search, and wish to interoperate with OpenSSH
7.3, should implement a compatibility workaround for the way
"server-sig-algs" is sent by that version.

I think this is the better solution for the following reasons:

- There are multiple implementations which are already not affected by the
issue, whether communicating with OpenSSH or between themselves. In this
case, those implementations do not need to change anything.

- The work required for clients with opportunistic key search is similar to
the work required in above option A), *assuming *those clients want to
interoperate with OpenSSH 7.5+ and other existing servers that send
"server-sig-algs" with a complete list of algorithms.

On May 21 Romen has implemented the work around [1]:

work with broken "server-sig-algs" extension Server extension "server-sig-algs" was not implemented properly in OpenSSH 7.3 and 7.4. New version detect broken servers and replaces incorrect algorithm announcement with correct list.
For instance OpenSSH 7.3 list only algorithms rsa-sha2-256 and rsa-sha2-512. As result PKIX-SSH functionality for "adaptive public key algorithm selection" in connection to OpenSSH 7.3 skips all other identities except those with RSA key. 

Document Quality

>From the non up-to-date SSH implementation comparison [1], as well from the author/implementer of the draft that the following SSH implementations implement the draft: 
- Bitvise SSH Server and Client
- OpenSSH
- AsyncSSH
- SmartFTP

In addition, Romen the implementer of PKIX-SSH provided significant 
clarification of the document and the release note
 of "21 May 2017 : Version x509-10.2" suggests PKIX-SSH supports the 
current draft.  This may be updated regarding the necessity of "adaptive public key 
algorithm selection"

[1] http://ssh-comparison.quendi.de/comparison/hostkey.html
[2] http://roumenpetrov.info/secsh/index.html

Personnel

 Daniel Migault is the Document Shepherd and Eric Rescorla is the Responsible Area.