Patch to workaround host key size mismatch bug in old SSH sshd

Dave Dykstra dwd at bell-labs.com
Fri Aug 24 03:02:56 EST 2001


Markus,

Do you want to include this patch before the next release?

I checked the current CVS and the code around the patch hasn't appeared
to change so the patch should still apply cleanly.

- Dave Dykstra

On Thu, Jul 05, 2001 at 10:59:25AM -0500, Dave Dykstra wrote:
> Below is a patch against the current OpenBSD OpenSSH CVS to workaround a
> behavior I have observed when converting from SSH 1.2.27 to OpenSSH while
> using the same old RSA1 host key for protocol 1.  In several cases I saw
> that old SSH sshd reported a host key size of 1024 bits when OpenSSH saw it
> as 1023 bits.  Without the patch, when OpenSSH's ssh client connects to an
> old SSH sshd it warns that the server lies about the size, and when an old
> SSH ssh client connects to an OpenSSH sshd it reports the dreaded "WARNING:
> HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING
> SOMETHING NASTY!"   An OpenSSH ssh client conveniently ignores the key size
> in ~/.ssh/authorized_keys (in a kind of convoluted way, I might add) so it
> doesn't care that the key size reported by OpenSSH sshd is 1023 even if
> authorized_keys says it's 1024.
> 
> A pleasant side effect of this patch is that compat.c no longer prints the
> disconcerting debug message "no match" when communicating with SSH 1.2.23
> through 1.2.31.
> 
> - Dave Dykstra
> 
> 
> --- compat.h.O	Thu Jul  5 10:49:47 2001
> +++ compat.h	Thu Jul  5 10:50:04 2001
> @@ -50,6 +50,7 @@
>  #define SSH_BUG_HBSERVICE	0x00010000
>  #define SSH_BUG_OPENFAILURE	0x00020000
>  #define SSH_BUG_DERIVEKEY	0x00040000
> +#define SSH_BUG_SERVERLIESSIZE	0x00080000
>  
>  void     enable_compat13(void);
>  void     enable_compat20(void);
> --- compat.c.O	Thu Jul  5 10:49:21 2001
> +++ compat.c	Thu Jul  5 10:49:27 2001
> @@ -105,6 +105,8 @@
>  		{ "^1\\.7 SecureFX",	SSH_OLD_SESSIONID },
>  		{ "^1\\.2\\.1[89]",	SSH_BUG_IGNOREMSG },
>  		{ "^1\\.2\\.2[012]",	SSH_BUG_IGNOREMSG },
> +		{ "^1\\.2\\.2[3-9]",	SSH_BUG_SERVERLIESSIZE },
> +		{ "^1\\.2\\.3[0-1]",	SSH_BUG_SERVERLIESSIZE },
>  		{ "^1\\.3\\.2",		SSH_BUG_IGNOREMSG },	/* f-secure */
>  		{ "^SSH Compatible Server",			/* Netscreen */
>  					SSH_BUG_PASSWORDPAD },
> --- sshconnect1.c.O	Thu Jul  5 10:49:13 2001
> +++ sshconnect1.c	Thu Jul  5 10:49:28 2001
> @@ -37,6 +37,7 @@
>  #include "packet.h"
>  #include "mpaux.h"
>  #include "uidswap.h"
> +#include "compat.h"
>  #include "log.h"
>  #include "readconf.h"
>  #include "key.h"
> @@ -960,7 +961,8 @@
>  	sum_len += clen;
>  
>  	rbits = BN_num_bits(host_key->n);
> -	if (bits != rbits) {
> +	if (bits != rbits &&
> +	    !((datafellows & SSH_BUG_SERVERLIESSIZE) && (rbits + 1 == bits))) {
>  		log("Warning: Server lies about size of server host key: "
>  		    "actual size is %d bits vs. announced %d.", rbits, bits);
>  		log("Warning: This may be due to an old implementation of ssh.");
> --- sshd.c.O	Thu Jul  5 10:49:10 2001
> +++ sshd.c	Thu Jul  5 10:49:27 2001
> @@ -1217,7 +1217,12 @@
>  	packet_put_bignum(sensitive_data.server_key->rsa->n);
>  
>  	/* Store our public host RSA key. */
> -	packet_put_int(BN_num_bits(sensitive_data.ssh1_host_key->rsa->n));
> +	len = BN_num_bits(sensitive_data.ssh1_host_key->rsa->n);
> +	if ((datafellows & SSH_BUG_SERVERLIESSIZE) && (len & 1)) {
> +	    /* old ssh client expects even number for host key */
> +	    len += 1;
> +	}
> +	packet_put_int(len);
>  	packet_put_bignum(sensitive_data.ssh1_host_key->rsa->e);
>  	packet_put_bignum(sensitive_data.ssh1_host_key->rsa->n);
>  



More information about the openssh-unix-dev mailing list