IETF-SSH archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
rsa-sha2-256/512: handling of incorrect signature encoding
Hey everyone,
last month, we released versions 7.xx of Bitvise SSH Server and Client,
which implement the new rsa-sha2-256 and rsa-sha2-512 signatures.
We thought we worked out any compatibility issues prior to release – the
algorithms interoperate with the OpenSSH 7.2p2 versions we’ve tried.
However, we’ve now learned of a user who is connecting from Arch Linux using
OpenSSH 7.2 (without p2), and it appears that this version encodes tha
rsa-sha2-512 signature (and probably also -256) in a different way than our
implementation expects.
The problem is related to the multiple instances of algorithm names encoded
in a “publickey” authentication request. First, the algorithm is encoded in
the immediate request itself:
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication
string signature
In this case:
- "public key algorithm name" should be either "rsa-sha2-256" or
"rsa-sha2-512"
- "public key to be used for authentication" should be an "ssh-rsa" public
key, like this:
string "ssh-rsa"
mpint e
mpint n
- "signature" should be an "rsa-sha2-256" or "rsa-sha2-512" signature, like
this:
string "rsa-sha2-256" / "rsa-sha2-512"
string rsa_signature_blob
To summarize, there are three algorithm names being encoded, and they are in
sequence:
(1) "rsa-sha2-256" or "-512" or "ssh-rsa"
(2) "ssh-rsa"
(3) "rsa-sha2-256" or "-512" or "ssh-rsa"
The invariants our implementation currently expects are:
- name 1, in the USERAUTH request, can be any of the RSA signature algorithm
names
- name 2, in the public key blob, must be "ssh-rsa"
- name 3, in the signature blob, must match name 1
However, what actually happens in OpenSSH 7.2 (not p2) is that name 1 is
"rsa-sha2-512", but name 3 is "ssh-rsa". This causes a mismatch and an
authentication failure with our implementation, because name 1 does not
match name 3.
My questions are:
(A) Should we add "ssh-rsa" - and "ssh-rsa" only, not any other name - as a
possible alias in name 3, which should be interpreted as an acceptable
alternative if "rsa-sha2-256" or "rsa-sha2-512" is sent in name 1? Is this
harmless?
or
(B) Should we deny an attempt to authenticate using mismatched name 1 and
name 3, and inform the user to look into upgrading their software? Note that
software often cannot be easily upgraded, and the practical alternative will
be to disable the new signature algorithms, and continue to use "ssh-rsa".
If we decide to do (A), should we allow "ssh-rsa" to be accepted in ALL
situations where the verifier has out-of-band knowledge that the actual
signature algorithm is "rsa-sha2-256" or "-512"?
For example, should a server be able to send an "ssh-rsa" signature that's
actually "rsa-sha2-512" because the negotiated algorithm is "rsa-sha2-512"?
Or should the accommodation be restricted to client authentication only?
Regardless of what we think is best - should we put a paragraph about this
in the rsa-sha2 draft?
denis
Home |
Main Index |
Thread Index |
Old Index