Bug#964861: stretch-pu: package glib-networking/2.50.0-1+deb9u1

Emilio Pozuelo Monfort pochu at debian.org
Sat Jul 11 12:53:31 BST 2020


Package: release.debian.org
Severity: normal
Tags: stretch
User: release.debian.org at packages.debian.org
Usertags: pu

This fixes CVE-2020-13645 for stretch. balsa in stretch doesn't
use GIO for connecting to the servers or validating the certificates,
so we don't need any further changes here.

Thanks,
Emilio
-------------- next part --------------
diff -Nru glib-networking-2.50.0/debian/changelog glib-networking-2.50.0/debian/changelog
--- glib-networking-2.50.0/debian/changelog	2016-09-19 21:01:51.000000000 +0200
+++ glib-networking-2.50.0/debian/changelog	2020-07-07 16:57:37.000000000 +0200
@@ -1,3 +1,11 @@
+glib-networking (2.50.0-1+deb9u1) stretch; urgency=medium
+
+  * Team upload
+  * d/p/Return-bad-identity-error-if-identity-is-unset.patch:
+    Backport fix for CVE-2020-13645 from upstream (Closes: #961756)
+
+ -- Emilio Pozuelo Monfort <pochu at debian.org>  Tue, 07 Jul 2020 16:57:37 +0200
+
 glib-networking (2.50.0-1) unstable; urgency=medium
 
   * New upstream release.
diff -Nru glib-networking-2.50.0/debian/patches/CVE-2020-13645.patch glib-networking-2.50.0/debian/patches/CVE-2020-13645.patch
--- glib-networking-2.50.0/debian/patches/CVE-2020-13645.patch	1970-01-01 01:00:00.000000000 +0100
+++ glib-networking-2.50.0/debian/patches/CVE-2020-13645.patch	2020-07-07 16:56:41.000000000 +0200
@@ -0,0 +1,139 @@
+Backported from upstream patch:
+From 29513946809590c4912550f6f8620468f9836d94 Mon Sep 17 00:00:00 2001
+From: Michael Catanzaro <mcatanzaro at gnome.org>
+Date: Mon, 4 May 2020 17:47:28 -0500
+Subject: [PATCH] Return bad identity error if identity is unset
+
+When the server-identity property of GTlsClientConnection is unset, the
+documentation sasy we need to fail the certificate verification with
+G_TLS_CERTIFICATE_BAD_IDENTITY. This is important because otherwise,
+it's easy for applications to fail to specify server identity.
+
+Unfortunately, we did not correctly implement the intended, documented
+behavior. When server identity is missing, we check the validity of the
+TLS certificate, but do not check if it corresponds to the expected
+server (since we have no expected server). Then we assume the identity
+is good, instead of returning bad identity, as documented. This means,
+for example, that evil.com can present a valid certificate issued to
+evil.com, and we would happily accept it for paypal.com.
+
+Fixes #135
+---
+ tls/gnutls/gtlsconnection-gnutls.c | 20 +++++-----
+ tls/tests/connection.c         | 70 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 81 insertions(+), 9 deletions(-)
+
+--- a/tls/gnutls/gtlsconnection-gnutls.c
++++ b/tls/gnutls/gtlsconnection-gnutls.c
+@@ -1174,18 +1174,18 @@ verify_peer_certificate (GTlsConnectionG
+ 			 GTlsCertificate      *peer_certificate)
+ {
+   GTlsConnection *conn = G_TLS_CONNECTION (gnutls);
+-  GSocketConnectable *peer_identity;
++  GSocketConnectable *peer_identity = NULL;
+   GTlsDatabase *database;
+-  GTlsCertificateFlags errors;
++  GTlsCertificateFlags errors = 0;
+   gboolean is_client;
+ 
+   is_client = G_IS_TLS_CLIENT_CONNECTION (gnutls);
+   if (is_client)
+-    peer_identity = g_tls_client_connection_get_server_identity (G_TLS_CLIENT_CONNECTION (gnutls));
+-  else
+-    peer_identity = NULL;
+-
+-  errors = 0;
++    {
++      peer_identity = g_tls_client_connection_get_server_identity (G_TLS_CLIENT_CONNECTION (gnutls));
++      if (!peer_identity)
++        errors |= G_TLS_CERTIFICATE_BAD_IDENTITY;
++    }
+ 
+   database = g_tls_connection_get_database (conn);
+   if (database == NULL)
+--- a/tls/tests/connection.c
++++ b/tls/tests/connection.c
+@@ -1964,6 +1964,74 @@ test_output_stream_close (TestConnection
+   g_assert (ret);
+ }
+ 
++static void
++test_connection_missing_server_identity (TestConnection *test,
++                                         gconstpointer   data)
++{
++  GIOStream *connection;
++  GError *error = NULL;
++
++  test->database = g_tls_file_database_new (tls_test_file_path ("ca-roots.pem"), &error);
++  g_assert_no_error (error);
++  g_assert_nonnull (test->database);
++
++  /* We pass NULL instead of test->identity when creating the client
++   * connection. This means verification must fail with
++   * G_TLS_CERTIFICATE_BAD_IDENTITY.
++   */
++  connection = start_async_server_and_connect_to_it (test, G_TLS_AUTHENTICATION_NONE);
++  test->client_connection = g_tls_client_connection_new (connection, NULL, &error);
++  g_assert_no_error (error);
++  g_assert_nonnull (test->client_connection);
++  g_object_unref (connection);
++
++  g_tls_connection_set_database (G_TLS_CONNECTION (test->client_connection), test->database);
++
++  /* All validation in this test */
++  g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (test->client_connection),
++                                                G_TLS_CERTIFICATE_VALIDATE_ALL);
++
++  read_test_data_async (test);
++  g_main_loop_run (test->loop);
++  wait_until_server_finished (test);
++
++  g_assert_error (test->read_error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE);
++
++#ifdef BACKEND_IS_GNUTLS
++  g_assert_error (test->server_error, G_TLS_ERROR, G_TLS_ERROR_NOT_TLS);
++#elif defined(BACKEND_IS_OPENSSL)
++  /* FIXME: This is not OK. There should be a NOT_TLS errors. But some times
++   * we either get no error or BROKEN_PIPE
++   */
++#endif
++
++  g_clear_error (&test->read_error);
++  g_clear_error (&test->server_error);
++
++  g_clear_object (&test->client_connection);
++  g_clear_object (&test->server_connection);
++
++  /* Now do the same thing again, this time ignoring bad identity. */
++
++  connection = start_async_server_and_connect_to_it (test, G_TLS_AUTHENTICATION_NONE);
++  test->client_connection = g_tls_client_connection_new (connection, NULL, &error);
++  g_assert_no_error (error);
++  g_assert_nonnull (test->client_connection);
++  g_object_unref (connection);
++
++  g_tls_connection_set_database (G_TLS_CONNECTION (test->client_connection), test->database);
++
++  g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (test->client_connection),
++                                                G_TLS_CERTIFICATE_VALIDATE_ALL & ~G_TLS_CERTIFICATE_BAD_IDENTITY);
++
++  read_test_data_async (test);
++  g_main_loop_run (test->loop);
++  wait_until_server_finished (test);
++
++  g_assert_no_error (test->read_error);
++  g_assert_no_error (test->server_error);
++}
++
+ int
+ main (int   argc,
+       char *argv[])
+@@ -2061,6 +2129,8 @@ main (int   argc,
+   g_test_add ("/tls/connection/fallback/subprocess/" PRIORITY_TLS_FALLBACK,
+ 	      TestConnection, NULL,
+               setup_connection, test_fallback_subprocess, teardown_connection);
++  g_test_add ("/tls/connection/missing-server-identity", TestConnection, NULL,
++              setup_connection, test_connection_missing_server_identity, teardown_connection);
+ 
+   ret = g_test_run();
+ 
diff -Nru glib-networking-2.50.0/debian/patches/series glib-networking-2.50.0/debian/patches/series
--- glib-networking-2.50.0/debian/patches/series	2014-10-22 23:32:59.000000000 +0200
+++ glib-networking-2.50.0/debian/patches/series	2020-07-07 16:57:35.000000000 +0200
@@ -1 +1,2 @@
 01_connection_test.patch
+CVE-2020-13645.patch


More information about the pkg-gnome-maintainers mailing list