Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-urllib3_1 for 
openSUSE:Factory checked in at 2026-05-21 18:24:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-urllib3_1 (Old)
 and      /work/SRC/openSUSE:Factory/.python-urllib3_1.new.2084 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-urllib3_1"

Thu May 21 18:24:30 2026 rev:14 rq:1353971 version:1.26.20

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-urllib3_1/python-urllib3_1.changes        
2026-01-26 10:44:47.625927800 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-urllib3_1.new.2084/python-urllib3_1.changes  
    2026-05-21 18:24:33.923726152 +0200
@@ -1,0 +2,8 @@
+Tue May 19 08:39:33 UTC 2026 - Daniel Garcia <[email protected]>
+
+- CVE-2026-44431: sensitive information disclosure due to sensitive
+  headers being forwarded across origins in proxied low-level redirects
+  (bsc#1265267)
+  Add patch CVE-2026-44431.patch
+
+-------------------------------------------------------------------

New:
----
  CVE-2026-44431.patch

----------(New B)----------
  New:  (bsc#1265267)
  Add patch CVE-2026-44431.patch
----------(New E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-urllib3_1.spec ++++++
--- /var/tmp/diff_new_pack.OUHoe7/_old  2026-05-21 18:24:36.839845852 +0200
+++ /var/tmp/diff_new_pack.OUHoe7/_new  2026-05-21 18:24:36.843846016 +0200
@@ -46,6 +46,8 @@
 Patch4:         CVE-2025-66418.patch
 # PATCH-FIX-UPSTREAM CVE-2026-21441.patch bsc#1256331 
gh#urllib3/urllib3@8864ac4
 Patch5:         CVE-2026-21441.patch
+# PATCH-FIX-UPSTREAM CVE-2026-44431.patch bsc#1265267
+Patch6:         CVE-2026-44431.patch
 BuildRequires:  %{python_module base >= 3.7}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module setuptools}

++++++ CVE-2026-44431.patch ++++++
>From 5ec0de499b9166ca71c65ab04f2a7e4eb0d66fcc Mon Sep 17 00:00:00 2001
From: Illia Volochii <[email protected]>
Date: Thu, 7 May 2026 18:40:31 +0300
Subject: [PATCH] Merge commit from fork

* Remove sensitive headers in proxy pools too

* Add a changelog entry

* Check retries history in tests

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Copilot <[email protected]>
---
 dummyserver/asgi_proxy.py                     |  1 +
 src/urllib3/connectionpool.py                 | 12 ++++
 .../test_proxy_poolmanager.py                 | 72 +++++++++++++++++++
 4 files changed, 88 insertions(+)
 create mode 100644 changelog/GHSA-qccp-gfcp-xxvc.bugfix.rst

Index: urllib3-1.26.20/src/urllib3/connectionpool.py
===================================================================
--- urllib3-1.26.20.orig/src/urllib3/connectionpool.py
+++ urllib3-1.26.20/src/urllib3/connectionpool.py
@@ -853,6 +853,18 @@ class HTTPConnectionPool(ConnectionPool,
                 body = None
                 headers = HTTPHeaderDict(headers)._prepare_for_method_change()
 
+            # Strip headers marked as unsafe to forward to the redirected 
location.
+            # Check remove_headers_on_redirect to avoid a potential network 
call within
+            # self.is_same_host() which may use socket.gethostbyname() in the 
future.
+            if retries.remove_headers_on_redirect and not self.is_same_host(
+                redirect_location
+            ):
+                new_headers = headers.copy()  # type: ignore[union-attr]
+                for header in headers:
+                    if header.lower() in retries.remove_headers_on_redirect:
+                        new_headers.pop(header, None)
+                headers = new_headers
+
             try:
                 retries = retries.increment(method, url, response=response, 
_pool=self)
             except MaxRetryError:
Index: urllib3-1.26.20/test/with_dummyserver/test_proxy_poolmanager.py
===================================================================
--- urllib3-1.26.20.orig/test/with_dummyserver/test_proxy_poolmanager.py
+++ urllib3-1.26.20/test/with_dummyserver/test_proxy_poolmanager.py
@@ -21,6 +21,7 @@ import trustme
 from dummyserver.server import DEFAULT_CA, HAS_IPV6, get_unreachable_address
 from dummyserver.testcase import HTTPDummyProxyTestCase, 
IPv6HTTPDummyProxyTestCase
 from urllib3._collections import HTTPHeaderDict
+from urllib3.util.retry import RequestHistory
 from urllib3.connectionpool import VerifiedHTTPSConnection, connection_from_url
 from urllib3.exceptions import (
     ConnectTimeoutError,
@@ -277,6 +278,77 @@ class TestHTTPProxyManager(HTTPDummyProx
             )
             assert r._pool.host != self.http_host_alt
 
+    _sensitive_headers = {
+        "Authorization": "foo",
+        "Proxy-Authorization": "bar",
+        "Cookie": "foo=bar",
+    }
+
+    @pytest.mark.parametrize(
+        "sensitive_headers",
+        (_sensitive_headers, {k.lower(): v for k, v in 
_sensitive_headers.items()}),
+        ids=("capitalized", "lowercase"),
+    )
+    def test_cross_host_redirect_remove_headers_via_proxy_manager(
+        self, sensitive_headers: dict[str, str]
+    ) -> None:
+        headers_url = f"{self.http_url_alt}/headers"
+        initial_url = f"{self.http_url}/redirect?target={headers_url}"
+        with proxy_from_url(self.proxy_url) as proxy_mgr:
+            r = proxy_mgr.request(
+                "GET", initial_url, headers=sensitive_headers, retries=1
+            )
+            assert r.status == 200
+            assert r.retries is not None
+            assert r.retries.history == (
+                RequestHistory(
+                    method="GET",
+                    url=initial_url,
+                    error=None,
+                    status=303,
+                    redirect_location=headers_url,
+                ),
+            )
+            data = r.json()
+            for header in sensitive_headers:
+                assert header not in data
+
+    @pytest.mark.parametrize(
+        "sensitive_headers",
+        (_sensitive_headers, {k.lower(): v for k, v in 
_sensitive_headers.items()}),
+        ids=("capitalized", "lowercase"),
+    )
+    def test_cross_host_redirect_remove_headers_via_pool(
+        self, sensitive_headers: dict[str, str]
+    ) -> None:
+        headers_url = f"{self.http_url_alt}/headers"
+        initial_url = f"{self.http_url}/redirect?target={headers_url}"
+        with proxy_from_url(self.proxy_url) as proxy_mgr:
+            pool = proxy_mgr.connection_from_url(self.http_url)
+            r = pool.urlopen(
+                "GET",
+                initial_url,
+                headers=sensitive_headers,
+                retries=1,
+                redirect=True,
+                assert_same_host=False,
+                preload_content=True,
+            )
+            assert r.status == 200
+            assert r.retries is not None
+            assert r.retries.history == (
+                RequestHistory(
+                    method="GET",
+                    url=initial_url,
+                    error=None,
+                    status=303,
+                    redirect_location=headers_url,
+                ),
+            )
+            data = r.json()
+            for header in sensitive_headers:
+                assert header not in data
+
     def test_cross_protocol_redirect(self):
         with proxy_from_url(self.proxy_url, ca_certs=DEFAULT_CA) as http:
             cross_protocol_location = "%s/echo?a=b" % self.https_url

Reply via email to