From e40df6d48a1cbab56f5d15016cc861a503423cfe Mon Sep 17 00:00:00 2001 From: Patrick Griffis Date: Sun, 8 Dec 2024 20:00:35 -0600 Subject: [PATCH] auth-digest: Handle missing realm in authenticate header Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/libsoup/-/commit/e40df6d48a1cbab56f5d15016cc861a503423cfe] CVE: CVE-2025-32910 Signed-off-by: Vijay Anusuri --- libsoup/auth/soup-auth-digest.c | 3 ++ tests/auth-test.c | 50 +++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/libsoup/auth/soup-auth-digest.c b/libsoup/auth/soup-auth-digest.c index 2e81849af..4f12e87a5 100644 --- a/libsoup/auth/soup-auth-digest.c +++ b/libsoup/auth/soup-auth-digest.c @@ -148,6 +148,9 @@ soup_auth_digest_update (SoupAuth *auth, SoupMessage *msg, guint qop_options; gboolean ok = TRUE; + if (!soup_auth_get_realm (auth)) + return FALSE; + g_free (priv->domain); g_free (priv->nonce); g_free (priv->opaque); diff --git a/tests/auth-test.c b/tests/auth-test.c index 158fdac10..3066e904a 100644 --- a/tests/auth-test.c +++ b/tests/auth-test.c @@ -1866,6 +1866,55 @@ do_multiple_digest_algorithms (void) soup_test_server_quit_unref (server); } +static void +on_request_read_for_missing_realm (SoupServer *server, + SoupServerMessage *msg, + gpointer user_data) +{ + SoupMessageHeaders *response_headers = soup_server_message_get_response_headers (msg); + soup_message_headers_replace (response_headers, "WWW-Authenticate", "Digest qop=\"auth\""); +} + +static void +do_missing_realm_test (void) +{ + SoupSession *session; + SoupMessage *msg; + SoupServer *server; + SoupAuthDomain *digest_auth_domain; + gint status; + GUri *uri; + + server = soup_test_server_new (SOUP_TEST_SERVER_IN_THREAD); + soup_server_add_handler (server, NULL, + server_callback, NULL, NULL); + uri = soup_test_server_get_uri (server, "http", NULL); + + digest_auth_domain = soup_auth_domain_digest_new ( + "realm", "auth-test", + "auth-callback", server_digest_auth_callback, + NULL); + soup_auth_domain_add_path (digest_auth_domain, "/"); + soup_server_add_auth_domain (server, digest_auth_domain); + g_object_unref (digest_auth_domain); + + g_signal_connect (server, "request-read", + G_CALLBACK (on_request_read_for_missing_realm), + NULL); + + session = soup_test_session_new (NULL); + msg = soup_message_new_from_uri ("GET", uri); + g_signal_connect (msg, "authenticate", + G_CALLBACK (on_digest_authenticate), + NULL); + + status = soup_test_session_send_message (session, msg); + + g_assert_cmpint (status, ==, SOUP_STATUS_UNAUTHORIZED); + g_uri_unref (uri); + soup_test_server_quit_unref (server); +} + int main (int argc, char **argv) { @@ -1899,6 +1948,7 @@ main (int argc, char **argv) g_test_add_func ("/auth/auth-uri", do_auth_uri_test); g_test_add_func ("/auth/cancel-request-on-authenticate", do_cancel_request_on_authenticate); g_test_add_func ("/auth/multiple-algorithms", do_multiple_digest_algorithms); + g_test_add_func ("/auth/missing-realm", do_missing_realm_test); ret = g_test_run (); -- GitLab