[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: wheezy: update for polarssl's CVE-2015-5291



Hi Guido,

thanks for the debdiff. It looks OK, so feel free to upload it. Once
that's done, I'll release the DSA.

Cheers,

--Seb

On Jan/23, Guido Günther wrote:
> Hi,
> I've forward ported Thorsten's fix fow squeeze to wheezy and added some
> autopkgtest (debdiff attached). Please find the debdiff attached. I'd be
> happy to upload ths to security master.
> Cheers,
>  -- Guido

> diff --git a/debian/changelog b/debian/changelog
> index b52643b..b6c42f0 100644
> --- a/debian/changelog
> +++ b/debian/changelog
> @@ -1,3 +1,10 @@
> +polarssl (1.2.9-1~deb7u6) wheezy-security; urgency=high
> +
> +  * Non-maintainer upload by the LTS Security Team.
> +  * CVE-2015-5291: Remote attack on clients using session tickets or SNI
> +
> + -- Guido Günther <agx@sigxcpu.org>  Sat, 23 Jan 2016 15:47:29 +0100
> +
>  polarssl (1.2.9-1~deb7u5) wheezy-security; urgency=high
>  
>    * Non-maintainer upload by the Security Team.
> diff --git a/debian/patches/CVE-2015-5291-1.patch b/debian/patches/CVE-2015-5291-1.patch
> new file mode 100644
> index 0000000..f1dc35c
> --- /dev/null
> +++ b/debian/patches/CVE-2015-5291-1.patch
> @@ -0,0 +1,27 @@
> +Index: polarssl-1.2.9/include/polarssl/ssl.h
> +===================================================================
> +--- polarssl-1.2.9.orig/include/polarssl/ssl.h	2015-10-22 15:42:52.000000000 +0200
> ++++ polarssl-1.2.9/include/polarssl/ssl.h	2015-10-22 15:44:14.000000000 +0200
> +@@ -123,6 +123,8 @@
> + #define SSL_LEGACY_ALLOW_RENEGOTIATION  1
> + #define SSL_LEGACY_BREAK_HANDSHAKE      2
> + 
> ++#define SSL_MAX_HOST_NAME_LEN           255 /*!< Maximum host name defined in RFC 1035 */
> ++
> + /*
> +  * Size of the input / output buffer.
> +  * Note: the RFC defines the default size of SSL / TLS messages. If you
> +Index: polarssl-1.2.9/library/ssl_tls.c
> +===================================================================
> +--- polarssl-1.2.9.orig/library/ssl_tls.c	2015-10-22 15:42:52.000000000 +0200
> ++++ polarssl-1.2.9/library/ssl_tls.c	2015-10-22 15:45:02.000000000 +0200
> +@@ -3260,6 +3260,9 @@
> +     if( ssl->hostname_len + 1 == 0 )
> +         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
> + 
> ++    if( ssl->hostname_len > SSL_MAX_HOST_NAME_LEN )
> ++        return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
> ++
> +     ssl->hostname = (unsigned char *) malloc( ssl->hostname_len + 1 );
> + 
> +     if( ssl->hostname == NULL )
> diff --git a/debian/patches/series b/debian/patches/series
> index 929750e..06dd432 100644
> --- a/debian/patches/series
> +++ b/debian/patches/series
> @@ -5,3 +5,11 @@
>  CVE-2014-4911.patch
>  CVE-2014-8628.patch
>  CVE-2015-1182.patch
> +
> +# fix for CVE-2015-5291
> +# -> https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2015-5291
> +CVE-2015-5291-1.patch
> +# vulnerable code not present
> +#CVE-2015-5291-2.patch
> +#CVE-2015-5291-3.patch
> +#CVE-2015-5291-4.patch
> diff --git a/debian/patches/vulernable-code-not-present/CVE-2015-5291-2.patch b/debian/patches/vulernable-code-not-present/CVE-2015-5291-2.patch
> new file mode 100644
> index 0000000..f4d43ee
> --- /dev/null
> +++ b/debian/patches/vulernable-code-not-present/CVE-2015-5291-2.patch
> @@ -0,0 +1,323 @@
> +diff --git a/library/ssl_cli.c b/library/ssl_cli.c
> +index f603cff..deeee33 100644
> +--- a/library/ssl_cli.c
> ++++ b/library/ssl_cli.c
> +@@ -65,6 +65,7 @@ static void ssl_write_hostname_ext( ssl_context *ssl,
> +                                     size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> + 
> +     *olen = 0;
> + 
> +@@ -74,6 +75,12 @@ static void ssl_write_hostname_ext( ssl_context *ssl,
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
> +                    ssl->hostname ) );
> + 
> ++    if( (size_t)(end - p) < ssl->hostname_len + 9 )
> ++    {
> ++         SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++         return;
> ++    }
> ++
> +     /*
> +      * struct {
> +      *     NameType name_type;
> +@@ -117,6 +124,7 @@ static void ssl_write_renegotiation_ext( ssl_context *ssl,
> +                                          size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> + 
> +     *olen = 0;
> + 
> +@@ -125,6 +133,12 @@ static void ssl_write_renegotiation_ext( ssl_context *ssl,
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
> + 
> ++    if( (size_t)(end - p) < 5 + ssl->verify_data_len )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     /*
> +      * Secure renegotiation
> +      */
> +@@ -151,6 +165,7 @@ static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
> +                                                 size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> +     size_t sig_alg_len = 0;
> + #if defined(POLARSSL_RSA_C) || defined(POLARSSL_ECDSA_C)
> +     unsigned char *sig_alg_list = buf + 6;
> +@@ -163,9 +178,54 @@ static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
> + 
> ++#if defined(POLARSSL_RSA_C)
> ++#if defined(POLARSSL_SHA512_C)
> ++    /* SHA512 + RSA signature, SHA384 + RSA signature */
> ++    sig_alg_len += 4;
> ++#endif
> ++#if defined(POLARSSL_SHA256_C)
> ++    /* SHA256 + RSA signature, SHA224 + RSA signature */
> ++    sig_alg_len += 4;
> ++#endif
> ++#if defined(POLARSSL_SHA1_C)
> ++    /* SHA1 + RSA signature */
> ++    sig_alg_len += 2;
> ++#endif
> ++#if defined(POLARSSL_MD5_C)
> ++    /* MD5 + RSA signature */
> ++    sig_alg_len += 2;
> ++#endif
> ++#endif /* POLARSSL_RSA_C */
> ++#if defined(POLARSSL_ECDSA_C)
> ++#if defined(POLARSSL_SHA512_C)
> ++    /* SHA512 + ECDSA signature, SHA384 + ECDSA signature */
> ++    sig_alg_len += 4;
> ++#endif
> ++#if defined(POLARSSL_SHA256_C)
> ++    /* SHA256 + ECDSA signature, SHA224 + ECDSA signature */
> ++    sig_alg_len += 4;
> ++#endif
> ++#if defined(POLARSSL_SHA1_C)
> ++    /* SHA1 + ECDSA signature */
> ++    sig_alg_len += 2;
> ++#endif
> ++#if defined(POLARSSL_MD5_C)
> ++    /* MD5 + ECDSA signature */
> ++    sig_alg_len += 2;
> ++#endif
> ++#endif /* POLARSSL_ECDSA_C */
> ++
> ++    if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     /*
> +      * Prepare signature_algorithms extension (TLS 1.2)
> +      */
> ++    sig_alg_len = 0;
> ++
> + #if defined(POLARSSL_RSA_C)
> + #if defined(POLARSSL_SHA512_C)
> +     sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
> +@@ -248,6 +308,7 @@ static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
> +                                                      size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> +     unsigned char *elliptic_curve_list = p + 6;
> +     size_t elliptic_curve_len = 0;
> +     const ecp_curve_info *info;
> +@@ -269,6 +330,25 @@ static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
> +     for( info = ecp_curve_list(); info->grp_id != POLARSSL_ECP_DP_NONE; info++ )
> +     {
> + #endif
> ++        elliptic_curve_len += 2;
> ++    }
> ++
> ++    if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> ++    elliptic_curve_len = 0;
> ++
> ++#if defined(POLARSSL_SSL_SET_CURVES)
> ++    for( grp_id = ssl->curve_list; *grp_id != POLARSSL_ECP_DP_NONE; grp_id++ )
> ++    {
> ++       info = ecp_curve_info_from_grp_id( *grp_id );
> ++#else
> ++    for( info = ecp_curve_list(); info->grp_id != POLARSSL_ECP_DP_NONE; info++ )
> ++    {
> ++#endif
> + 
> +         elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
> +         elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
> +@@ -294,12 +374,18 @@ static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
> +                                                    size_t *olen )
> + {
> +     unsigned char *p = buf;
> +-    ((void) ssl);
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> + 
> +     *olen = 0;
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
> + 
> ++    if( end < p || (size_t)( end - p ) < 6 )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS      ) & 0xFF );
> + 
> +@@ -319,14 +405,21 @@ static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
> +                                                size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> + 
> +-    if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ) {
> +-        *olen = 0;
> ++    *olen = 0;
> ++
> ++    if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE )
> +         return;
> +-    }
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
> + 
> ++    if( end < p || (size_t)( end - p ) < 5 )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH      ) & 0xFF );
> + 
> +@@ -344,15 +437,21 @@ static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
> +                                           unsigned char *buf, size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> ++
> ++    *olen = 0;
> + 
> +     if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
> +-    {
> +-        *olen = 0;
> +         return;
> +-    }
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
> + 
> ++    if( end < p || (size_t)( end - p ) < 4 )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC      ) & 0xFF );
> + 
> +@@ -368,17 +467,25 @@ static void ssl_write_encrypt_then_mac_ext( ssl_context *ssl,
> +                                        unsigned char *buf, size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> ++
> ++    *olen = 0;
> + 
> +     if( ssl->encrypt_then_mac == SSL_ETM_DISABLED ||
> +         ssl->max_minor_ver == SSL_MINOR_VERSION_0 )
> +     {
> +-        *olen = 0;
> +         return;
> +     }
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
> +                         "extension" ) );
> + 
> ++    if( end < p || (size_t)( end - p ) < 4 )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_ENCRYPT_THEN_MAC      ) & 0xFF );
> + 
> +@@ -394,17 +501,25 @@ static void ssl_write_extended_ms_ext( ssl_context *ssl,
> +                                        unsigned char *buf, size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> ++
> ++    *olen = 0;
> + 
> +     if( ssl->extended_ms == SSL_EXTENDED_MS_DISABLED ||
> +         ssl->max_minor_ver == SSL_MINOR_VERSION_0 )
> +     {
> +-        *olen = 0;
> +         return;
> +     }
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
> +                         "extension" ) );
> + 
> ++    if( end < p || (size_t)( end - p ) < 4 )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_EXTENDED_MASTER_SECRET      ) & 0xFF );
> + 
> +@@ -420,16 +535,22 @@ static void ssl_write_session_ticket_ext( ssl_context *ssl,
> +                                           unsigned char *buf, size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> +     size_t tlen = ssl->session_negotiate->ticket_len;
> + 
> ++    *olen = 0;
> ++
> +     if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
> +-    {
> +-        *olen = 0;
> +         return;
> +-    }
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
> + 
> ++    if( end < p || (size_t)( end - p ) < 4 + tlen )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET      ) & 0xFF );
> + 
> +@@ -457,16 +578,26 @@ static void ssl_write_alpn_ext( ssl_context *ssl,
> +                                 unsigned char *buf, size_t *olen )
> + {
> +     unsigned char *p = buf;
> ++    const unsigned char *end = ssl->out_msg + SSL_MAX_CONTENT_LEN;
> ++    size_t alpnlen = 0;
> +     const char **cur;
> + 
> ++    *olen = 0;
> ++
> +     if( ssl->alpn_list == NULL )
> +-    {
> +-        *olen = 0;
> +         return;
> +-    }
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
> + 
> ++    for( cur = ssl->alpn_list; *cur != NULL; cur++ )
> ++        alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
> ++
> ++    if( end < p || (size_t)( end - p ) < 6 + alpnlen )
> ++    {
> ++        SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> ++        return;
> ++    }
> ++
> +     *p++ = (unsigned char)( ( TLS_EXT_ALPN >> 8 ) & 0xFF );
> +     *p++ = (unsigned char)( ( TLS_EXT_ALPN      ) & 0xFF );
> + 
> diff --git a/debian/patches/vulernable-code-not-present/CVE-2015-5291-3.patch b/debian/patches/vulernable-code-not-present/CVE-2015-5291-3.patch
> new file mode 100644
> index 0000000..52a0f4a
> --- /dev/null
> +++ b/debian/patches/vulernable-code-not-present/CVE-2015-5291-3.patch
> @@ -0,0 +1,51 @@
> +diff --git a/ChangeLog b/ChangeLog
> +index 44f4408..ddba5c0 100644
> +--- a/ChangeLog
> ++++ b/ChangeLog
> +@@ -1,5 +1,15 @@
> + mbed TLS ChangeLog (Sorted per branch, date)
> + 
> ++= mbed TLS 1.3.14 released 2015-10-xx
> ++
> ++Security
> ++   * Added fix for CVE-2015-xxxxx to prevent heap corruption due to buffer
> ++     overflow of the hostname or session ticket. (Found by Guido Vranken)
> ++
> ++Changes
> ++   * Added checking of hostname length in ssl_set_hostname() to ensure domain
> ++     names are compliant with RFC 1035.
> ++
> + = mbed TLS 1.3.13 reladsed 2015-09-17
> + 
> + Security
> +diff --git a/library/ssl_cli.c b/library/ssl_cli.c
> +index deeee33..ef86cd2 100644
> +--- a/library/ssl_cli.c
> ++++ b/library/ssl_cli.c
> +@@ -75,7 +75,7 @@ static void ssl_write_hostname_ext( ssl_context *ssl,
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
> +                    ssl->hostname ) );
> + 
> +-    if( (size_t)(end - p) < ssl->hostname_len + 9 )
> ++    if( end < p || (size_t)( end - p ) < ssl->hostname_len + 9 )
> +     {
> +          SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> +          return;
> +@@ -877,13 +877,13 @@ static int ssl_write_client_hello( ssl_context *ssl )
> +     ext_len += olen;
> + #endif
> + 
> +-#if defined(POLARSSL_SSL_SESSION_TICKETS)
> +-    ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
> ++#if defined(POLARSSL_SSL_ALPN)
> ++    ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
> +     ext_len += olen;
> + #endif
> + 
> +-#if defined(POLARSSL_SSL_ALPN)
> +-    ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
> ++#if defined(POLARSSL_SSL_SESSION_TICKETS)
> ++    ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
> +     ext_len += olen;
> + #endif
> + 
> diff --git a/debian/patches/vulernable-code-not-present/CVE-2015-5291-4.patch b/debian/patches/vulernable-code-not-present/CVE-2015-5291-4.patch
> new file mode 100644
> index 0000000..2019491
> --- /dev/null
> +++ b/debian/patches/vulernable-code-not-present/CVE-2015-5291-4.patch
> @@ -0,0 +1,13 @@
> +diff --git a/library/ssl_cli.c b/library/ssl_cli.c
> +index 39dc02e..ef86cd2 100644
> +--- a/library/ssl_cli.c
> ++++ b/library/ssl_cli.c
> +@@ -133,7 +133,7 @@ static void ssl_write_renegotiation_ext( ssl_context *ssl,
> + 
> +     SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
> + 
> +-    if( end < p || (size_t)(end - p) < 5 + ssl->verify_data_len )
> ++    if( (size_t)(end - p) < 5 + ssl->verify_data_len )
> +     {
> +         SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
> +         return;
> diff --git a/debian/tests/build-test b/debian/tests/build-test
> new file mode 100755
> index 0000000..42b7127
> --- /dev/null
> +++ b/debian/tests/build-test
> @@ -0,0 +1,10 @@
> +#!/usr/bin/make -f
> +
> +CFLAGS	= -O2 -D_FILE_OFFSET_BITS=64 -Wall
> +LDFLAGS	+= -lpolarssl
> +
> +a.out: programs/hash/hello.c
> +	$(CC) $(CFLAGS) $(OFLAGS) $< $(LDFLAGS)
> +	@echo "Build test of $< succeeded"
> +	./a.out
> +	@rm -f a.out
> diff --git a/debian/tests/control b/debian/tests/control
> new file mode 100644
> index 0000000..9b777fd
> --- /dev/null
> +++ b/debian/tests/control
> @@ -0,0 +1,5 @@
> +Tests: smoke
> +Depends: libpolarssl-runtime
> +
> +Tests: build-test
> +Depends: libpolarssl-dev
> diff --git a/debian/tests/smoke b/debian/tests/smoke
> new file mode 100755
> index 0000000..03df087
> --- /dev/null
> +++ b/debian/tests/smoke
> @@ -0,0 +1,17 @@
> +#!/bin/sh
> +
> +set -e
> +
> +# Excercise some of the demos
> +polarssl_hello
> +polarssl_mpi_demo
> +
> +# Make sure output is identical to coreutil versions
> +[ "$(polarssl_sha1sum /etc/passwd)" = "$(sha1sum /etc/passwd)" ]
> +[ "$(polarssl_md5sum /etc/passwd)" = "$(md5sum /etc/passwd)" ]
> +
> +# Run the selftest
> +polarssl_selftest
> +
> +echo 'Smoke test of polarssl succesful'
> +exit 0


Reply to: