Blame SOURCES/0108-CVE-2023-0401-pkcs7-md.patch

1ac26c
From d3b6dfd70db844c4499bec6ad6601623a565e674 Mon Sep 17 00:00:00 2001
1ac26c
From: Tomas Mraz <tomas@openssl.org>
1ac26c
Date: Wed, 18 Jan 2023 09:27:53 +0100
1ac26c
Subject: [PATCH 15/18] pk7_doit.c: Check return of BIO_set_md() calls
1ac26c
1ac26c
These calls invoke EVP_DigestInit() which can fail for digests
1ac26c
with implicit fetches. Subsequent EVP_DigestUpdate() from BIO_write()
1ac26c
or EVP_DigestFinal() from BIO_read() will segfault on NULL
1ac26c
dereference. This can be triggered by an attacker providing
1ac26c
PKCS7 data digested with MD4 for example if the legacy provider
1ac26c
is not loaded.
1ac26c
1ac26c
If BIO_set_md() fails the md BIO cannot be used.
1ac26c
1ac26c
CVE-2023-0401
1ac26c
1ac26c
Reviewed-by: Paul Dale <pauli@openssl.org>
1ac26c
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
1ac26c
---
1ac26c
 crypto/pkcs7/pk7_doit.c | 12 ++++++++++--
1ac26c
 1 file changed, 10 insertions(+), 2 deletions(-)
1ac26c
1ac26c
diff --git a/crypto/pkcs7/pk7_doit.c b/crypto/pkcs7/pk7_doit.c
1ac26c
index bde9ac4787..5e562fbea5 100644
1ac26c
--- a/crypto/pkcs7/pk7_doit.c
1ac26c
+++ b/crypto/pkcs7/pk7_doit.c
1ac26c
@@ -84,7 +84,11 @@ static int pkcs7_bio_add_digest(BIO **pbio, X509_ALGOR *alg,
1ac26c
     }
1ac26c
     (void)ERR_pop_to_mark();
1ac26c
 
1ac26c
-    BIO_set_md(btmp, md);
1ac26c
+    if (BIO_set_md(btmp, md) <= 0) {
1ac26c
+        ERR_raise(ERR_LIB_PKCS7, ERR_R_BIO_LIB);
1ac26c
+        EVP_MD_free(fetched);
1ac26c
+        goto err;
1ac26c
+    }
1ac26c
     EVP_MD_free(fetched);
1ac26c
     if (*pbio == NULL)
1ac26c
         *pbio = btmp;
1ac26c
@@ -522,7 +526,11 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
1ac26c
             }
1ac26c
             (void)ERR_pop_to_mark();
1ac26c
 
1ac26c
-            BIO_set_md(btmp, md);
1ac26c
+            if (BIO_set_md(btmp, md) <= 0) {
1ac26c
+                EVP_MD_free(evp_md);
1ac26c
+                ERR_raise(ERR_LIB_PKCS7, ERR_R_BIO_LIB);
1ac26c
+                goto err;
1ac26c
+            }
1ac26c
             EVP_MD_free(evp_md);
1ac26c
             if (out == NULL)
1ac26c
                 out = btmp;
1ac26c
-- 
1ac26c
2.39.1
1ac26c
1ac26c
From a0f2359613f50b5ca6b74b78bf4b54d7dc925fd2 Mon Sep 17 00:00:00 2001
1ac26c
From: Tomas Mraz <tomas@openssl.org>
1ac26c
Date: Wed, 18 Jan 2023 17:07:24 +0100
1ac26c
Subject: [PATCH 16/18] Add testcase for missing return check of BIO_set_md()
1ac26c
 calls
1ac26c
1ac26c
Reviewed-by: Paul Dale <pauli@openssl.org>
1ac26c
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
1ac26c
---
1ac26c
 test/recipes/80-test_cms.t                  | 15 ++++++++--
1ac26c
 test/recipes/80-test_cms_data/pkcs7-md4.pem | 32 +++++++++++++++++++++
