The branch master has been updated via 27f7f527652e403177335eb2e3ba1ff6df13f193 (commit) via ad2fcee1632d3f21a37e8e108d4c0dcf9099686d (commit) from dd2fcc1f7c44c5fb5aa2d33aecdc699c7018ce01 (commit)
- Log ----------------------------------------------------------------- commit 27f7f527652e403177335eb2e3ba1ff6df13f193 Author: Pauli <pa...@openssl.org> Date: Tue Dec 14 11:08:00 2021 +1100 Add test case to verify that the use after free issue is fixed. Test case based on reproducer by Guido Vranken. Reviewed-by: Tomas Mraz <to...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/17263) commit ad2fcee1632d3f21a37e8e108d4c0dcf9099686d Author: Pauli <pa...@openssl.org> Date: Mon Dec 13 12:16:18 2021 +1100 evp: address a use after free state when using HMAC and MD copy. Fixes #17261 Reviewed-by: Tomas Mraz <to...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/17263) ----------------------------------------------------------------------- Summary of changes: crypto/evp/digest.c | 3 ++- test/hmactest.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c index 7ebb2e3235..322cfe7646 100644 --- a/crypto/evp/digest.c +++ b/crypto/evp/digest.c @@ -521,7 +521,7 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) if (out->fetched_digest != NULL) EVP_MD_free(out->fetched_digest); *out = *in; - return 1; + goto clone_pkey; } if (in->digest->prov == NULL @@ -552,6 +552,7 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) } } + clone_pkey: /* copied EVP_MD_CTX should free the copied EVP_PKEY_CTX */ EVP_MD_CTX_clear_flags(out, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX); #ifndef FIPS_MODULE diff --git a/test/hmactest.c b/test/hmactest.c index 63954a1183..8f5bf32f87 100644 --- a/test/hmactest.c +++ b/test/hmactest.c @@ -245,6 +245,36 @@ err: return ret; } +static int test_hmac_copy_uninited(void) +{ + const unsigned char key[24] = {0}; + const unsigned char ct[166] = {0}; + EVP_PKEY *pkey = NULL; + EVP_MD_CTX *ctx = NULL; + EVP_MD_CTX *ctx_tmp = NULL; + int res = 0; + + if (!TEST_ptr(ctx = EVP_MD_CTX_new()) + || !TEST_ptr(pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, + key, sizeof(key))) + || !TEST_true(EVP_DigestSignInit(ctx, NULL, EVP_sha1(), NULL, pkey)) + || !TEST_ptr(ctx_tmp = EVP_MD_CTX_new()) + || !TEST_true(EVP_MD_CTX_copy(ctx_tmp, ctx))) + goto err; + EVP_MD_CTX_free(ctx); + ctx = ctx_tmp; + ctx_tmp = NULL; + + if (!TEST_true(EVP_DigestSignUpdate(ctx, ct, sizeof(ct)))) + goto err; + res = 1; + err: + EVP_MD_CTX_free(ctx); + EVP_MD_CTX_free(ctx_tmp); + EVP_PKEY_free(pkey); + return res; +} + # ifndef OPENSSL_NO_MD5 static char *pt(unsigned char *md, unsigned int len) { @@ -266,6 +296,7 @@ int setup_tests(void) ADD_TEST(test_hmac_bad); ADD_TEST(test_hmac_run); ADD_TEST(test_hmac_copy); + ADD_TEST(test_hmac_copy_uninited); return 1; }