mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-11-03 20:22:59 -05:00 
			
		
		
		
	Fix memory leak while parsing some X.509 certs
This commit is contained in:
		
							parent
							
								
									64938c63f0
								
							
						
					
					
						commit
						5d8618539f
					
				@ -4,6 +4,9 @@ PolarSSL ChangeLog (Sorted per branch, date)
 | 
				
			|||||||
Security
 | 
					Security
 | 
				
			||||||
   * Lowest common hash was selected from signature_algorithms extension in
 | 
					   * Lowest common hash was selected from signature_algorithms extension in
 | 
				
			||||||
     TLS 1.2 (found by Darren Bane) (introduced in 1.3.8).
 | 
					     TLS 1.2 (found by Darren Bane) (introduced in 1.3.8).
 | 
				
			||||||
 | 
					   * Remotely-triggerable memory leak when parsing some X.509 certificates
 | 
				
			||||||
 | 
					     (server is not affected if it doesn't ask for a client certificate).
 | 
				
			||||||
 | 
					     (Found using Codenomicon Defensics.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bugfix
 | 
					Bugfix
 | 
				
			||||||
   * Support escaping of commas in x509_string_to_names()
 | 
					   * Support escaping of commas in x509_string_to_names()
 | 
				
			||||||
@ -36,6 +39,8 @@ Changes
 | 
				
			|||||||
   * POLARSSL_MPI_MAX_SIZE now defaults to 1024 in order to allow 8192 bits
 | 
					   * POLARSSL_MPI_MAX_SIZE now defaults to 1024 in order to allow 8192 bits
 | 
				
			||||||
     RSA keys.
 | 
					     RSA keys.
 | 
				
			||||||
   * Accept spaces at end of line or end of buffer in base64_decode().
 | 
					   * Accept spaces at end of line or end of buffer in base64_decode().
 | 
				
			||||||
 | 
					   * X.509 certificates with more than one AttributeTypeAndValue per
 | 
				
			||||||
 | 
					     RelativeDistinguishedName are not accepted any more.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
= PolarSSL 1.3.8 released 2014-07-11
 | 
					= PolarSSL 1.3.8 released 2014-07-11
 | 
				
			||||||
Security
 | 
					Security
 | 
				
			||||||
 | 
				
			|||||||
@ -409,58 +409,47 @@ static int x509_get_attr_type_value( unsigned char **p,
 | 
				
			|||||||
 *  AttributeType ::= OBJECT IDENTIFIER
 | 
					 *  AttributeType ::= OBJECT IDENTIFIER
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *  AttributeValue ::= ANY DEFINED BY AttributeType
 | 
					 *  AttributeValue ::= ANY DEFINED BY AttributeType
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  We restrict RelativeDistinguishedName to be a set of 1 element. This is
 | 
				
			||||||
 | 
					 *  the most common case, and our x509_name structure currently can't handle
 | 
				
			||||||
 | 
					 *  more than that.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int x509_get_name( unsigned char **p, const unsigned char *end,
 | 
					int x509_get_name( unsigned char **p, const unsigned char *end,
 | 
				
			||||||
                   x509_name *cur )
 | 
					                   x509_name *cur )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
    size_t len;
 | 
					    size_t set_len;
 | 
				
			||||||
    const unsigned char *end2;
 | 
					    const unsigned char *end_set;
 | 
				
			||||||
    x509_name *use;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if( ( ret = asn1_get_tag( p, end, &len,
 | 
					    /*
 | 
				
			||||||
 | 
					     * parse first SET, restricted to 1 element
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    if( ( ret = asn1_get_tag( p, end, &set_len,
 | 
				
			||||||
            ASN1_CONSTRUCTED | ASN1_SET ) ) != 0 )
 | 
					            ASN1_CONSTRUCTED | ASN1_SET ) ) != 0 )
 | 
				
			||||||
        return( POLARSSL_ERR_X509_INVALID_NAME + ret );
 | 
					        return( POLARSSL_ERR_X509_INVALID_NAME + ret );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    end2 = end;
 | 
					    end_set  = *p + set_len;
 | 
				
			||||||
    end  = *p + len;
 | 
					 | 
				
			||||||
    use = cur;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    do
 | 
					    if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 )
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if( ( ret = x509_get_attr_type_value( p, end, use ) ) != 0 )
 | 
					 | 
				
			||||||
        return( ret );
 | 
					        return( ret );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if( *p != end )
 | 
					    if( *p != end_set )
 | 
				
			||||||
        {
 | 
					        return( POLARSSL_ERR_X509_FEATURE_UNAVAILABLE );
 | 
				
			||||||
            use->next = (x509_name *) polarssl_malloc(
 | 
					 | 
				
			||||||
                    sizeof( x509_name ) );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if( use->next == NULL )
 | 
					 | 
				
			||||||
                return( POLARSSL_ERR_X509_MALLOC_FAILED );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            memset( use->next, 0, sizeof( x509_name ) );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            use = use->next;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    while( *p != end );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * recurse until end of SEQUENCE is reached
 | 
					     * recurse until end of SEQUENCE is reached
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    if( *p == end2 )
 | 
					    if( *p == end )
 | 
				
			||||||
        return( 0 );
 | 
					        return( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cur->next = (x509_name *) polarssl_malloc(
 | 
					    cur->next = (x509_name *) polarssl_malloc( sizeof( x509_name ) );
 | 
				
			||||||
         sizeof( x509_name ) );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if( cur->next == NULL )
 | 
					    if( cur->next == NULL )
 | 
				
			||||||
        return( POLARSSL_ERR_X509_MALLOC_FAILED );
 | 
					        return( POLARSSL_ERR_X509_MALLOC_FAILED );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memset( cur->next, 0, sizeof( x509_name ) );
 | 
					    memset( cur->next, 0, sizeof( x509_name ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return( x509_get_name( p, end2, cur->next ) );
 | 
					    return( x509_get_name( p, end, cur->next ) );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 | 
				
			|||||||
@ -750,7 +750,7 @@ X509 Certificate ASN1 (TBSCertificate, issuer, no string data)
 | 
				
			|||||||
x509parse_crt:"30253023a0030201028204deadbeef300d06092a864886f70d0101020500300731053003060013":"":POLARSSL_ERR_X509_INVALID_NAME + POLARSSL_ERR_ASN1_OUT_OF_DATA
 | 
					x509parse_crt:"30253023a0030201028204deadbeef300d06092a864886f70d0101020500300731053003060013":"":POLARSSL_ERR_X509_INVALID_NAME + POLARSSL_ERR_ASN1_OUT_OF_DATA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
X509 Certificate ASN1 (TBSCertificate, issuer, no full following string)
 | 
					X509 Certificate ASN1 (TBSCertificate, issuer, no full following string)
 | 
				
			||||||
x509parse_crt:"302b3029a0030201028204deadbeef300d06092a864886f70d0101020500300d310b3009060013045465737400":"":POLARSSL_ERR_X509_INVALID_NAME + POLARSSL_ERR_ASN1_UNEXPECTED_TAG
 | 
					x509parse_crt:"302b3029a0030201028204deadbeef300d06092a864886f70d0101020500300d310b3009060013045465737400":"":POLARSSL_ERR_X509_FEATURE_UNAVAILABLE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
X509 Certificate ASN1 (TBSCertificate, valid issuer, no validity)
 | 
					X509 Certificate ASN1 (TBSCertificate, valid issuer, no validity)
 | 
				
			||||||
x509parse_crt:"302a3028a0030201028204deadbeef300d06092a864886f70d0101020500300c310a30080600130454657374":"":POLARSSL_ERR_X509_INVALID_DATE + POLARSSL_ERR_ASN1_OUT_OF_DATA
 | 
					x509parse_crt:"302a3028a0030201028204deadbeef300d06092a864886f70d0101020500300c310a30080600130454657374":"":POLARSSL_ERR_X509_INVALID_DATE + POLARSSL_ERR_ASN1_OUT_OF_DATA
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user