From 5090d046f2772b370046d791d19e3cb643148938 Mon Sep 17 00:00:00 2001 From: z00494563 Date: Fri, 29 Apr 2022 18:01:56 +0800 Subject: [PATCH] bugfix null pointer dereference for bn mod exp2 mont --- ...ter-dereference-for-BN_mod_exp2_mont.patch | 98 +++++++++++++++++++ openssl.spec | 6 +- 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 backport-Fix-NULL-pointer-dereference-for-BN_mod_exp2_mont.patch diff --git a/backport-Fix-NULL-pointer-dereference-for-BN_mod_exp2_mont.patch b/backport-Fix-NULL-pointer-dereference-for-BN_mod_exp2_mont.patch new file mode 100644 index 0000000..b6c7808 --- /dev/null +++ b/backport-Fix-NULL-pointer-dereference-for-BN_mod_exp2_mont.patch @@ -0,0 +1,98 @@ +From 8845aeb3ed528491b9eccba365182f90540e5b95 Mon Sep 17 00:00:00 2001 +From: Hugo Landau +Date: Tue, 1 Mar 2022 14:08:12 +0000 +Subject: [PATCH] Fix NULL pointer dereference for BN_mod_exp2_mont + +This fixes a bug whereby BN_mod_exp2_mont can dereference a NULL pointer +if BIGNUM argument m represents zero. + +Regression test added. Fixes #17648. Backport from master to 1.1. + +Reviewed-by: Matt Caswell +Reviewed-by: Todd Short +Reviewed-by: Tomas Mraz +(Merged from https://github.com/openssl/openssl/pull/17787) +--- + crypto/bn/bn_exp2.c | 2 +- + test/bntest.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 46 insertions(+), 1 deletion(-) + +diff --git a/crypto/bn/bn_exp2.c b/crypto/bn/bn_exp2.c +index e542abe..de3e249 100644 +--- a/crypto/bn/bn_exp2.c ++++ b/crypto/bn/bn_exp2.c +@@ -32,7 +32,7 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, + bn_check_top(p2); + bn_check_top(m); + +- if (!(m->d[0] & 1)) { ++ if (!BN_is_odd(m)) { + BNerr(BN_F_BN_MOD_EXP2_MONT, BN_R_CALLED_WITH_EVEN_MODULUS); + return 0; + } +diff --git a/test/bntest.c b/test/bntest.c +index bab34ba..390dd80 100644 +--- a/test/bntest.c ++++ b/test/bntest.c +@@ -2798,6 +2798,50 @@ static int test_mod_exp_consttime(int i) + return res; + } + ++/* ++ * Regression test to ensure BN_mod_exp2_mont fails safely if argument m is ++ * zero. ++ */ ++static int test_mod_exp2_mont(void) ++{ ++ int res = 0; ++ BIGNUM *exp_result = NULL; ++ BIGNUM *exp_a1 = NULL, *exp_p1 = NULL, *exp_a2 = NULL, *exp_p2 = NULL, ++ *exp_m = NULL; ++ ++ if (!TEST_ptr(exp_result = BN_new()) ++ || !TEST_ptr(exp_a1 = BN_new()) ++ || !TEST_ptr(exp_p1 = BN_new()) ++ || !TEST_ptr(exp_a2 = BN_new()) ++ || !TEST_ptr(exp_p2 = BN_new()) ++ || !TEST_ptr(exp_m = BN_new())) ++ goto err; ++ ++ if (!TEST_true(BN_one(exp_a1)) ++ || !TEST_true(BN_one(exp_p1)) ++ || !TEST_true(BN_one(exp_a2)) ++ || !TEST_true(BN_one(exp_p2))) ++ goto err; ++ ++ BN_zero(exp_m); ++ ++ /* input of 0 is even, so must fail */ ++ if (!TEST_int_eq(BN_mod_exp2_mont(exp_result, exp_a1, exp_p1, exp_a2, ++ exp_p2, exp_m, ctx, NULL), 0)) ++ goto err; ++ ++ res = 1; ++ ++err: ++ BN_free(exp_result); ++ BN_free(exp_a1); ++ BN_free(exp_p1); ++ BN_free(exp_a2); ++ BN_free(exp_p2); ++ BN_free(exp_m); ++ return res; ++} ++ + static int file_test_run(STANZA *s) + { + static const FILETEST filetests[] = { +@@ -2906,6 +2950,7 @@ int setup_tests(void) + ADD_TEST(test_gcd_prime); + ADD_ALL_TESTS(test_mod_exp, (int)OSSL_NELEM(ModExpTests)); + ADD_ALL_TESTS(test_mod_exp_consttime, (int)OSSL_NELEM(ModExpTests)); ++ ADD_TEST(test_mod_exp2_mont); + } else { + ADD_ALL_TESTS(run_file_tests, n); + } +-- +1.8.3.1 + diff --git a/openssl.spec b/openssl.spec index 0866deb..c730fe5 100644 --- a/openssl.spec +++ b/openssl.spec @@ -2,7 +2,7 @@ Name: openssl Epoch: 1 Version: 1.1.1m -Release: 3 +Release: 4 Summary: Cryptography and SSL/TLS Toolkit License: OpenSSL and SSLeay URL: https://www.openssl.org/ @@ -12,6 +12,7 @@ Patch1: openssl-1.1.1-build.patch Patch2: openssl-1.1.1-fips.patch Patch3: CVE-2022-0778-Add-a-negative-testcase-for-BN_mod_sqrt.patch Patch4: CVE-2022-0778-Fix-possible-infinite-loop-in-BN_mod_sqrt.patch +Patch5: backport-Fix-NULL-pointer-dereference-for-BN_mod_exp2_mont.patch BuildRequires: gcc perl make lksctp-tools-devel coreutils util-linux zlib-devel Requires: coreutils %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release} @@ -208,6 +209,9 @@ make test || : %ldconfig_scriptlets libs %changelog +* Fri Apr 29 2022 zhujianwei - 1:1.1.1m-4 +- bugfix null pointer dereference for bn mod exp2 mont + * Mon Mar 21 2022 wangyu - 1:1.1.1m-3 - fix the cve-2022-0778 -- Gitee