1ac26c
 2 files changed, 45 insertions(+), 2 deletions(-)
1ac26c
 create mode 100644 test/recipes/80-test_cms_data/pkcs7-md4.pem
1ac26c
1ac26c
diff --git a/test/recipes/80-test_cms.t b/test/recipes/80-test_cms.t
1ac26c
index fd53683e6b..d45789de70 100644
1ac26c
--- a/test/recipes/80-test_cms.t
1ac26c
+++ b/test/recipes/80-test_cms.t
1ac26c
@@ -13,7 +13,7 @@ use warnings;
1ac26c
 use POSIX;
1ac26c
 use File::Spec::Functions qw/catfile/;
1ac26c
 use File::Compare qw/compare_text compare/;
1ac26c
-use OpenSSL::Test qw/:DEFAULT srctop_dir srctop_file bldtop_dir bldtop_file with/;
1ac26c
+use OpenSSL::Test qw/:DEFAULT srctop_dir srctop_file bldtop_dir bldtop_file with data_file/;
1ac26c
 
1ac26c
 use OpenSSL::Test::Utils;
1ac26c
 
1ac26c
@@ -50,7 +50,7 @@ my ($no_des, $no_dh, $no_dsa, $no_ec, $no_ec2m, $no_rc2, $no_zlib)
1ac26c
 
1ac26c
 $no_rc2 = 1 if disabled("legacy");
1ac26c
 
1ac26c
-plan tests => 13;
1ac26c
+plan tests => 14;
1ac26c
 
1ac26c
 ok(run(test(["pkcs7_test"])), "test pkcs7");
1ac26c
 
1ac26c
@@ -941,6 +941,17 @@ subtest "CMS binary input tests\n" => sub {
1ac26c
        "verify binary input with -binary missing -crlfeol");
1ac26c
 };
1ac26c
 
