Instrument with USDT probes related to SHA-1 deprecation
This commit is contained in:
parent
0eaa0014c9
commit
8f08128432
235
0053-Add-SHA1-probes.patch
Normal file
235
0053-Add-SHA1-probes.patch
Normal file
@ -0,0 +1,235 @@
|
||||
From a1905af412163cf971107f51a33dff8b416ab690 Mon Sep 17 00:00:00 2001
|
||||
From: Clemens Lang <cllang@redhat.com>
|
||||
Date: Mon, 25 Apr 2022 15:21:46 +0200
|
||||
Subject: [PATCH] Instrument SHA-1 signatures with USDT probes
|
||||
|
||||
In order to discover remaining uses of SHA-1 in signatures without
|
||||
forcefully breaking the code paths, add USDT probes that can be queried
|
||||
with systemtap at runtime.
|
||||
|
||||
This should allow identifying components that still use SHA-1 signatures
|
||||
in production so that they can be transitioned to more modern hash
|
||||
algorithms.
|
||||
---
|
||||
crypto/evp/m_sigver.c | 13 +++++++++----
|
||||
crypto/evp/pmeth_lib.c | 13 +++++++++----
|
||||
crypto/x509/x509_vfy.c | 6 +++++-
|
||||
providers/common/securitycheck.c | 22 +++++++++++++++-------
|
||||
providers/common/securitycheck_default.c | 13 +++++++++++--
|
||||
ssl/t1_lib.c | 8 +++++++-
|
||||
6 files changed, 56 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/crypto/evp/m_sigver.c b/crypto/evp/m_sigver.c
|
||||
index 8da2183ce0..c17cdfa5d5 100644
|
||||
--- a/crypto/evp/m_sigver.c
|
||||
+++ b/crypto/evp/m_sigver.c
|
||||
@@ -16,6 +16,8 @@
|
||||
#include "internal/numbers.h" /* includes SIZE_MAX */
|
||||
#include "evp_local.h"
|
||||
|
||||
+#include <sys/sdt.h>
|
||||
+
|
||||
typedef struct ossl_legacy_digest_signatures_st {
|
||||
int allowed;
|
||||
} OSSL_LEGACY_DIGEST_SIGNATURES;
|
||||
@@ -336,10 +338,13 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
|
||||
&& !EVP_PKEY_is_a(locpctx->pkey, SN_tls1_prf)
|
||||
&& !EVP_PKEY_is_a(locpctx->pkey, SN_hkdf)) {
|
||||
int mdnid = EVP_MD_nid(ctx->reqdigest);
|
||||
- if (!ossl_ctx_legacy_digest_signatures_allowed(locpctx->libctx, 0)
|
||||
- && (mdnid == NID_sha1 || mdnid == NID_md5_sha1)) {
|
||||
- ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
|
||||
- goto err;
|
||||
+ if (mdnid == NID_sha1 || mdnid == NID_md5_sha1) {
|
||||
+ if (!ossl_ctx_legacy_digest_signatures_allowed(locpctx->libctx, 0)) {
|
||||
+ ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
|
||||
+ goto err;
|
||||
+ } else {
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_do_sigver_init_1, mdnid);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c
|
||||
index 3c5a1e6f5d..589a352974 100644
|
||||
--- a/crypto/evp/pmeth_lib.c
|
||||
+++ b/crypto/evp/pmeth_lib.c
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "internal/sslconf.h"
|
||||
#include "evp_local.h"
|
||||
|
||||
+#include <sys/sdt.h>
|
||||
+
|
||||
#ifndef FIPS_MODULE
|
||||
|
||||
static int evp_pkey_ctx_store_cached_data(EVP_PKEY_CTX *ctx,
|
||||
@@ -954,10 +956,13 @@ static int evp_pkey_ctx_set_md(EVP_PKEY_CTX *ctx, const EVP_MD *md,
|
||||
&& !EVP_PKEY_is_a(ctx->pkey, SN_tls1_prf)
|
||||
&& !EVP_PKEY_is_a(ctx->pkey, SN_hkdf)) {
|
||||
int mdnid = EVP_MD_nid(md);
|
||||
- if ((mdnid == NID_sha1 || mdnid == NID_md5_sha1)
|
||||
- && !ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0)) {
|
||||
- ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
|
||||
- return -1;
|
||||
+ if (mdnid == NID_sha1 || mdnid == NID_md5_sha1) {
|
||||
+ if (!ossl_ctx_legacy_digest_signatures_allowed(ctx->libctx, 0)) {
|
||||
+ ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_DIGEST);
|
||||
+ return -1;
|
||||
+ } else {
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_evp_pkey_ctx_set_md_1, mdnid);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
|
||||
index 60aa26f552..d054acd5a7 100644
|
||||
--- a/crypto/x509/x509_vfy.c
|
||||
+++ b/crypto/x509/x509_vfy.c
|
||||
@@ -29,6 +29,8 @@
|
||||
#include "crypto/x509.h"
|
||||
#include "x509_local.h"
|
||||
|
||||
+#include <sys/sdt.h>
|
||||
+
|
||||
/* CRL score values */
|
||||
|
||||
#define CRL_SCORE_NOCRITICAL 0x100 /* No unhandled critical extensions */
|
||||
@@ -3462,10 +3464,12 @@ static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert)
|
||||
|
||||
if (nid == NID_sha1
|
||||
&& ossl_ctx_legacy_digest_signatures_allowed(libctx, 0)
|
||||
- && ctx->param->auth_level < 2)
|
||||
+ && ctx->param->auth_level < 2) {
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_check_sig_level_1, nid);
|
||||
/* When rh-allow-sha1-signatures = yes and security level <= 1,
|
||||
* explicitly allow SHA1 for backwards compatibility. */
|
||||
return 1;
|
||||
+ }
|
||||
|
||||
return secbits >= minbits_table[level - 1];
|
||||
}
|
||||
diff --git a/providers/common/securitycheck.c b/providers/common/securitycheck.c
|
||||
index e534ad0a5f..bf496450cf 100644
|
||||
--- a/providers/common/securitycheck.c
|
||||
+++ b/providers/common/securitycheck.c
|
||||
@@ -21,6 +21,8 @@
|
||||
#include "prov/securitycheck.h"
|
||||
#include "internal/sslconf.h"
|
||||
|
||||
+#include <sys/sdt.h>
|
||||
+
|
||||
/*
|
||||
* FIPS requires a minimum security strength of 112 bits (for encryption or
|
||||
* signing), and for legacy purposes 80 bits (for decryption or verifying).
|
||||
@@ -238,11 +240,14 @@ int ossl_digest_get_approved_nid_with_sha1(OSSL_LIB_CTX *ctx, const EVP_MD *md,
|
||||
# endif /* OPENSSL_NO_FIPS_SECURITYCHECKS */
|
||||
|
||||
#ifndef FIPS_MODULE
|
||||
- if (!ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
|
||||
- /* SHA1 is globally disabled, check whether we want to locally allow
|
||||
- * it. */
|
||||
- if (mdnid == NID_sha1 && !sha1_allowed)
|
||||
+ if (mdnid == NID_sha1 && !sha1_allowed) {
|
||||
+ if (!ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
|
||||
+ /* SHA1 is globally disabled, check whether we want to locally allow
|
||||
+ * it. */
|
||||
mdnid = -1;
|
||||
+ else
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_ossl_digest_get_approved_nid_with_sha1_1, mdnid);
|
||||
+ }
|
||||
#endif
|
||||
|
||||
return mdnid;
|
||||
@@ -258,9 +263,12 @@ int ossl_digest_is_allowed(OSSL_LIB_CTX *ctx, const EVP_MD *md)
|
||||
#ifndef FIPS_MODULE
|
||||
{
|
||||
int mdnid = EVP_MD_nid(md);
|
||||
- if ((mdnid == NID_sha1 || mdnid == NID_md5_sha1)
|
||||
- && !ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
|
||||
- return 0;
|
||||
+ if (mdnid == NID_sha1 || mdnid == NID_md5_sha1) {
|
||||
+ if (!ossl_ctx_legacy_digest_signatures_allowed(ctx, 0))
|
||||
+ return 0;
|
||||
+ else
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_ossl_digest_is_allowed_1, mdnid);
|
||||
+ }
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/providers/common/securitycheck_default.c b/providers/common/securitycheck_default.c
|
||||
index ce54a94fbc..ecb3a9d4b6 100644
|
||||
--- a/providers/common/securitycheck_default.c
|
||||
+++ b/providers/common/securitycheck_default.c
|
||||
@@ -17,6 +17,8 @@
|
||||
#include "internal/nelem.h"
|
||||
#include "internal/sslconf.h"
|
||||
|
||||
+#include <sys/sdt.h>
|
||||
+
|
||||
/* Disable the security checks in the default provider */
|
||||
int ossl_securitycheck_enabled(OSSL_LIB_CTX *libctx)
|
||||
{
|
||||
@@ -40,9 +42,16 @@ int ossl_digest_rsa_sign_get_md_nid(OSSL_LIB_CTX *ctx, const EVP_MD *md,
|
||||
|
||||
ldsigs_allowed = ossl_ctx_legacy_digest_signatures_allowed(ctx, 0);
|
||||
mdnid = ossl_digest_get_approved_nid_with_sha1(ctx, md, sha1_allowed || ldsigs_allowed);
|
||||
+ if (mdnid == NID_sha1)
|
||||
+ /* This will only happen if SHA1 is allowed, otherwise mdnid is -1. */
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_ossl_digest_rsa_sign_get_md_nid_1, mdnid);
|
||||
if (mdnid == NID_undef)
|
||||
mdnid = ossl_digest_md_to_nid(md, name_to_nid, OSSL_NELEM(name_to_nid));
|
||||
- if (mdnid == NID_md5_sha1 && !ldsigs_allowed)
|
||||
- mdnid = -1;
|
||||
+ if (mdnid == NID_md5_sha1) {
|
||||
+ if (ldsigs_allowed)
|
||||
+ DTRACE_PROBE1(libcrypto, fedora_ossl_digest_rsa_sign_get_md_nid_2, mdnid);
|
||||
+ else
|
||||
+ mdnid = -1;
|
||||
+ }
|
||||
return mdnid;
|
||||
}
|
||||
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
|
||||
index e47ddf56f1..a4b9ff749e 100644
|
||||
--- a/ssl/t1_lib.c
|
||||
+++ b/ssl/t1_lib.c
|
||||
@@ -28,6 +28,8 @@
|
||||
#include "ssl_local.h"
|
||||
#include <openssl/ct.h>
|
||||
|
||||
+#include <sys/sdt.h>
|
||||
+
|
||||
static const SIGALG_LOOKUP *find_sig_alg(SSL *s, X509 *x, EVP_PKEY *pkey);
|
||||
static int tls12_sigalg_allowed(const SSL *s, int op, const SIGALG_LOOKUP *lu);
|
||||
|
||||
@@ -1568,6 +1570,7 @@ int tls12_check_peer_sigalg(SSL *s, uint16_t sig, EVP_PKEY *pkey)
|
||||
&& SSL_get_security_level(s) < 2) {
|
||||
/* when rh-allow-sha1-signatures = yes and security level <= 1,
|
||||
* explicitly allow SHA1 for backwards compatibility */
|
||||
+ DTRACE_PROBE1(libssl, fedora_tls12_check_peer_sigalg_1, lu->hash);
|
||||
} else {
|
||||
/*
|
||||
* Make sure security callback allows algorithm. For historical
|
||||
@@ -2120,6 +2123,7 @@ static int tls12_sigalg_allowed(const SSL *s, int op, const SIGALG_LOOKUP *lu)
|
||||
&& SSL_get_security_level(s) < 2) {
|
||||
/* when rh-allow-sha1-signatures = yes and security level <= 1,
|
||||
* explicitly allow SHA1 for backwards compatibility */
|
||||
+ DTRACE_PROBE1(libssl, fedora_tls12_sigalg_allowed_1, lu->hash);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -3018,10 +3022,12 @@ static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
|
||||
&& ossl_ctx_legacy_digest_signatures_allowed(libctx, 0)
|
||||
&& ((s != NULL && SSL_get_security_level(s) < 2)
|
||||
|| (ctx != NULL && SSL_CTX_get_security_level(ctx) < 2)
|
||||
- ))
|
||||
+ )) {
|
||||
/* When rh-allow-sha1-signatures = yes and security level <= 1,
|
||||
* explicitly allow SHA1 for backwards compatibility. */
|
||||
+ DTRACE_PROBE1(libssl, fedora_ssl_security_cert_sig_1, nid);
|
||||
return 1;
|
||||
+ }
|
||||
|
||||
if (s)
|
||||
return ssl_security(s, op, secbits, nid, x);
|
||||
--
|
||||
2.35.1
|
12
openssl.spec
12
openssl.spec
@ -15,7 +15,7 @@
|
||||
Summary: Utilities from the general purpose cryptography library with TLS implementation
|
||||
Name: openssl
|
||||
Version: 3.0.2
|
||||
Release: 3%{?dist}
|
||||
Release: 4%{?dist}
|
||||
Epoch: 1
|
||||
# We have to remove certain patented algorithms from the openssl source
|
||||
# tarball with the hobble-openssl script which is included below.
|
||||
@ -73,6 +73,12 @@ Patch52: 0052-Allow-SHA1-in-seclevel-2-if-rh-allow-sha1-signatures.patch
|
||||
# Support SHA1 in TLS in LEGACY crypto-policy (which is SECLEVEL=1)
|
||||
Patch52: 0052-Allow-SHA1-in-seclevel-1-if-rh-allow-sha1-signatures.patch
|
||||
%endif
|
||||
%if 0%{?rhel}
|
||||
# no USDT probe instrumentation required
|
||||
%else
|
||||
# Instrument with USDT probes related to SHA-1 deprecation
|
||||
Patch53: 0053-Add-SHA1-probes.patch
|
||||
%endif
|
||||
|
||||
License: ASL 2.0
|
||||
URL: http://www.openssl.org/
|
||||
@ -87,6 +93,7 @@ BuildRequires: perl(Module::Load::Conditional), perl(File::Temp)
|
||||
BuildRequires: perl(Time::HiRes), perl(IPC::Cmd), perl(Pod::Html), perl(Digest::SHA)
|
||||
BuildRequires: perl(FindBin), perl(lib), perl(File::Compare), perl(File::Copy), perl(bigint)
|
||||
BuildRequires: git-core
|
||||
BuildRequires: systemtap-sdt-devel
|
||||
Requires: coreutils
|
||||
Requires: %{name}-libs%{?_isa} = %{epoch}:%{version}-%{release}
|
||||
|
||||
@ -403,6 +410,9 @@ install -m644 %{SOURCE9} \
|
||||
%ldconfig_scriptlets libs
|
||||
|
||||
%changelog
|
||||
* Tue Apr 26 2022 Alexander Sosedkin <asosedkin@redhat.com> - 1:3.0.2-4
|
||||
- Instrument with USDT probes related to SHA-1 deprecation
|
||||
|
||||
* Wed Apr 20 2022 Clemens Lang <cllang@redhat.com> - 1:3.0.2-3
|
||||
- Disable SHA-1 by default in ELN using the patches from CentOS
|
||||
- Fix a FIXME in the openssl.cnf(5) manpage
|
||||
|
Loading…
Reference in New Issue
Block a user