OpenSSL Security Altert - Remote Buffer Overflows

From: Ben Laurie (benat_private)
Date: Tue Jul 30 2002 - 02:58:19 PDT

  • Next message: Daniel Ahlberg: "GLSA: OpenSSL"

    OpenSSL Security Advisory [30 July 2002]
    
    This advisory consists of two independent advisories, merged, and is
    an official OpenSSL advisory.
    
    Advisory 1
    ==========
    
    A.L. Digital Ltd and The Bunker (http://www.thebunker.net/) are
    conducting a security review of OpenSSL, under the DARPA program
    CHATS.
    
    Vulnerabilities
    ---------------
    
    All four of these are potentially remotely exploitable.
    
    1. The client master key in SSL2 could be oversized and overrun a
        buffer. This vulnerability was also independently discovered by
        consultants at Neohapsis (http://www.neohapsis.com/) who have also
        demonstrated that the vulerability is exploitable. Exploit code is
        NOT available at this time.
    
    2. The session ID supplied to a client in SSL3 could be oversized and
        overrun a buffer.
    
    3. The master key supplied to an SSL3 server could be oversized and
        overrun a stack-based buffer. This issues only affects OpenSSL
        0.9.7 before 0.9.7-beta3 with Kerberos enabled.
    
    4. Various buffers for ASCII representations of integers were too
        small on 64 bit platforms.
    
    The Common Vulnerabilities and Exposures project (cve.mitre.org) has
    assigned the name CAN-2002-0656 to issues 1-2, CAN-2002-0657 to issue
    3, and CAN-2002-0655 to issue 4.
    
    In addition various potential buffer overflows not known to be
    exploitable have had assertions added to defend against them.
    
    Who is affected?
    ----------------
    
    Everyone using OpenSSL 0.9.6d or earlier, or 0.9.7-beta2 or earlier or
    current development snapshots of 0.9.7 to provide SSL or TLS is
    vulnerable, whether client or server. 0.9.6d servers on 32-bit systems
    with SSL 2.0 disabled are not vulnerable.
    
    SSLeay is probably also affected.
    
    Recommendations
    ---------------
    
    Apply the attached patch to OpenSSL 0.9.6d, or upgrade to OpenSSL
    0.9.6e. Recompile all applications using OpenSSL to provide SSL or
    TLS.
    
    A patch for 0.9.7 is available from the OpenSSL website
    (http://www.openssl.org/).
    
    Servers can disable SSL2, alternatively disable all applications using
    SSL or TLS until the patches are applied. Users of 0.9.7 pre-release
    versions with Kerberos enabled will also have to disable Kerberos.
    
    Client should be disabled altogether until the patches are applied.
    
    Known Exploits
    --------------
    
    There are no know exploits available for these vulnerabilities. As
    noted above, Neohapsis have demonstrated internally that an exploit is
    possible, but have not released the exploit code.
    
    References
    ----------
    
    http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0655
    http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0656
    http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0657
    
    Acknowledgements
    ----------------
    
    The project leading to this advisory is sponsored by the Defense
    Advanced Research Projects Agency (DARPA) and Air Force Research
    Laboratory, Air Force Materiel Command, USAF, under agreement number
    F30602-01-2-0537.
    
    The patch and advisory were prepared by Ben Laurie.
    
    
    
    Advisory 2
    ==========
    
    Vulnerabilities
    ---------------
    
    The ASN1 parser can be confused by supplying it with certain invalid
    encodings.
    
    The Common Vulnerabilities and Exposures project (cve.mitre.org) has
    assigned the name CAN-2002-0659 to this issue.
    
    Who is affected?
    ----------------
    
    Any OpenSSL program which uses the ASN1 library to parse untrusted
    data. This includes all SSL or TLS applications, those using S/MIME
    (PKCS#7) or certificate generation routines.
    
    Recommendations
    ---------------
    
    Apply the patch to OpenSSL, or upgrade to OpenSSL 0.9.6e. Recompile
    all applications using OpenSSL.
    
    Users of 0.9.7 pre-release versions should apply the patch or upgrade
    to 0.9.7-beta3 or later. Recompile all applications using OpenSSL.
    
    Exploits
    --------
    
    There are no known exploits for this vulnerability.
    
    References
    ----------
    
    http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0659
    
    Acknowledgements
    ----------------
    
    This vulnerability was discovered by Adi Stav <stavat_private>
    and James Yonan <jimat_private> independently. The patch is partly
    based on a version by Adi Stav.
    
    The patch and advisory were prepared by Dr. Stephen Henson.
    
    -- 
    http://www.apache-ssl.org/ben.html       http://www.thebunker.net/
    
    Available for contract work.
    
    "There is no limit to what a man can do or how far he can go if he
    doesn't mind who gets the credit." - Robert Woodruff
    
    
    Index: CHANGES
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/CHANGES,v
    retrieving revision 1.618.2.158
    diff -u -r1.618.2.158 CHANGES
    --- CHANGES	2002/05/09 22:40:31	1.618.2.158
    +++ CHANGES	2002/07/30 09:14:15
    @@ -2,6 +2,35 @@
      OpenSSL CHANGES
      _______________
     
    + Changes in security patch
    +
    +Changes marked "(CHATS)" were sponsored by the Defense Advanced
    +Research Projects Agency (DARPA) and Air Force Research Laboratory,
    +Air Force Materiel Command, USAF, under agreement number
    +F30602-01-2-0537.
    +
    +  *) Add various sanity checks to asn1_get_length() to reject
    +     the ASN1 length bytes if they exceed sizeof(long), will appear
    +     negative or the content length exceeds the length of the
    +     supplied buffer. (CAN-2002-0659)
    +     [Steve Henson, Adi Stav <stavat_private>, James Yonan <jimat_private>]
    +
    +  *) Assertions for various potential buffer overflows, not known to
    +     happen in practice.
    +     [Ben Laurie (CHATS)]
    +
    +  *) Various temporary buffers to hold ASCII versions of integers were
    +     too small for 64 bit platforms. (CAN-2002-0655)
    +     [Matthew Byng-Maddick <mbmat_private> and Ben Laurie (CHATS)>
    +
    +  *) Remote buffer overflow in SSL3 protocol - an attacker could
    +     supply an oversized session ID to a client. (CAN-2002-0656)
    +     [Ben Laurie (CHATS)]
    +
    +  *) Remote buffer overflow in SSL2 protocol - an attacker could
    +     supply an oversized client master key. (CAN-2002-0656)
    +     [Ben Laurie (CHATS)]
    +
      Changes between 0.9.6c and 0.9.6d  [9 May 2002]
     
       *) Fix crypto/asn1/a_sign.c so that 'parameters' is omitted (not
    Index: crypto/cryptlib.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/crypto/cryptlib.c,v
    retrieving revision 1.20.2.4
    diff -u -r1.20.2.4 cryptlib.c
    --- crypto/cryptlib.c	2001/11/23 20:57:59	1.20.2.4
    +++ crypto/cryptlib.c	2002/07/30 09:14:15
    @@ -491,3 +491,11 @@
     #endif
     
     #endif
    +
    +void OpenSSLDie(const char *file,int line,const char *assertion)
    +    {
    +    fprintf(stderr,"%s(%d): OpenSSL internal error, assertion failed: %s\n",
    +	    file,line,assertion);
    +    abort();
    +    }
    +
    Index: crypto/cryptlib.h
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/crypto/cryptlib.h,v
    retrieving revision 1.8
    diff -u -r1.8 cryptlib.h
    --- crypto/cryptlib.h	2000/05/02 12:35:04	1.8
    +++ crypto/cryptlib.h	2002/07/30 09:14:16
    @@ -89,6 +89,14 @@
     #define X509_CERT_DIR_EVP        "SSL_CERT_DIR"
     #define X509_CERT_FILE_EVP       "SSL_CERT_FILE"
     
    +/* size of string represenations */
    +#define DECIMAL_SIZE(type)     ((sizeof(type)*8+2)/3+1)
    +#define HEX_SIZE(type)         ((sizeof(type)*2)
    +
    +/* die if we have to */
    +void OpenSSLDie(const char *file,int line,const char *assertion);
    +#define die(e)	((e) ? (void)0 : OpenSSLDie(__FILE__, __LINE__, #e))
    +
     #ifdef  __cplusplus
     }
     #endif
    Index: crypto/asn1/asn1_lib.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/crypto/asn1/asn1_lib.c,v
    retrieving revision 1.19.2.1
    diff -u -r1.19.2.1 asn1_lib.c
    --- crypto/asn1/asn1_lib.c	2001/03/30 13:42:32	1.19.2.1
    +++ crypto/asn1/asn1_lib.c	2002/07/30 09:14:17
    @@ -124,15 +124,13 @@
     		(int)(omax+ *pp));
     
     #endif
    -#if 0
    -	if ((p+ *plength) > (omax+ *pp))
    +	if (*plength > (omax - (*pp - p)))
     		{
     		ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_TOO_LONG);
     		/* Set this so that even if things are not long enough
     		 * the values are set correctly */
     		ret|=0x80;
     		}
    -#endif
     	*pp=p;
     	return(ret|inf);
     err:
    @@ -159,6 +157,8 @@
     		i= *p&0x7f;
     		if (*(p++) & 0x80)
     			{
    +			if (i > sizeof(long))
    +				return 0;
     			if (max-- == 0) return(0);
     			while (i-- > 0)
     				{
    @@ -170,6 +170,8 @@
     		else
     			ret=i;
     		}
    +	if (ret < 0)
    +		return 0;
     	*pp=p;
     	*rl=ret;
     	return(1);
    @@ -407,7 +409,7 @@
     
     void asn1_add_error(unsigned char *address, int offset)
     	{
    -	char buf1[16],buf2[16];
    +	char buf1[DECIMAL_SIZE(address)+1],buf2[DECIMAL_SIZE(offset)+1];
     
     	sprintf(buf1,"%lu",(unsigned long)address);
     	sprintf(buf2,"%d",offset);
    Index: crypto/conf/conf_def.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/crypto/conf/conf_def.c,v
    retrieving revision 1.3
    diff -u -r1.3 conf_def.c
    --- crypto/conf/conf_def.c	2000/06/06 15:21:12	1.3
    +++ crypto/conf/conf_def.c	2002/07/30 09:14:18
    @@ -67,6 +67,7 @@
     #include "conf_def.h"
     #include <openssl/buffer.h>
     #include <openssl/err.h>
    +#include "cryptlib.h"
     
     static char *eat_ws(CONF *conf, char *p);
     static char *eat_alpha_numeric(CONF *conf, char *p);
    @@ -180,12 +181,12 @@
     static int def_load(CONF *conf, BIO *in, long *line)
     	{
     #define BUFSIZE	512
    -	char btmp[16];
     	int bufnum=0,i,ii;
     	BUF_MEM *buff=NULL;
     	char *s,*p,*end;
     	int again,n;
     	long eline=0;
    +	char btmp[DECIMAL_SIZE(eline)+1];
     	CONF_VALUE *v=NULL,*tv;
     	CONF_VALUE *sv=NULL;
     	char *section=NULL,*buf;
    Index: crypto/objects/obj_dat.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/crypto/objects/obj_dat.c,v
    retrieving revision 1.16.2.2
    diff -u -r1.16.2.2 obj_dat.c
    --- crypto/objects/obj_dat.c	2002/04/18 11:52:28	1.16.2.2
    +++ crypto/objects/obj_dat.c	2002/07/30 09:14:19
    @@ -428,7 +428,7 @@
     	unsigned long l;
     	unsigned char *p;
     	const char *s;
    -	char tbuf[32];
    +	char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2];
     
     	if (buf_len <= 0) return(0);
     
    Index: ssl/s2_clnt.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/s2_clnt.c,v
    retrieving revision 1.27.2.4
    diff -u -r1.27.2.4 s2_clnt.c
    --- ssl/s2_clnt.c	2001/11/10 10:43:51	1.27.2.4
    +++ ssl/s2_clnt.c	2002/07/30 09:14:25
    @@ -116,6 +116,7 @@
     #include <openssl/buffer.h>
     #include <openssl/objects.h>
     #include <openssl/evp.h>
    +#include "cryptlib.h"
     
     static SSL_METHOD *ssl2_get_client_method(int ver);
     static int get_server_finished(SSL *s);
    @@ -517,6 +518,7 @@
     		}
     		
     	s->s2->conn_id_length=s->s2->tmp.conn_id_length;
    +	die(s->s2->conn_id_length <= sizeof s->s2->conn_id);
     	memcpy(s->s2->conn_id,p,s->s2->tmp.conn_id_length);
     	return(1);
     	}
    @@ -618,6 +620,7 @@
     		/* make key_arg data */
     		i=EVP_CIPHER_iv_length(c);
     		sess->key_arg_length=i;
    +		die(i <= SSL_MAX_KEY_ARG_LENGTH);
     		if (i > 0) RAND_pseudo_bytes(sess->key_arg,i);
     
     		/* make a master key */
    @@ -625,6 +628,7 @@
     		sess->master_key_length=i;
     		if (i > 0)
     			{
    +			die(i <= sizeof sess->master_key);
     			if (RAND_bytes(sess->master_key,i) <= 0)
     				{
     				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
    @@ -668,6 +672,7 @@
     		d+=enc;
     		karg=sess->key_arg_length;	
     		s2n(karg,p); /* key arg size */
    +		die(karg <= sizeof sess->key_arg);
     		memcpy(d,sess->key_arg,(unsigned int)karg);
     		d+=karg;
     
    @@ -688,6 +693,7 @@
     		{
     		p=(unsigned char *)s->init_buf->data;
     		*(p++)=SSL2_MT_CLIENT_FINISHED;
    +		die(s->s2->conn_id_length <= sizeof s->s2->conn_id);
     		memcpy(p,s->s2->conn_id,(unsigned int)s->s2->conn_id_length);
     
     		s->state=SSL2_ST_SEND_CLIENT_FINISHED_B;
    @@ -944,6 +950,8 @@
     		{
     		if (!(s->options & SSL_OP_MICROSOFT_SESS_ID_BUG))
     			{
    +			die(s->session->session_id_length
    +			    <= sizeof s->session->session_id);
     			if (memcmp(buf,s->session->session_id,
     				(unsigned int)s->session->session_id_length) != 0)
     				{
    Index: ssl/s2_lib.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/s2_lib.c,v
    retrieving revision 1.29.2.2
    diff -u -r1.29.2.2 s2_lib.c
    --- ssl/s2_lib.c	2000/12/26 12:06:47	1.29.2.2
    +++ ssl/s2_lib.c	2002/07/30 09:14:25
    @@ -62,6 +62,7 @@
     #include <openssl/rsa.h>
     #include <openssl/objects.h>
     #include <openssl/md5.h>
    +#include "cryptlib.h"
     
     static long ssl2_default_timeout(void );
     const char *ssl2_version_str="SSLv2" OPENSSL_VERSION_PTEXT;
    @@ -425,10 +426,14 @@
     #endif
     
     	km=s->s2->key_material;
    + 	die(s->s2->key_material_length <= sizeof s->s2->key_material);
     	for (i=0; i<s->s2->key_material_length; i+=MD5_DIGEST_LENGTH)
     		{
     		MD5_Init(&ctx);
     
    + 		die(s->session->master_key_length >= 0
    + 		    && s->session->master_key_length
    + 		    < sizeof s->session->master_key);
     		MD5_Update(&ctx,s->session->master_key,s->session->master_key_length);
     		MD5_Update(&ctx,&c,1);
     		c++;
    @@ -463,6 +468,7 @@
     /*	state=s->rwstate;*/
     	error=s->error;
     	s->error=0;
    +	die(error >= 0 && error <= 3);
     	i=ssl2_write(s,&(buf[3-error]),error);
     /*	if (i == error) s->rwstate=state; */
     
    Index: ssl/s2_srvr.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/s2_srvr.c,v
    retrieving revision 1.25.2.5
    diff -u -r1.25.2.5 s2_srvr.c
    --- ssl/s2_srvr.c	2001/11/14 21:19:47	1.25.2.5
    +++ ssl/s2_srvr.c	2002/07/30 09:14:26
    @@ -116,6 +116,7 @@
     #include <openssl/rand.h>
     #include <openssl/objects.h>
     #include <openssl/evp.h>
    +#include "cryptlib.h"
     
     static SSL_METHOD *ssl2_get_server_method(int ver);
     static int get_client_master_key(SSL *s);
    @@ -417,11 +418,18 @@
     		n2s(p,i); s->s2->tmp.clear=i;
     		n2s(p,i); s->s2->tmp.enc=i;
     		n2s(p,i); s->session->key_arg_length=i;
    +		if(s->session->key_arg_length > SSL_MAX_KEY_ARG_LENGTH)
    +			{
    +			SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,
    +				   SSL_R_KEY_ARG_TOO_LONG);
    +			return -1;
    +			}
     		s->state=SSL2_ST_GET_CLIENT_MASTER_KEY_B;
     		}
     
     	/* SSL2_ST_GET_CLIENT_MASTER_KEY_B */
     	p=(unsigned char *)s->init_buf->data;
    +	die(s->init_buf->length >= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER);
     	keya=s->session->key_arg_length;
     	len = 10 + (unsigned long)s->s2->tmp.clear + (unsigned long)s->s2->tmp.enc + (unsigned long)keya;
     	if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
    @@ -502,6 +510,7 @@
     #endif
     
     	if (is_export) i+=s->s2->tmp.clear;
    +	die(i <= SSL_MAX_MASTER_KEY_LENGTH);
     	s->session->master_key_length=i;
     	memcpy(s->session->master_key,p,(unsigned int)i);
     	return(1);
    @@ -649,6 +658,7 @@
     	p+=s->s2->tmp.session_id_length;
     
     	/* challenge */
    +	die(s->s2->challenge_length <= sizeof s->s2->challenge);
     	memcpy(s->s2->challenge,p,(unsigned int)s->s2->challenge_length);
     	return(1);
     mem_err:
    @@ -800,6 +810,7 @@
     		}
     
     	/* SSL2_ST_GET_CLIENT_FINISHED_B */
    +	die(s->s2->conn_id_length <= sizeof s->s2->conn_id);
     	len = 1 + (unsigned long)s->s2->conn_id_length;
     	n = (int)len - s->init_num;
     	i = ssl2_read(s,(char *)&(p[s->init_num]),n);
    @@ -825,6 +836,7 @@
     		{
     		p=(unsigned char *)s->init_buf->data;
     		*(p++)=SSL2_MT_SERVER_VERIFY;
    +		die(s->s2->challenge_length <= sizeof s->s2->challenge);
     		memcpy(p,s->s2->challenge,(unsigned int)s->s2->challenge_length);
     		/* p+=s->s2->challenge_length; */
     
    @@ -844,6 +856,8 @@
     		p=(unsigned char *)s->init_buf->data;
     		*(p++)=SSL2_MT_SERVER_FINISHED;
     
    +		die(s->session->session_id_length
    +		    <= sizeof s->session->session_id);
     		memcpy(p,s->session->session_id,
     			(unsigned int)s->session->session_id_length);
     		/* p+=s->session->session_id_length; */
    Index: ssl/s3_clnt.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/s3_clnt.c,v
    retrieving revision 1.31.2.6
    diff -u -r1.31.2.6 s3_clnt.c
    --- ssl/s3_clnt.c	2002/01/14 23:42:35	1.31.2.6
    +++ ssl/s3_clnt.c	2002/07/30 09:14:27
    @@ -117,6 +117,7 @@
     #include <openssl/sha.h>
     #include <openssl/evp.h>
     #include "ssl_locl.h"
    +#include "cryptlib.h"
     
     static SSL_METHOD *ssl3_get_client_method(int ver);
     static int ssl3_client_hello(SSL *s);
    @@ -545,6 +546,7 @@
     		*(p++)=i;
     		if (i != 0)
     			{
    +			die(i <= sizeof s->session->session_id);
     			memcpy(p,s->session->session_id,i);
     			p+=i;
     			}
    @@ -625,6 +627,14 @@
     
     	/* get the session-id */
     	j= *(p++);
    +
    +       if(j > sizeof s->session->session_id)
    +               {
    +               al=SSL_AD_ILLEGAL_PARAMETER;
    +               SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,
    +                      SSL_R_SSL3_SESSION_ID_TOO_LONG);
    +               goto f_err;
    +               }
     
     	if ((j != 0) && (j != SSL3_SESSION_ID_SIZE))
     		{
    Index: ssl/s3_srvr.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/s3_srvr.c,v
    retrieving revision 1.49.2.14
    diff -u -r1.49.2.14 s3_srvr.c
    --- ssl/s3_srvr.c	2002/04/13 22:49:26	1.49.2.14
    +++ ssl/s3_srvr.c	2002/07/30 09:14:28
    @@ -122,6 +122,7 @@
     #include <openssl/evp.h>
     #include <openssl/x509.h>
     #include "ssl_locl.h"
    +#include "cryptlib.h"
     
     static SSL_METHOD *ssl3_get_server_method(int ver);
     static int ssl3_get_client_hello(SSL *s);
    @@ -948,6 +949,7 @@
     			s->session->session_id_length=0;
     
     		sl=s->session->session_id_length;
    +		die(sl <= sizeof s->session->session_id);
     		*(p++)=sl;
     		memcpy(p,s->session->session_id,sl);
     		p+=sl;
    Index: ssl/ssl.h
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/ssl.h,v
    retrieving revision 1.85.2.12
    diff -u -r1.85.2.12 ssl.h
    --- ssl/ssl.h	2002/01/14 23:42:42	1.85.2.12
    +++ ssl/ssl.h	2002/07/30 09:14:29
    @@ -1478,6 +1478,7 @@
     #define SSL_R_INVALID_COMMAND				 280
     #define SSL_R_INVALID_PURPOSE				 278
     #define SSL_R_INVALID_TRUST				 279
    +#define SSL_R_KEY_ARG_TOO_LONG				 1112
     #define SSL_R_LENGTH_MISMATCH				 159
     #define SSL_R_LENGTH_TOO_SHORT				 160
     #define SSL_R_LIBRARY_BUG				 274
    @@ -1546,6 +1547,7 @@
     #define SSL_R_SHORT_READ				 219
     #define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE	 220
     #define SSL_R_SSL23_DOING_SESSION_ID_REUSE		 221
    +#define SSL_R_SSL3_SESSION_ID_TOO_LONG			 1113
     #define SSL_R_SSL3_SESSION_ID_TOO_SHORT			 222
     #define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE		 1042
     #define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC		 1020
    Index: ssl/ssl_asn1.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/ssl_asn1.c,v
    retrieving revision 1.8
    diff -u -r1.8 ssl_asn1.c
    --- ssl/ssl_asn1.c	2000/06/01 22:19:19	1.8
    +++ ssl/ssl_asn1.c	2002/07/30 09:14:29
    @@ -62,6 +62,7 @@
     #include <openssl/objects.h>
     #include <openssl/x509.h>
     #include "ssl_locl.h"
    +#include "cryptlib.h"
     
     typedef struct ssl_session_asn1_st
     	{
    @@ -275,6 +276,7 @@
     		os.length=i;
     
     	ret->session_id_length=os.length;
    +	die(os.length <= sizeof ret->session_id);
     	memcpy(ret->session_id,os.data,os.length);
     
     	M_ASN1_D2I_get(osp,d2i_ASN1_OCTET_STRING);
    Index: ssl/ssl_err.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/ssl_err.c,v
    retrieving revision 1.28.2.6
    diff -u -r1.28.2.6 ssl_err.c
    --- ssl/ssl_err.c	2001/11/10 01:15:29	1.28.2.6
    +++ ssl/ssl_err.c	2002/07/30 09:14:30
    @@ -1,6 +1,6 @@
     /* ssl/ssl_err.c */
     /* ====================================================================
    - * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
    + * Copyright (c) 1999-2002 The OpenSSL Project.  All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
      * modification, are permitted provided that the following conditions
    @@ -275,6 +275,7 @@
     {SSL_R_INVALID_COMMAND                   ,"invalid command"},
     {SSL_R_INVALID_PURPOSE                   ,"invalid purpose"},
     {SSL_R_INVALID_TRUST                     ,"invalid trust"},
    +{SSL_R_KEY_ARG_TOO_LONG                  ,"key arg too long"},
     {SSL_R_LENGTH_MISMATCH                   ,"length mismatch"},
     {SSL_R_LENGTH_TOO_SHORT                  ,"length too short"},
     {SSL_R_LIBRARY_BUG                       ,"library bug"},
    @@ -343,6 +344,7 @@
     {SSL_R_SHORT_READ                        ,"short read"},
     {SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE,"signature for non signing certificate"},
     {SSL_R_SSL23_DOING_SESSION_ID_REUSE      ,"ssl23 doing session id reuse"},
    +{SSL_R_SSL3_SESSION_ID_TOO_LONG          ,"ssl3 session id too long"},
     {SSL_R_SSL3_SESSION_ID_TOO_SHORT         ,"ssl3 session id too short"},
     {SSL_R_SSLV3_ALERT_BAD_CERTIFICATE       ,"sslv3 alert bad certificate"},
     {SSL_R_SSLV3_ALERT_BAD_RECORD_MAC        ,"sslv3 alert bad record mac"},
    Index: ssl/ssl_sess.c
    ===================================================================
    RCS file: /e/openssl/cvs/openssl/ssl/ssl_sess.c,v
    retrieving revision 1.30.2.2
    diff -u -r1.30.2.2 ssl_sess.c
    --- ssl/ssl_sess.c	2002/02/10 12:52:57	1.30.2.2
    +++ ssl/ssl_sess.c	2002/07/30 09:14:30
    @@ -60,6 +60,7 @@
     #include <openssl/lhash.h>
     #include <openssl/rand.h>
     #include "ssl_locl.h"
    +#include "cryptlib.h"
     
     static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s);
     static void SSL_SESSION_list_add(SSL_CTX *ctx,SSL_SESSION *s);
    @@ -199,6 +200,7 @@
     		ss->session_id_length=0;
     		}
     
    +	die(s->sid_ctx_length <= sizeof ss->sid_ctx);
     	memcpy(ss->sid_ctx,s->sid_ctx,s->sid_ctx_length);
     	ss->sid_ctx_length=s->sid_ctx_length;
     	s->session=ss;
    



    This archive was generated by hypermail 2b30 : Tue Jul 30 2002 - 07:35:34 PDT