Properly check EVP_VerifyFinal() and similar return values
(CVE-2008-5077). Submitted by: Ben Laurie, Bodo Moeller, Google Security Team
This commit is contained in:
		
							
								
								
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							@@ -4,6 +4,10 @@
 | 
			
		||||
 | 
			
		||||
 Changes between 0.9.8i and 0.9.8j  [xx XXX xxxx]
 | 
			
		||||
 | 
			
		||||
  *) Properly check EVP_VerifyFinal() and similar return values
 | 
			
		||||
     (CVE-2008-5077).
 | 
			
		||||
     [Ben Laurie, Bodo Moeller, Google Security Team]
 | 
			
		||||
 | 
			
		||||
  *) Enable TLS extensions by default.
 | 
			
		||||
     [Ben Laurie]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2132,7 +2132,7 @@ int MAIN(int argc, char **argv)
 | 
			
		||||
				{
 | 
			
		||||
				ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
 | 
			
		||||
					rsa_num, rsa_key[j]);
 | 
			
		||||
				if (ret == 0)
 | 
			
		||||
				if (ret <= 0)
 | 
			
		||||
					{
 | 
			
		||||
					BIO_printf(bio_err,
 | 
			
		||||
						"RSA verify failure\n");
 | 
			
		||||
 
 | 
			
		||||
@@ -285,7 +285,7 @@ bad:
 | 
			
		||||
	pkey = NETSCAPE_SPKI_get_pubkey(spki);
 | 
			
		||||
	if(verify) {
 | 
			
		||||
		i = NETSCAPE_SPKI_verify(spki, pkey);
 | 
			
		||||
		if(i) BIO_printf(bio_err, "Signature OK\n");
 | 
			
		||||
		if (i > 0) BIO_printf(bio_err, "Signature OK\n");
 | 
			
		||||
		else {
 | 
			
		||||
			BIO_printf(bio_err, "Signature Failure\n");
 | 
			
		||||
			ERR_print_errors(bio_err);
 | 
			
		||||
 
 | 
			
		||||
@@ -266,7 +266,7 @@ static int check(X509_STORE *ctx, char *file, STACK_OF(X509) *uchain, STACK_OF(X
 | 
			
		||||
 | 
			
		||||
	ret=0;
 | 
			
		||||
end:
 | 
			
		||||
	if (i)
 | 
			
		||||
	if (i > 0)
 | 
			
		||||
		{
 | 
			
		||||
		fprintf(stdout,"OK\n");
 | 
			
		||||
		ret=1;
 | 
			
		||||
@@ -367,4 +367,3 @@ static int MS_CALLBACK cb(int ok, X509_STORE_CTX *ctx)
 | 
			
		||||
		ERR_clear_error();
 | 
			
		||||
	return(ok);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1151,7 +1151,7 @@ static int x509_certify(X509_STORE *ctx, char *CAfile, const EVP_MD *digest,
 | 
			
		||||
	/* NOTE: this certificate can/should be self signed, unless it was
 | 
			
		||||
	 * a certificate request in which case it is not. */
 | 
			
		||||
	X509_STORE_CTX_set_cert(&xsc,x);
 | 
			
		||||
	if (!reqfile && !X509_verify_cert(&xsc))
 | 
			
		||||
	if (!reqfile && X509_verify_cert(&xsc) <= 0)
 | 
			
		||||
		goto end;
 | 
			
		||||
 | 
			
		||||
	if (!X509_check_private_key(xca,pkey))
 | 
			
		||||
 
 | 
			
		||||
@@ -830,7 +830,7 @@ int CMS_SignerInfo_verify(CMS_SignerInfo *si)
 | 
			
		||||
	cms_fixup_mctx(&mctx, si->pkey);
 | 
			
		||||
	r = EVP_VerifyFinal(&mctx,
 | 
			
		||||
			si->signature->data, si->signature->length, si->pkey);
 | 
			
		||||
	if (!r)
 | 
			
		||||
	if (r <= 0)
 | 
			
		||||
		CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE);
 | 
			
		||||
	err:
 | 
			
		||||
	EVP_MD_CTX_cleanup(&mctx);
 | 
			
		||||
 
 | 
			
		||||
@@ -1044,7 +1044,7 @@ int ssl2_set_certificate(SSL *s, int type, int len, const unsigned char *data)
 | 
			
		||||
 | 
			
		||||
	i=ssl_verify_cert_chain(s,sk);
 | 
			
		||||
		
 | 
			
		||||
	if ((s->verify_mode != SSL_VERIFY_NONE) && (!i))
 | 
			
		||||
	if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0))
 | 
			
		||||
		{
 | 
			
		||||
		SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
 | 
			
		||||
		goto err;
 | 
			
		||||
 
 | 
			
		||||
@@ -1054,7 +1054,7 @@ static int request_certificate(SSL *s)
 | 
			
		||||
 | 
			
		||||
	i=ssl_verify_cert_chain(s,sk);
 | 
			
		||||
 | 
			
		||||
	if (i)	/* we like the packet, now check the chksum */
 | 
			
		||||
	if (i > 0)	/* we like the packet, now check the chksum */
 | 
			
		||||
		{
 | 
			
		||||
		EVP_MD_CTX ctx;
 | 
			
		||||
		EVP_PKEY *pkey=NULL;
 | 
			
		||||
@@ -1083,7 +1083,7 @@ static int request_certificate(SSL *s)
 | 
			
		||||
		EVP_PKEY_free(pkey);
 | 
			
		||||
		EVP_MD_CTX_cleanup(&ctx);
 | 
			
		||||
 | 
			
		||||
		if (i) 
 | 
			
		||||
		if (i > 0)
 | 
			
		||||
			{
 | 
			
		||||
			if (s->session->peer != NULL)
 | 
			
		||||
				X509_free(s->session->peer);
 | 
			
		||||
 
 | 
			
		||||
@@ -972,7 +972,7 @@ int ssl3_get_server_certificate(SSL *s)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	i=ssl_verify_cert_chain(s,sk);
 | 
			
		||||
	if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
 | 
			
		||||
	if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
 | 
			
		||||
#ifndef OPENSSL_NO_KRB5
 | 
			
		||||
	        && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK))
 | 
			
		||||
	        != (SSL_aKRB5|SSL_kKRB5)
 | 
			
		||||
@@ -1459,7 +1459,7 @@ int ssl3_get_key_exchange(SSL *s)
 | 
			
		||||
			EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
 | 
			
		||||
			EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
 | 
			
		||||
			EVP_VerifyUpdate(&md_ctx,param,param_len);
 | 
			
		||||
			if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
 | 
			
		||||
			if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
 | 
			
		||||
				{
 | 
			
		||||
				/* bad signature */
 | 
			
		||||
				al=SSL_AD_DECRYPT_ERROR;
 | 
			
		||||
@@ -1477,7 +1477,7 @@ int ssl3_get_key_exchange(SSL *s)
 | 
			
		||||
			EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
 | 
			
		||||
			EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
 | 
			
		||||
			EVP_VerifyUpdate(&md_ctx,param,param_len);
 | 
			
		||||
			if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
 | 
			
		||||
			if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
 | 
			
		||||
				{
 | 
			
		||||
				/* bad signature */
 | 
			
		||||
				al=SSL_AD_DECRYPT_ERROR;
 | 
			
		||||
 
 | 
			
		||||
@@ -2566,7 +2566,7 @@ int ssl3_get_client_certificate(SSL *s)
 | 
			
		||||
	else
 | 
			
		||||
		{
 | 
			
		||||
		i=ssl_verify_cert_chain(s,sk);
 | 
			
		||||
		if (!i)
 | 
			
		||||
		if (i <= 0)
 | 
			
		||||
			{
 | 
			
		||||
			al=ssl_verify_alarm_type(s->verify_result);
 | 
			
		||||
			SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
 | 
			
		||||
 
 | 
			
		||||
@@ -2093,7 +2093,7 @@ static int MS_CALLBACK app_verify_callback(X509_STORE_CTX *ctx, void *arg)
 | 
			
		||||
 | 
			
		||||
	if (cb_arg->proxy_auth)
 | 
			
		||||
		{
 | 
			
		||||
		if (ok)
 | 
			
		||||
		if (ok > 0)
 | 
			
		||||
			{
 | 
			
		||||
			const char *cond_end = NULL;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user