Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-15-SP1:Update
openssl-1_1.29867
openssl-CVE-2021-23840.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File openssl-CVE-2021-23840.patch of Package openssl-1_1.29867
From 6a51b9e1d0cf0bf8515f7201b68fb0a3482b3dc1 Mon Sep 17 00:00:00 2001 From: Matt Caswell <matt@openssl.org> Date: Tue, 2 Feb 2021 17:17:23 +0000 Subject: [PATCH] Don't overflow the output length in EVP_CipherUpdate calls CVE-2021-23840 Reviewed-by: Paul Dale <pauli@openssl.org> --- crypto/err/openssl.txt | 3 ++- crypto/evp/evp_enc.c | 27 +++++++++++++++++++++++++++ crypto/evp/evp_err.c | 4 +++- include/openssl/evperr.h | 7 +++---- 4 files changed, 35 insertions(+), 6 deletions(-) Index: openssl-1.1.0i/crypto/evp/evp_enc.c =================================================================== --- openssl-1.1.0i.orig/crypto/evp/evp_enc.c +++ openssl-1.1.0i/crypto/evp/evp_enc.c @@ -8,6 +8,7 @@ */ #include <stdio.h> +#include <limits.h> #include <assert.h> #include "internal/cryptlib.h" #include <openssl/evp.h> @@ -379,6 +380,19 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ct return 1; } else { j = bl - i; + + /* + * Once we've processed the first j bytes from in, the amount of + * data left that is a multiple of the block length is: + * (inl - j) & ~(bl - 1) + * We must ensure that this amount of data, plus the one block that + * we process from ctx->buf does not exceed INT_MAX + */ + if (((inl - j) & ~(bl - 1)) > INT_MAX - bl) { + EVPerr(EVP_F_EVP_ENCRYPTUPDATE, + EVP_R_OUTPUT_WOULD_OVERFLOW); + return 0; + } memcpy(&(ctx->buf[i]), in, j); inl -= j; in += j; @@ -495,6 +509,19 @@ int EVP_DecryptUpdate(EVP_CIPHER_CTX *ct EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING); return 0; } + /* + * final_used is only ever set if buf_len is 0. Therefore the maximum + * length output we will ever see from evp_EncryptDecryptUpdate is + * the maximum multiple of the block length that is <= inl, or just: + * inl & ~(b - 1) + * Since final_used has been set then the final output length is: + * (inl & ~(b - 1)) + b + * This must never exceed INT_MAX + */ + if ((inl & ~(b - 1)) > INT_MAX - b) { + EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_OUTPUT_WOULD_OVERFLOW); + return 0; + } memcpy(out, ctx->final, b); out += b; fix_len = 1; Index: openssl-1.1.0i/crypto/evp/evp_err.c =================================================================== --- openssl-1.1.0i.orig/crypto/evp/evp_err.c +++ openssl-1.1.0i/crypto/evp/evp_err.c @@ -150,6 +151,7 @@ static ERR_STRING_DATA EVP_str_reasons[] {ERR_REASON(EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE), "operation not supported for this keytype"}, {ERR_REASON(EVP_R_OPERATON_NOT_INITIALIZED), "operaton not initialized"}, + {ERR_REASON(EVP_R_OUTPUT_WOULD_OVERFLOW), "output would overflow"}, {ERR_REASON(EVP_R_PARAMETER_TOO_LARGE), "parameter too large"}, {ERR_REASON(EVP_R_PARTIALLY_OVERLAPPING), "partially overlapping buffers"}, Index: openssl-1.1.0i/include/openssl/evp.h =================================================================== --- openssl-1.1.0i.orig/include/openssl/evp.h +++ openssl-1.1.0i/include/openssl/evp.h @@ -1579,6 +1580,7 @@ int ERR_load_EVP_strings(void); # define EVP_R_NO_OPERATION_SET 149 # define EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE 150 # define EVP_R_OPERATON_NOT_INITIALIZED 151 +# define EVP_R_OUTPUT_WOULD_OVERFLOW 184 # define EVP_R_PARAMETER_TOO_LARGE 187 # define EVP_R_PARTIALLY_OVERLAPPING 162 # define EVP_R_PBKDF2_ERROR 176
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor