0620c0c33d
- Update to 3.0.8: * Fixed NULL dereference during PKCS7 data verification. A NULL pointer can be dereferenced when signatures are being verified on PKCS7 signed or signedAndEnveloped data. In case the hash algorithm used for the signature is known to the OpenSSL library but the implementation of the hash algorithm is not available the digest initialization will fail. There is a missing check for the return value from the initialization function which later leads to invalid usage of the digest API most likely leading to a crash. ([bsc#1207541, CVE-2023-0401]) PKCS7 data is processed by the SMIME library calls and also by the time stamp (TS) library calls. The TLS implementation in OpenSSL does not call these functions however third party applications would be affected if they call these functions to verify signatures on untrusted data. * Fixed X.400 address type confusion in X.509 GeneralName. There is a type confusion vulnerability relating to X.400 address processing inside an X.509 GeneralName. X.400 addresses were parsed as an ASN1_STRING but the public structure definition for GENERAL_NAME incorrectly specified the type of the x400Address field as ASN1_TYPE. This field is subsequently interpreted by the OpenSSL function GENERAL_NAME_cmp as an ASN1_TYPE rather than an ASN1_STRING. When CRL checking is enabled (i.e. the application sets the X509_V_FLAG_CRL_CHECK flag), this vulnerability may allow an attacker to pass arbitrary pointers to a memcmp call, enabling them to read memory contents or enact a denial of service. ([bsc#1207533, CVE-2023-0286]) * Fixed NULL dereference validating DSA public key. An invalid pointer dereference on read can be triggered when an application tries to check a malformed DSA public key by the OBS-URL: https://build.opensuse.org/request/show/1063662 OBS-URL: https://build.opensuse.org/package/show/security:tls/openssl-3?expand=0&rev=53
306 lines
11 KiB
Diff
306 lines
11 KiB
Diff
From 736d709ec194b3a763e004696df22792c62a11fc Mon Sep 17 00:00:00 2001
|
|
From: Tomas Mraz <tmraz@fedoraproject.org>
|
|
Date: Thu, 24 Sep 2020 10:16:46 +0200
|
|
Subject: Add support for PROFILE=SYSTEM system default cipherlist
|
|
|
|
(was openssl-1.1.1-system-cipherlist.patch)
|
|
---
|
|
Configurations/unix-Makefile.tmpl | 5 ++
|
|
Configure | 11 ++++
|
|
doc/man1/openssl-ciphers.pod.in | 9 +++
|
|
include/openssl/ssl.h.in | 5 ++
|
|
ssl/ssl_ciph.c | 87 +++++++++++++++++++++++++++++++++-----
|
|
ssl/ssl_lib.c | 4 -
|
|
test/cipherlist_test.c | 2
|
|
util/libcrypto.num | 1
|
|
8 files changed, 110 insertions(+), 14 deletions(-)
|
|
|
|
--- a/Configurations/unix-Makefile.tmpl
|
|
+++ b/Configurations/unix-Makefile.tmpl
|
|
@@ -315,6 +315,10 @@ MANDIR=$(INSTALLTOP)/share/man
|
|
DOCDIR=$(INSTALLTOP)/share/doc/$(BASENAME)
|
|
HTMLDIR=$(DOCDIR)/html
|
|
|
|
+{- output_off() if $config{system_ciphers_file} eq ""; "" -}
|
|
+SYSTEM_CIPHERS_FILE_DEFINE=-DSYSTEM_CIPHERS_FILE="\"{- $config{system_ciphers_file} -}\""
|
|
+{- output_on() if $config{system_ciphers_file} eq ""; "" -}
|
|
+
|
|
# MANSUFFIX is for the benefit of anyone who may want to have a suffix
|
|
# appended after the manpage file section number. "ssl" is popular,
|
|
# resulting in files such as config.5ssl rather than config.5.
|
|
@@ -338,6 +342,7 @@ CC=$(CROSS_COMPILE){- $config{CC} -}
|
|
CXX={- $config{CXX} ? "\$(CROSS_COMPILE)$config{CXX}" : '' -}
|
|
CPPFLAGS={- our $cppflags1 = join(" ",
|
|
(map { "-D".$_} @{$config{CPPDEFINES}}),
|
|
+ "\$(SYSTEM_CIPHERS_FILE_DEFINE)",
|
|
(map { "-I".$_} @{$config{CPPINCLUDES}}),
|
|
@{$config{CPPFLAGS}}) -}
|
|
CFLAGS={- join(' ', @{$config{CFLAGS}}) -}
|
|
--- a/Configure
|
|
+++ b/Configure
|
|
@@ -27,7 +27,7 @@ use OpenSSL::config;
|
|
my $orig_death_handler = $SIG{__DIE__};
|
|
$SIG{__DIE__} = \&death_handler;
|
|
|
|
-my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
|
|
+my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--system-ciphers-file=SYSTEMCIPHERFILE] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]\n";
|
|
|
|
my $banner = <<"EOF";
|
|
|
|
@@ -61,6 +61,10 @@ EOF
|
|
# given with --prefix.
|
|
# This becomes the value of OPENSSLDIR in Makefile and in C.
|
|
# (Default: PREFIX/ssl)
|
|
+#
|
|
+# --system-ciphers-file A file to read cipher string from when the PROFILE=SYSTEM
|
|
+# cipher is specified (default).
|
|
+#
|
|
# --banner=".." Output specified text instead of default completion banner
|
|
#
|
|
# -w Don't wait after showing a Configure warning
|
|
@@ -387,6 +391,7 @@ $config{prefix}="";
|
|
$config{openssldir}="";
|
|
$config{processor}="";
|
|
$config{libdir}="";
|
|
+$config{system_ciphers_file}="";
|
|
my $auto_threads=1; # enable threads automatically? true by default
|
|
my $default_ranlib;
|
|
|
|
@@ -989,6 +994,10 @@ while (@argvcopy)
|
|
die "FIPS key too long (64 bytes max)\n"
|
|
if length $1 > 64;
|
|
}
|
|
+ elsif (/^--system-ciphers-file=(.*)$/)
|
|
+ {
|
|
+ $config{system_ciphers_file}=$1;
|
|
+ }
|
|
elsif (/^--banner=(.*)$/)
|
|
{
|
|
$banner = $1 . "\n";
|
|
--- a/doc/man1/openssl-ciphers.pod.in
|
|
+++ b/doc/man1/openssl-ciphers.pod.in
|
|
@@ -186,6 +186,15 @@ As of OpenSSL 1.0.0, the B<ALL> cipher s
|
|
|
|
The cipher suites not enabled by B<ALL>, currently B<eNULL>.
|
|
|
|
+=item B<PROFILE=SYSTEM>
|
|
+
|
|
+The list of enabled cipher suites will be loaded from the system crypto policy
|
|
+configuration file B</etc/crypto-policies/back-ends/openssl.config>.
|
|
+See also L<update-crypto-policies(8)>.
|
|
+This is the default behavior unless an application explicitly sets a cipher
|
|
+list. If used in a cipher list configuration value this string must be at the
|
|
+beginning of the cipher list, otherwise it will not be recognized.
|
|
+
|
|
=item B<HIGH>
|
|
|
|
"High" encryption cipher suites. This currently means those with key lengths
|
|
--- a/include/openssl/ssl.h.in
|
|
+++ b/include/openssl/ssl.h.in
|
|
@@ -210,6 +210,11 @@ extern "C" {
|
|
* throwing out anonymous and unencrypted ciphersuites! (The latter are not
|
|
* actually enabled by ALL, but "ALL:RSA" would enable some of them.)
|
|
*/
|
|
+# ifdef SYSTEM_CIPHERS_FILE
|
|
+# define SSL_SYSTEM_DEFAULT_CIPHER_LIST "PROFILE=SYSTEM"
|
|
+# else
|
|
+# define SSL_SYSTEM_DEFAULT_CIPHER_LIST OSSL_default_cipher_list()
|
|
+# endif
|
|
|
|
/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
|
|
# define SSL_SENT_SHUTDOWN 1
|
|
--- a/ssl/ssl_ciph.c
|
|
+++ b/ssl/ssl_ciph.c
|
|
@@ -1438,6 +1438,53 @@ int SSL_set_ciphersuites(SSL *s, const c
|
|
return ret;
|
|
}
|
|
|
|
+#ifdef SYSTEM_CIPHERS_FILE
|
|
+static char *load_system_str(const char *suffix)
|
|
+{
|
|
+ FILE *fp;
|
|
+ char buf[1024];
|
|
+ char *new_rules;
|
|
+ const char *ciphers_path;
|
|
+ unsigned len, slen;
|
|
+
|
|
+ if ((ciphers_path = ossl_safe_getenv("OPENSSL_SYSTEM_CIPHERS_OVERRIDE")) == NULL)
|
|
+ ciphers_path = SYSTEM_CIPHERS_FILE;
|
|
+ fp = fopen(ciphers_path, "r");
|
|
+ if (fp == NULL || fgets(buf, sizeof(buf), fp) == NULL) {
|
|
+ /* cannot open or file is empty */
|
|
+ snprintf(buf, sizeof(buf), "%s", SSL_DEFAULT_CIPHER_LIST);
|
|
+ }
|
|
+
|
|
+ if (fp)
|
|
+ fclose(fp);
|
|
+
|
|
+ slen = strlen(suffix);
|
|
+ len = strlen(buf);
|
|
+
|
|
+ if (buf[len - 1] == '\n') {
|
|
+ len--;
|
|
+ buf[len] = 0;
|
|
+ }
|
|
+ if (buf[len - 1] == '\r') {
|
|
+ len--;
|
|
+ buf[len] = 0;
|
|
+ }
|
|
+
|
|
+ new_rules = OPENSSL_malloc(len + slen + 1);
|
|
+ if (new_rules == 0)
|
|
+ return NULL;
|
|
+
|
|
+ memcpy(new_rules, buf, len);
|
|
+ if (slen > 0) {
|
|
+ memcpy(&new_rules[len], suffix, slen);
|
|
+ len += slen;
|
|
+ }
|
|
+ new_rules[len] = 0;
|
|
+
|
|
+ return new_rules;
|
|
+}
|
|
+#endif
|
|
+
|
|
STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(SSL_CTX *ctx,
|
|
STACK_OF(SSL_CIPHER) *tls13_ciphersuites,
|
|
STACK_OF(SSL_CIPHER) **cipher_list,
|
|
@@ -1452,15 +1499,25 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr;
|
|
const SSL_CIPHER **ca_list = NULL;
|
|
const SSL_METHOD *ssl_method = ctx->method;
|
|
+#ifdef SYSTEM_CIPHERS_FILE
|
|
+ char *new_rules = NULL;
|
|
+
|
|
+ if (rule_str != NULL && strncmp(rule_str, "PROFILE=SYSTEM", 14) == 0) {
|
|
+ char *p = rule_str + 14;
|
|
+
|
|
+ new_rules = load_system_str(p);
|
|
+ rule_str = new_rules;
|
|
+ }
|
|
+#endif
|
|
|
|
/*
|
|
* Return with error if nothing to do.
|
|
*/
|
|
if (rule_str == NULL || cipher_list == NULL || cipher_list_by_id == NULL)
|
|
- return NULL;
|
|
+ goto err;
|
|
|
|
if (!check_suiteb_cipher_list(ssl_method, c, &rule_str))
|
|
- return NULL;
|
|
+ goto err;
|
|
|
|
/*
|
|
* To reduce the work to do we only want to process the compiled
|
|
@@ -1482,7 +1539,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
co_list = OPENSSL_malloc(sizeof(*co_list) * num_of_ciphers);
|
|
if (co_list == NULL) {
|
|
ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE);
|
|
- return NULL; /* Failure */
|
|
+ goto err;
|
|
}
|
|
|
|
ssl_cipher_collect_ciphers(ssl_method, num_of_ciphers,
|
|
@@ -1548,8 +1605,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
* in force within each class
|
|
*/
|
|
if (!ssl_cipher_strength_sort(&head, &tail)) {
|
|
- OPENSSL_free(co_list);
|
|
- return NULL;
|
|
+ goto err;
|
|
}
|
|
|
|
/*
|
|
@@ -1593,9 +1649,8 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
num_of_alias_max = num_of_ciphers + num_of_group_aliases + 1;
|
|
ca_list = OPENSSL_malloc(sizeof(*ca_list) * num_of_alias_max);
|
|
if (ca_list == NULL) {
|
|
- OPENSSL_free(co_list);
|
|
ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE);
|
|
- return NULL; /* Failure */
|
|
+ goto err;
|
|
}
|
|
ssl_cipher_collect_aliases(ca_list, num_of_group_aliases,
|
|
disabled_mkey, disabled_auth, disabled_enc,
|
|
@@ -1628,8 +1683,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
OPENSSL_free(ca_list); /* Not needed anymore */
|
|
|
|
if (!ok) { /* Rule processing failure */
|
|
- OPENSSL_free(co_list);
|
|
- return NULL;
|
|
+ goto err;
|
|
}
|
|
|
|
/*
|
|
@@ -1637,10 +1691,13 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
* if we cannot get one.
|
|
*/
|
|
if ((cipherstack = sk_SSL_CIPHER_new_null()) == NULL) {
|
|
- OPENSSL_free(co_list);
|
|
- return NULL;
|
|
+ goto err;
|
|
}
|
|
|
|
+#ifdef SYSTEM_CIPHERS_FILE
|
|
+ OPENSSL_free(new_rules); /* Not needed anymore */
|
|
+#endif
|
|
+
|
|
/* Add TLSv1.3 ciphers first - we always prefer those if possible */
|
|
for (i = 0; i < sk_SSL_CIPHER_num(tls13_ciphersuites); i++) {
|
|
const SSL_CIPHER *sslc = sk_SSL_CIPHER_value(tls13_ciphersuites, i);
|
|
@@ -1692,6 +1749,14 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_
|
|
*cipher_list = cipherstack;
|
|
|
|
return cipherstack;
|
|
+
|
|
+err:
|
|
+ OPENSSL_free(co_list);
|
|
+#ifdef SYSTEM_CIPHERS_FILE
|
|
+ OPENSSL_free(new_rules);
|
|
+#endif
|
|
+ return NULL;
|
|
+
|
|
}
|
|
|
|
char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
|
|
--- a/ssl/ssl_lib.c
|
|
+++ b/ssl/ssl_lib.c
|
|
@@ -660,7 +660,7 @@ int SSL_CTX_set_ssl_version(SSL_CTX *ctx
|
|
ctx->tls13_ciphersuites,
|
|
&(ctx->cipher_list),
|
|
&(ctx->cipher_list_by_id),
|
|
- OSSL_default_cipher_list(), ctx->cert);
|
|
+ SSL_SYSTEM_DEFAULT_CIPHER_LIST, ctx->cert);
|
|
if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) {
|
|
ERR_raise(ERR_LIB_SSL, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
|
|
return 0;
|
|
@@ -3285,7 +3285,7 @@ SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *li
|
|
if (!ssl_create_cipher_list(ret,
|
|
ret->tls13_ciphersuites,
|
|
&ret->cipher_list, &ret->cipher_list_by_id,
|
|
- OSSL_default_cipher_list(), ret->cert)
|
|
+ SSL_SYSTEM_DEFAULT_CIPHER_LIST, ret->cert)
|
|
|| sk_SSL_CIPHER_num(ret->cipher_list) <= 0) {
|
|
ERR_raise(ERR_LIB_SSL, SSL_R_LIBRARY_HAS_NO_CIPHERS);
|
|
goto err2;
|
|
--- a/test/cipherlist_test.c
|
|
+++ b/test/cipherlist_test.c
|
|
@@ -246,7 +246,9 @@ end:
|
|
|
|
int setup_tests(void)
|
|
{
|
|
+#ifndef SYSTEM_CIPHERS_FILE
|
|
ADD_TEST(test_default_cipherlist_implicit);
|
|
+#endif
|
|
ADD_TEST(test_default_cipherlist_explicit);
|
|
ADD_TEST(test_default_cipherlist_clear);
|
|
return 1;
|
|
--- a/util/libcrypto.num
|
|
+++ b/util/libcrypto.num
|
|
@@ -5428,3 +5428,4 @@ EVP_PKEY_CTX_get0_provider
|
|
OPENSSL_strcasecmp 5556 3_0_3 EXIST::FUNCTION:
|
|
OPENSSL_strncasecmp 5557 3_0_3 EXIST::FUNCTION:
|
|
OSSL_CMP_CTX_reset_geninfo_ITAVs 5558 3_0_8 EXIST::FUNCTION:CMP
|
|
+ossl_safe_getenv ? 3_0_0 EXIST::FUNCTION:
|