[22247] in bugtraq

home help back first fref pref prev next nref lref last post

Re: qmail starttls patch does not seed the random number generator

daemon@ATHENA.MIT.EDU (Wojciech Purczynski)
Wed Aug 15 11:27:12 2001

Date: 	Wed, 15 Aug 2001 17:02:15 +0200 (CEST)
From: Wojciech Purczynski <wp@supermedia.pl>
To: Felix von Leitner <felix-qmail@fefe.de>
Cc: <qmail@list.cr.yp.to>, <jos-tls@kotnet.org>, <bugtraq@securityfocus.com>
In-Reply-To: <20010815025736.A11987@codeblau.de>
Message-ID: <Pine.LNX.4.33.0108151652330.2565-100000@lama.supermedia.pl>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=ISO-8859-2
Content-Transfer-Encoding: 8BIT


Hi,

The way you fixed the problem is not secure. It works in most cases but it
may fail in some cases. Your patch does not check for error codes that may
be returned by open() and if read() returns less characters than 33 your
code just skips seeding the PRNG without returning any error.

As we can read in kernel sources, open("/dev/urandom") and read() should
not return error but you can't depend on this if you wan't to provide
secure fix. If kernel changes your code may become insecure and would need
to be fixed again and again...

Cheers,
wp

> openssl-0.9.6b does not allow ssl/tls connections when the random number
> has not been seeded.  This is a good idea, and it exposes that the
> starttls patch for qmail does not seed the random number generator.
>
> Here is a small patch that fixes the problem in qmail-remote for systems
> that support /dev/urandom (the same can be done for qmail-smtpd but I
> can't test it right now).  Not seeding the random number generator is a
> serious bug and it completely compromises the cryptographic privacy of
> TLS encrypted emails.
>
> Felix
>
> --- qmail-1.03/qmail-remote.c	Wed Aug 15 02:52:23 2001
> +++ qmail-1.03-diet/qmail-remote.c	Wed Aug 15 02:43:07 2001
> @@ -431,6 +431,13 @@
>        SSL_set_fd(ssl,smtpfd);
>
>        alarm(timeout);
> +      {
> +	int randfd=open_read("/dev/urandom");
> +	char buf[64];
> +	int len=read(randfd,buf,64);
> +	close(randfd);
> +	if (len>32) RAND_seed(buf,len);
> +      }
>        r = SSL_connect(ssl); saveerrno = errno;
>        alarm(0);
>        if (flagtimedout)
>

_________________________________________________________________
 Wojciech Purczyński | Security Officer | http://cliph.linux.pl/
-----------------------------------------------------------------
 Murphy's law says that there is always one more bug...
               ...but he forgot to mention if it is exploitable.


home help back first fref pref prev next nref lref last post