Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Nov 1999 00:08:12 -0500
From:      Mike Tancsa <mike@sentex.net>
To:        freebsd-security@freebsd.org
Cc:        security-officer@freebsd.org
Subject:   Fwd: ssh-1.2.27 remote buffer overflow - exploitable (VD#7)
Message-ID:  <4.1.19991114000355.04d7f230@granite.sentex.ca>

next in thread | raw e-mail | index | archive | help

Is there a patch to this ? Or is openssh the way to go ?

	---Mike


>There appears to be a serious vulnerability in ssh 1.2.27.  I will let the
>folks who worked on this issue describe.  There was brief discussion on
>vuln-dev on the politics of ssh 1 vs. ssh 2, etc...  you may or may not
>want to play that out on Bugtraq.  One of the key points of the SSH 1 vs.
>SSH 2 debate is regarding licensing.  Basically, because of a less strict
>license on SSH 1, more folks are likely to be running that version.  (This
>is all referring to the Datafellows implementation that everyone uses,
>rather than standards and protocols, I presume.)
>
>As usually, check the vuln-dev archives if you want the full story.  This
>isn't necessarily a dead topic there yet, but this issue should get out
>there sooner rather than later.
>
>					BB
>
>-------------------------------------------------------------------
>
>To:         Exploit-Dev
>Subject:    ssh-1.2.27 remote buffer overflow - exploitable
>Date:       Mon Nov 08 1999 16:48:53
>Author:     Frank
>Message-ID: <19991109014853.3239.qmail@securityfocus.com>
>
>This is submitted to the Freebsd bug tracking system, although there are
>doubtless other vendors who leave this package, despite the existence of
>the ssh-2.X.   While Debian appears to be immune, I was able to crash my
>ssh daemon (much to my dismay), and there appears the potential to execute
>arbitrary code, as long as you encrypt it first...
>
>Here is the freebsd report.. it describes the method to crash a remote Ssh
>daemon (lets hope you ran sshd from your xinetd, etc).
>
>http://www.freebsd.org/cgi/query-pr.cgi?pr=14749
>
>-------------------------------------------------------------------
>
>To:           Exploit-Dev
>Subject:      Re: ssh-1.2.27 remote buffer overflow - exploitable
>Date:         Mon Nov 08 1999 21:04:19
>Author:       Daniel Jacobowitz
>Message-ID:   <19991109110419.A29502@drow.res.cmu.edu>
>
><SNIP>
>Debian is immune for the (somewhat messy) reasons that they do not link
>ssh to rsaref, last time that I checked.
><SNIP>
>
>-------------------------------------------------------------------
>
>To:           Exploit-Dev
>Subject:      Re: ssh-1.2.27 remote buffer overflow - exploitable
>Date:         Mon Nov 08 1999 21:24:17
>Author:       Daniel Jacobowitz
>Message-ID:   <19991109112417.A30046@drow.res.cmu.edu>
>
><SNIP>
>And here's a patch.  Not tested, as I don't use the rsaref glue on any
>machine here.
><SNIP>
>
>Ed: Patch can be found at:
>
>http://www.securityfocus.com/templates/archive.pike?list=82&date=1999-11-08&;
>msg=19991109112417.A30046@drow.res.cmu.edu
>
>-------------------------------------------------------------------
>
>To:          Exploit-Dev
>Subject:     Re: ssh-1.2.27 remote buffer overflow - exploitable
>Date:        Tue Nov 09 1999 04:42:16
>Author:      Jochen Bauer
>Message-ID:  <19991109124216.A28812@luna.theo2.physik.uni-stuttgart.de>
>
>I've taken a closer look at the problem. Here's my analysis:
>
>In sshd.c, around line 1513 the client-generated session key,
>that has been encrypted with the server and host public keys,
>is received from the client as a multiple precision integer.
>
>/* Get the encrypted integer. */
>  mpz_init(&session_key_int);
>  packet_get_mp_int(&session_key_int);
>
>The encrypted session key is then (around line 1525) passed
>to rsa_private_decrypt to do the first part of the decryption,
>which is either decryption using the server private key or
>decryption using the host private key, depending on which key
>has the larger modulus.
>
>rsa_private_decrypt(&session_key_int, &session_key_int,
>                          &sensitive_data.private_key);
>
>If RSAREF is used (i.e. RSAREF is defined in the code), the
>rsa_private_decrypt function in rsaglue.c (around line 162)
>looks like:
>
>void rsa_private_decrypt(MP_INT *output, MP_INT *input, RSAPrivateKey *key)
>{
>  unsigned char input_data[MAX_RSA_MODULUS_LEN];
>  unsigned char output_data[MAX_RSA_MODULUS_LEN]
>  unsigned int input_len, output_len, input_bits;
>  [...]
>  input_bits = mpz_sizeinbase(input, 2);
>  input_len = (input_bits + 7) / 8;
>  gmp_to_rsaref(input_data, input_len, input);
>  [...]
>}
>
>The trouble spot is the fixed length buffer
>input_data[MAX_RSA_MODULUS_LEN]. A pointer to this buffer is
>passed to the conversion function gmp_to_rsaref along with a
>pointer to the encrypted session key and the length (input_len)
>of the encrypted session key, which may be greater than
>[MAX_RSA_MODULUS_LEN]. gmp_to_rsaref (located around line 79 of
>rsaglue.c) simply calls mp_linearize_msb_first(buf, len, value).
>
>void gmp_to_rsaref(unsigned char *buf, unsigned int len, MP_INT *value)
>{
>  mp_linearize_msb_first(buf, len, value);
>}
>
>mp_linearize_msb_first is contained in mpaux.c around line 41.
>The function looks like:
>
>void mp_linearize_msb_first(unsigned char *buf, unsigned int len,
>                            MP_INT *value)
>{
>  unsigned int i;
>  MP_INT aux;
>  mpz_init_set(&aux, value);
>  for (i = len; i >= 4; i -= 4)   <-------
>    {
>      unsigned long limb = mpz_get_ui(&aux);
>      PUT_32BIT(buf + i - 4, limb);   <-------
>      mpz_div_2exp(&aux, &aux, 32);
>    }
>  [...]
>}
>
>There's the overflow! len is the length of the encrypted session
>key, while buf is a pointer to the fixed length buffer
>input_data[MAX_RSA_MODULUS_LEN] and no check wether len is
>greater than MAX_RSA_MODULUS_LEN is performed. The fix should be
>obvious!
>
>About the possible exploit:
>
>In this particular overflow, the encrypted, client generated session
>key has to be taken as the exploit buffer. I.e. the shellcode, NOPs
>and jump address has to sent to the server instead of the encrypted
>session key. To make that clear: The shellcode, NOPs and jump address
>don't have to be encrypted as they are taken as the ENCRYPTED session
>key.
>
>However, the data that is finally written into the buffer are the
>limbs of the multiple precision integer that session_key_int is
>assumed to be. The exploit buffer code therefore must be converted
>into a multiple precision integer, which upon extraction of the limbs
>into the buffer yields the correct exploit buffer code. The best way
>would probably be to start from the exploit buffer as it should finally
>be to overflow the target buffer and use the functions of the GNU
>multiple precision integer library to reverse the procedure happening
>to the encrypted session key in the sshd code step be step, leading to
>the exploit buffer that has to be sent instead of the encrypted session
>key.
>
>That may be difficult, be it think it's possible.

**********************************************************************
Mike Tancsa, Network Admin        *  mike@sentex.net
Sentex Communications Corp,       *  http://www.sentex.net/mike
Cambridge, Ontario                *  01.519.651.3400
Canada                            *


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-security" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4.1.19991114000355.04d7f230>