This repository has been archived by the owner on Jan 15, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 88
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
(PA-6378) Address a low-severity vulnerability, CVE-2024-2511
- Loading branch information
Showing
2 changed files
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c | ||
index 81a9f0728d..92bfaa3b02 100644 | ||
--- a/ssl/ssl_lib.c | ||
+++ b/ssl/ssl_lib.c | ||
@@ -3717,9 +3717,10 @@ void ssl_update_cache(SSL *s, int mode) | ||
|
||
/* | ||
* If the session_id_length is 0, we are not supposed to cache it, and it | ||
- * would be rather hard to do anyway :-) | ||
+ * would be rather hard to do anyway :-). Also if the session has already | ||
+ * been marked as not_resumable we should not cache it for later reuse. | ||
*/ | ||
- if (s->session->session_id_length == 0) | ||
+ if (s->session->session_id_length == 0 || s->session->not_resumable) | ||
return; | ||
|
||
/* | ||
diff --git a/ssl/ssl_sess.c b/ssl/ssl_sess.c | ||
index d836b33ed0..75adbd9e52 100644 | ||
--- a/ssl/ssl_sess.c | ||
+++ b/ssl/ssl_sess.c | ||
@@ -152,16 +152,11 @@ SSL_SESSION *SSL_SESSION_new(void) | ||
return ss; | ||
} | ||
|
||
-SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src) | ||
-{ | ||
- return ssl_session_dup(src, 1); | ||
-} | ||
- | ||
/* | ||
* Create a new SSL_SESSION and duplicate the contents of |src| into it. If | ||
* ticket == 0 then no ticket information is duplicated, otherwise it is. | ||
*/ | ||
-SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) | ||
+static SSL_SESSION *ssl_session_dup_intern(const SSL_SESSION *src, int ticket) | ||
{ | ||
SSL_SESSION *dest; | ||
|
||
@@ -285,6 +280,27 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) | ||
return NULL; | ||
} | ||
|
||
+SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src) | ||
+{ | ||
+ return ssl_session_dup_intern(src, 1); | ||
+} | ||
+ | ||
+/* | ||
+ * Used internally when duplicating a session which might be already shared. | ||
+ * We will have resumed the original session. Subsequently we might have marked | ||
+ * it as non-resumable (e.g. in another thread) - but this copy should be ok to | ||
+ * resume from. | ||
+ */ | ||
+SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket) | ||
+{ | ||
+ SSL_SESSION *sess = ssl_session_dup_intern(src, ticket); | ||
+ | ||
+ if (sess != NULL) | ||
+ sess->not_resumable = 0; | ||
+ | ||
+ return sess; | ||
+} | ||
+ | ||
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) | ||
{ | ||
if (len) | ||
diff --git a/ssl/statem/statem_srvr.c b/ssl/statem/statem_srvr.c | ||
index a9e67f9d32..6c942e6bce 100644 | ||
--- a/ssl/statem/statem_srvr.c | ||
+++ b/ssl/statem/statem_srvr.c | ||
@@ -2338,9 +2338,8 @@ int tls_construct_server_hello(SSL *s, WPACKET *pkt) | ||
* so the following won't overwrite an ID that we're supposed | ||
* to send back. | ||
*/ | ||
- if (s->session->not_resumable || | ||
- (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) | ||
- && !s->hit)) | ||
+ if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) | ||
+ && !s->hit) | ||
s->session->session_id_length = 0; | ||
|
||
if (usetls13) { |