1ac26c
+# Test case for missing MD algorithm (must not segfault)
1ac26c
+
1ac26c
+with({ exit_checker => sub { return shift == 4; } },
1ac26c
+    sub {
1ac26c
+        ok(run(app(['openssl', 'smime', '-verify', '-noverify',
1ac26c
+                    '-inform', 'PEM',
1ac26c
+                    '-in', data_file("pkcs7-md4.pem"),
1ac26c
+                   ])),
1ac26c
+            "Check failure of EVP_DigestInit is handled correctly");
1ac26c
+    });
1ac26c
+
1ac26c
 sub check_availability {
1ac26c
     my $tnam = shift;
1ac26c
 
1ac26c
diff --git a/test/recipes/80-test_cms_data/pkcs7-md4.pem b/test/recipes/80-test_cms_data/pkcs7-md4.pem
1ac26c
new file mode 100644
1ac26c
index 0000000000..ecff611deb
1ac26c
--- /dev/null
1ac26c
+++ b/test/recipes/80-test_cms_data/pkcs7-md4.pem
1ac26c
@@ -0,0 +1,32 @@
1ac26c
+-----BEGIN PKCS7-----
1ac26c
+MIIFhAYJKoZIhvcNAQcCoIIFdTCCBXECAQExDjAMBggqhkiG9w0CBAUAMB0GCSqG
1ac26c
+SIb3DQEHAaAQBA5UZXN0IGNvbnRlbnQNCqCCAyQwggMgMIICCKADAgECAgECMA0G
1ac26c
+CSqGSIb3DQEBCwUAMA0xCzAJBgNVBAMMAkNBMCAXDTE2MDExNTA4MTk0OVoYDzIx
1ac26c
+MTYwMTE2MDgxOTQ5WjAZMRcwFQYDVQQDDA5zZXJ2ZXIuZXhhbXBsZTCCASIwDQYJ
1ac26c
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKj/iVhhha7e2ywP1XP74reoG3p1YCvU
1ac26c
+fTxzdrWu3pMvfySQbckc9Io4zZ+igBZWy7Qsu5PlFx//DcZD/jE0+CjYdemju4iC
1ac26c
+76Ny4lNiBUVN4DGX76qdENJYDZ4GnjK7GwhWXWUPP2aOwjagEf/AWTX9SRzdHEIz
1ac26c
+BniuBDgj5ed1Z9OUrVqpQB+sWRD1DMFkrUrExjVTs5ZqghsVi9GZq+Seb5Sq0pbl
1ac26c
+V/uMkWSKPCQWxtIZvoJgEztisO0+HbPK+WvfMbl6nktHaKcpxz9K4iIntO+QY9fv
1ac26c
+0HJJPlutuRvUK2+GaN3VcxK4Q8ncQQ+io0ZPi2eIhA9h/nk0H0qJH7cCAwEAAaN9
1ac26c
+MHswHQYDVR0OBBYEFOeb4iqtimw6y3ZR5Y4HmCKX4XOiMB8GA1UdIwQYMBaAFLQR
1ac26c
+M/HX4l73U54gIhBPhga/H8leMAkGA1UdEwQCMAAwEwYDVR0lBAwwCgYIKwYBBQUH
1ac26c
+AwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4YW1wbGUwDQYJKoZIhvcNAQELBQADggEB
1ac26c
+AEG0PE9hQuXlvtUULv9TQ2BXy9MmTjOk+dQwxDhAXYBYMUB6TygsqvPXwpDwz8MS
1ac26c
+EPGCRqh5cQwtPoElQRU1i4URgcQMZquXScwNFcvE6AATF/PdN/+mOwtqFrlpYfs3
1ac26c
+IJIpYL6ViQg4n8pv+b/pCwMmhewQLwCGs9+omHNTOwKjEiVoNaprAfj5Lxt15fS2
1ac26c
++zZW0mT9Y4kfEypetrqSAjh8CDK+vaQhkeKdDfJyBfjS4ALfxvCkT3mQnsWFJ9CU
1ac26c
+TVG3uw6ylSPT3wN3RE0Ofa4rI5PESogQsd/DgBc7dcDO3yoPKGjycR3/GJDqqCxC
1ac26c
+e9dr6FJEnDjaDf9zNWyTFHExggITMIICDwIBATASMA0xCzAJBgNVBAMMAkNBAgEC
1ac26c
+MAwGCCqGSIb3DQIEBQCggdQwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq
1ac26c
+hkiG9w0BCQUxDxcNMjMwMTE4MTU0NzExWjAfBgkqhkiG9w0BCQQxEgQQRXO4TKpp
1ac26c
+RgA4XHb8bD1pczB5BgkqhkiG9w0BCQ8xbDBqMAsGCWCGSAFlAwQBKjALBglghkgB
1ac26c
+ZQMEARYwCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMA4GCCqGSIb3DQMCAgIAgDAN
1ac26c
+BggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggqhkiG9w0DAgIBKDANBgkqhkiG9w0B
1ac26c
+AQEFAASCAQAe+xlm/TGg/s/7b0xBc3FFnmmUDEe7ljkehIx61OnBV9ZWA+LcBX/7
1ac26c
+kmMSMdaHjRq4w8FmwBMLzn0ttXVqf0QuPbBF/E6X5EqK9lpOdkUQhNiN2v+ZfY6c
1ac26c
+lrH4ADsSD9D+UHw0sxo5KEF+PPuneUfYCJZosFUJosBbuSEXK0C9yfJoDKVE8Syp
1ac26c
+0vdqh73ogLeNgZLAUGSSB66OmHDxwgAj4qPAv6FHFBy1Xs4uFZER5vniYrH9OrAk
1ac26c
+Z6XdvzDoYZC4XcGMDtcOpOM6D4owqy5svHPDw8wIlM4GVhrTw7CQmuBz5uRNnf6a
1ac26c
+ZK3jZIxG1hr/INaNWheHoPIhPblYaVc6
1ac26c
+-----END PKCS7-----
1ac26c
-- 
1ac26c
2.39.1
1ac26c