Skip to content

Commit

Permalink
curl: address CVE-2024-8096 (#10729)
Browse files Browse the repository at this point in the history
Signed-off-by: Muhammad Falak R Wani <falakreyaz@gmail.com>
  • Loading branch information
mfrw authored Oct 23, 2024
1 parent 17aea59 commit 2b9ee70
Show file tree
Hide file tree
Showing 6 changed files with 219 additions and 15 deletions.
200 changes: 200 additions & 0 deletions SPECS/curl/CVE-2024-8096.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
From aeb1a281cab13c7ba791cb104e556b20e713941f Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Tue, 20 Aug 2024 16:14:39 +0200
Subject: [PATCH] gtls: fix OCSP stapling management

Reported-by: Hiroki Kurosawa
Closes #14642
---
lib/vtls/gtls.c | 146 ++++++++++++++++++++++++------------------------
1 file changed, 73 insertions(+), 73 deletions(-)

diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c
index 03d6fcc038aac3..c7589d9d39bc81 100644
--- a/lib/vtls/gtls.c
+++ b/lib/vtls/gtls.c
@@ -850,6 +850,13 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
init_flags |= GNUTLS_NO_TICKETS;
#endif

+#if defined(GNUTLS_NO_STATUS_REQUEST)
+ if(!config->verifystatus)
+ /* Disable the "status_request" TLS extension, enabled by default since
+ GnuTLS 3.8.0. */
+ init_flags |= GNUTLS_NO_STATUS_REQUEST;
+#endif
+
rc = gnutls_init(&gtls->session, init_flags);
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_init() failed: %d", rc);
@@ -1321,104 +1328,97 @@ Curl_gtls_verifyserver(struct Curl_easy *data,
infof(data, " server certificate verification SKIPPED");

if(config->verifystatus) {
- if(gnutls_ocsp_status_request_is_checked(session, 0) == 0) {
- gnutls_datum_t status_request;
- gnutls_ocsp_resp_t ocsp_resp;
+ gnutls_datum_t status_request;
+ gnutls_ocsp_resp_t ocsp_resp;
+ gnutls_ocsp_cert_status_t status;
+ gnutls_x509_crl_reason_t reason;

- gnutls_ocsp_cert_status_t status;
- gnutls_x509_crl_reason_t reason;
+ rc = gnutls_ocsp_status_request_get(session, &status_request);

- rc = gnutls_ocsp_status_request_get(session, &status_request);
+ if(rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) {
+ failf(data, "No OCSP response received");
+ return CURLE_SSL_INVALIDCERTSTATUS;
+ }

- infof(data, " server certificate status verification FAILED");
+ if(rc < 0) {
+ failf(data, "Invalid OCSP response received");
+ return CURLE_SSL_INVALIDCERTSTATUS;
+ }

- if(rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) {
- failf(data, "No OCSP response received");
- return CURLE_SSL_INVALIDCERTSTATUS;
- }
+ gnutls_ocsp_resp_init(&ocsp_resp);

- if(rc < 0) {
- failf(data, "Invalid OCSP response received");
- return CURLE_SSL_INVALIDCERTSTATUS;
- }
+ rc = gnutls_ocsp_resp_import(ocsp_resp, &status_request);
+ if(rc < 0) {
+ failf(data, "Invalid OCSP response received");
+ return CURLE_SSL_INVALIDCERTSTATUS;
+ }

- gnutls_ocsp_resp_init(&ocsp_resp);
+ (void)gnutls_ocsp_resp_get_single(ocsp_resp, 0, NULL, NULL, NULL, NULL,
+ &status, NULL, NULL, NULL, &reason);

- rc = gnutls_ocsp_resp_import(ocsp_resp, &status_request);
- if(rc < 0) {
- failf(data, "Invalid OCSP response received");
- return CURLE_SSL_INVALIDCERTSTATUS;
- }
+ switch(status) {
+ case GNUTLS_OCSP_CERT_GOOD:
+ break;

- (void)gnutls_ocsp_resp_get_single(ocsp_resp, 0, NULL, NULL, NULL, NULL,
- &status, NULL, NULL, NULL, &reason);
+ case GNUTLS_OCSP_CERT_REVOKED: {
+ const char *crl_reason;

- switch(status) {
- case GNUTLS_OCSP_CERT_GOOD:
+ switch(reason) {
+ default:
+ case GNUTLS_X509_CRLREASON_UNSPECIFIED:
+ crl_reason = "unspecified reason";
break;

- case GNUTLS_OCSP_CERT_REVOKED: {
- const char *crl_reason;
-
- switch(reason) {
- default:
- case GNUTLS_X509_CRLREASON_UNSPECIFIED:
- crl_reason = "unspecified reason";
- break;
-
- case GNUTLS_X509_CRLREASON_KEYCOMPROMISE:
- crl_reason = "private key compromised";
- break;
-
- case GNUTLS_X509_CRLREASON_CACOMPROMISE:
- crl_reason = "CA compromised";
- break;
-
- case GNUTLS_X509_CRLREASON_AFFILIATIONCHANGED:
- crl_reason = "affiliation has changed";
- break;
+ case GNUTLS_X509_CRLREASON_KEYCOMPROMISE:
+ crl_reason = "private key compromised";
+ break;

- case GNUTLS_X509_CRLREASON_SUPERSEDED:
- crl_reason = "certificate superseded";
- break;
+ case GNUTLS_X509_CRLREASON_CACOMPROMISE:
+ crl_reason = "CA compromised";
+ break;

- case GNUTLS_X509_CRLREASON_CESSATIONOFOPERATION:
- crl_reason = "operation has ceased";
- break;
+ case GNUTLS_X509_CRLREASON_AFFILIATIONCHANGED:
+ crl_reason = "affiliation has changed";
+ break;

- case GNUTLS_X509_CRLREASON_CERTIFICATEHOLD:
- crl_reason = "certificate is on hold";
- break;
+ case GNUTLS_X509_CRLREASON_SUPERSEDED:
+ crl_reason = "certificate superseded";
+ break;

- case GNUTLS_X509_CRLREASON_REMOVEFROMCRL:
- crl_reason = "will be removed from delta CRL";
- break;
+ case GNUTLS_X509_CRLREASON_CESSATIONOFOPERATION:
+ crl_reason = "operation has ceased";
+ break;

- case GNUTLS_X509_CRLREASON_PRIVILEGEWITHDRAWN:
- crl_reason = "privilege withdrawn";
- break;
+ case GNUTLS_X509_CRLREASON_CERTIFICATEHOLD:
+ crl_reason = "certificate is on hold";
+ break;

- case GNUTLS_X509_CRLREASON_AACOMPROMISE:
- crl_reason = "AA compromised";
- break;
- }
+ case GNUTLS_X509_CRLREASON_REMOVEFROMCRL:
+ crl_reason = "will be removed from delta CRL";
+ break;

- failf(data, "Server certificate was revoked: %s", crl_reason);
+ case GNUTLS_X509_CRLREASON_PRIVILEGEWITHDRAWN:
+ crl_reason = "privilege withdrawn";
break;
- }

- default:
- case GNUTLS_OCSP_CERT_UNKNOWN:
- failf(data, "Server certificate status is unknown");
+ case GNUTLS_X509_CRLREASON_AACOMPROMISE:
+ crl_reason = "AA compromised";
break;
}

- gnutls_ocsp_resp_deinit(ocsp_resp);
+ failf(data, "Server certificate was revoked: %s", crl_reason);
+ break;
+ }

- return CURLE_SSL_INVALIDCERTSTATUS;
+ default:
+ case GNUTLS_OCSP_CERT_UNKNOWN:
+ failf(data, "Server certificate status is unknown");
+ break;
}
- else
- infof(data, " server certificate status verification OK");
+
+ gnutls_ocsp_resp_deinit(ocsp_resp);
+ if(status != GNUTLS_OCSP_CERT_GOOD)
+ return CURLE_SSL_INVALIDCERTSTATUS;
}
else
infof(data, " server certificate status verification SKIPPED");
6 changes: 5 additions & 1 deletion SPECS/curl/curl.spec
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
Summary: An URL retrieval utility and library
Name: curl
Version: 8.8.0
Release: 2%{?dist}
Release: 3%{?dist}
License: curl
Vendor: Microsoft Corporation
Distribution: Azure Linux
Group: System Environment/NetworkingLibraries
URL: https://curl.haxx.se
Source0: https://curl.haxx.se/download/%{name}-%{version}.tar.gz
Patch0: CVE-2024-6197.patch
Patch1: CVE-2024-8096.patch
BuildRequires: krb5-devel
BuildRequires: libssh2-devel
BuildRequires: nghttp2-devel
Expand Down Expand Up @@ -86,6 +87,9 @@ find %{buildroot} -type f -name "*.la" -delete -print
%{_libdir}/libcurl.so.*

%changelog
* Tue Oct 15 2024 Muhammad Falak <mwani@microsoft.com> - 8.8.0-3
- Address CVE-2024-8096

* Wed Sep 11 2024 Aadhar Agarwal <aadagarwal@microsoft.com> - 8.8.0-2
- Patch CVE-2024-6197

Expand Down
6 changes: 3 additions & 3 deletions toolkit/resources/manifests/package/pkggen_core_aarch64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,9 @@ libssh2-1.11.0-1.azl3.aarch64.rpm
libssh2-devel-1.11.0-1.azl3.aarch64.rpm
krb5-1.21.3-2.azl3.aarch64.rpm
nghttp2-1.61.0-2.azl3.aarch64.rpm
curl-8.8.0-2.azl3.aarch64.rpm
curl-devel-8.8.0-2.azl3.aarch64.rpm
curl-libs-8.8.0-2.azl3.aarch64.rpm
curl-8.8.0-3.azl3.aarch64.rpm
curl-devel-8.8.0-3.azl3.aarch64.rpm
curl-libs-8.8.0-3.azl3.aarch64.rpm
createrepo_c-1.0.3-1.azl3.aarch64.rpm
libxml2-2.11.5-1.azl3.aarch64.rpm
libxml2-devel-2.11.5-1.azl3.aarch64.rpm
Expand Down
6 changes: 3 additions & 3 deletions toolkit/resources/manifests/package/pkggen_core_x86_64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,9 @@ libssh2-1.11.0-1.azl3.x86_64.rpm
libssh2-devel-1.11.0-1.azl3.x86_64.rpm
krb5-1.21.3-2.azl3.x86_64.rpm
nghttp2-1.61.0-2.azl3.x86_64.rpm
curl-8.8.0-2.azl3.x86_64.rpm
curl-devel-8.8.0-2.azl3.x86_64.rpm
curl-libs-8.8.0-2.azl3.x86_64.rpm
curl-8.8.0-3.azl3.x86_64.rpm
curl-devel-8.8.0-3.azl3.x86_64.rpm
curl-libs-8.8.0-3.azl3.x86_64.rpm
createrepo_c-1.0.3-1.azl3.x86_64.rpm
libxml2-2.11.5-1.azl3.x86_64.rpm
libxml2-devel-2.11.5-1.azl3.x86_64.rpm
Expand Down
8 changes: 4 additions & 4 deletions toolkit/resources/manifests/package/toolchain_aarch64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ cracklib-lang-2.9.11-1.azl3.aarch64.rpm
createrepo_c-1.0.3-1.azl3.aarch64.rpm
createrepo_c-debuginfo-1.0.3-1.azl3.aarch64.rpm
createrepo_c-devel-1.0.3-1.azl3.aarch64.rpm
curl-8.8.0-2.azl3.aarch64.rpm
curl-debuginfo-8.8.0-2.azl3.aarch64.rpm
curl-devel-8.8.0-2.azl3.aarch64.rpm
curl-libs-8.8.0-2.azl3.aarch64.rpm
curl-8.8.0-3.azl3.aarch64.rpm
curl-debuginfo-8.8.0-3.azl3.aarch64.rpm
curl-devel-8.8.0-3.azl3.aarch64.rpm
curl-libs-8.8.0-3.azl3.aarch64.rpm
Cython-debuginfo-3.0.5-2.azl3.aarch64.rpm
debugedit-5.0-2.azl3.aarch64.rpm
debugedit-debuginfo-5.0-2.azl3.aarch64.rpm
Expand Down
8 changes: 4 additions & 4 deletions toolkit/resources/manifests/package/toolchain_x86_64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ createrepo_c-debuginfo-1.0.3-1.azl3.x86_64.rpm
createrepo_c-devel-1.0.3-1.azl3.x86_64.rpm
cross-binutils-common-2.41-2.azl3.noarch.rpm
cross-gcc-common-13.2.0-7.azl3.noarch.rpm
curl-8.8.0-2.azl3.x86_64.rpm
curl-debuginfo-8.8.0-2.azl3.x86_64.rpm
curl-devel-8.8.0-2.azl3.x86_64.rpm
curl-libs-8.8.0-2.azl3.x86_64.rpm
curl-8.8.0-3.azl3.x86_64.rpm
curl-debuginfo-8.8.0-3.azl3.x86_64.rpm
curl-devel-8.8.0-3.azl3.x86_64.rpm
curl-libs-8.8.0-3.azl3.x86_64.rpm
Cython-debuginfo-3.0.5-2.azl3.x86_64.rpm
debugedit-5.0-2.azl3.x86_64.rpm
debugedit-debuginfo-5.0-2.azl3.x86_64.rpm
Expand Down

0 comments on commit 2b9ee70

Please sign in to comment.