[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#988399: marked as done (unblock: python-urllib3/1.26.4-1)



Your message dated Thu, 13 May 2021 07:23:32 +0000
with message-id <E1lh5gy-0006Zd-8h@respighi.debian.org>
and subject line unblock python-urllib3
has caused the Debian Bug report #988399,
regarding unblock: python-urllib3/1.26.4-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
988399: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=988399
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: eriol@debian.org

Please unblock package python-urllib3

This is a upstream point release, that fixes a security issue
(CVE-2021-28363).

All the changes are either inconsequential documentation noise or
targeted bug fixes.

The diff is small enough that I'll immediately upload to unstable.

[ Reason ]
Pick up an upstream security fix, and bug fixes in a point release.

[ Impact ]
Known security issue.

[ Tests ]
Upstream unit test suite covers the changes.

[ Risks ]
Minimal. It's a popular Python package, the point release is over a
month old and hasn't had regressions reported.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
I'll follow-up with a security update to pip that will update its
bundled urllib3.

unblock python-urllib3/1.26.4-1
diff -Nru python-urllib3-1.26.2/CHANGES.rst python-urllib3-1.26.4/CHANGES.rst
--- python-urllib3-1.26.2/CHANGES.rst	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/CHANGES.rst	2021-03-15 11:03:47.000000000 -0400
@@ -1,6 +1,23 @@
 Changes
 =======
 
+1.26.4 (2021-03-15)
+-------------------
+
+* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
+  during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.
+
+
+1.26.3 (2021-01-26)
+-------------------
+
+* Fixed bytes and string comparison issue with headers (Pull #2141)
+
+* Changed ``ProxySchemeUnknown`` error message to be
+  more actionable if the user supplies a proxy URL without
+  a scheme. (Pull #2107)
+
+
 1.26.2 (2020-11-12)
 -------------------
 
diff -Nru python-urllib3-1.26.2/debian/changelog python-urllib3-1.26.4/debian/changelog
--- python-urllib3-1.26.2/debian/changelog	2020-12-30 21:22:32.000000000 -0400
+++ python-urllib3-1.26.4/debian/changelog	2021-05-11 20:30:00.000000000 -0400
@@ -1,3 +1,12 @@
+python-urllib3 (1.26.4-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+    - Enforces certificate validation in some cases involving HTTPS to HTTPS
+      proxies CVE-2021-28363.
+
+ -- Stefano Rivera <stefanor@debian.org>  Tue, 11 May 2021 20:30:00 -0400
+
 python-urllib3 (1.26.2-1) unstable; urgency=medium
 
   * New upstream version 1.26.2
diff -Nru python-urllib3-1.26.2/debian/patches/01_do-not-use-embedded-python-six.patch python-urllib3-1.26.4/debian/patches/01_do-not-use-embedded-python-six.patch
--- python-urllib3-1.26.2/debian/patches/01_do-not-use-embedded-python-six.patch	2020-12-30 21:22:32.000000000 -0400
+++ python-urllib3-1.26.4/debian/patches/01_do-not-use-embedded-python-six.patch	2021-05-11 20:30:00.000000000 -0400
@@ -76,7 +76,7 @@
  __all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"]
  
 diff --git a/src/urllib3/connection.py b/src/urllib3/connection.py
-index 660d679..826f8d7 100644
+index 45580b7..1cddda4 100644
 --- a/src/urllib3/connection.py
 +++ b/src/urllib3/connection.py
 @@ -9,9 +9,9 @@ import warnings
@@ -160,7 +160,7 @@
  __all__ = ["inject_into_urllib3", "extract_from_urllib3"]
  
 diff --git a/src/urllib3/exceptions.py b/src/urllib3/exceptions.py
-index d69958d..31a779b 100644
+index cba6f3f..053758e 100644
 --- a/src/urllib3/exceptions.py
 +++ b/src/urllib3/exceptions.py
 @@ -1,6 +1,6 @@
@@ -294,7 +294,7 @@
  
  def is_fp_closed(obj):
 diff --git a/src/urllib3/util/retry.py b/src/urllib3/util/retry.py
-index ee51f92..8c275a8 100644
+index d25a41b..e11f585 100644
 --- a/src/urllib3/util/retry.py
 +++ b/src/urllib3/util/retry.py
 @@ -17,7 +17,7 @@ from ..exceptions import (
diff -Nru python-urllib3-1.26.2/docs/conf.py python-urllib3-1.26.4/docs/conf.py
--- python-urllib3-1.26.2/docs/conf.py	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/docs/conf.py	2021-03-15 11:03:47.000000000 -0400
@@ -78,8 +78,8 @@
 html_theme_options = {
     "announcement": """
         <a style=\"text-decoration: none; color: white;\" 
-           href=\"https://opencollective.com/urllib3\";>
-           <img src=\"/en/latest/_static/favicon.png\"/> Sponsor urllib3 v2.0 on Open Collective
+           href=\"https://github.com/sponsors/urllib3\";>
+           <img src=\"/en/latest/_static/favicon.png\"/> Support urllib3 on GitHub Sponsors
         </a>
     """,
     "sidebar_hide_name": True,
diff -Nru python-urllib3-1.26.2/docs/sponsors.rst python-urllib3-1.26.4/docs/sponsors.rst
--- python-urllib3-1.26.2/docs/sponsors.rst	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/docs/sponsors.rst	2021-03-15 11:03:33.000000000 -0400
@@ -15,7 +15,7 @@
 
    `Get in contact <mailto:sethmichaellarson@gmail.com>`_ for additional
    details on sponsorship and perks before making a contribution
-   through `Open Collective <https://opencollective.com/urllib3>`_ if you have questions.
+   through `GitHub Sponsors <https://github.com/sponsors/urllib3>`_ if you have questions.
 
 
 Silver v2.0 Sponsor Perks
@@ -76,12 +76,3 @@
   `@Lukasa <https://github.com/Lukasa>`_
 
 * `Stripe <https://stripe.com>`_ (June 23, 2014)
-
-
-Open Collective Supporters
---------------------------
-
-All donations are currently going towards the development of new features for urllib3 v2.0.
-Donate $5 or more as an individual or $50 or more as an organization to be added to the list of supporters below (coming soon).
-
-`Thanks to all our supporters on Open Collective <https://opencollective.com/urllib3#section-contributors>`_!
diff -Nru python-urllib3-1.26.2/docs/v2-roadmap.rst python-urllib3-1.26.4/docs/v2-roadmap.rst
--- python-urllib3-1.26.2/docs/v2-roadmap.rst	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/docs/v2-roadmap.rst	2021-03-15 11:03:33.000000000 -0400
@@ -3,7 +3,7 @@
 
 .. important::
 
-   We're seeking `sponsors and supporters for urllib3 v2.0 on Open Collective <https://opencollective.com/urllib3>`_.
+   We're seeking `sponsors and supporters for urllib3 v2.0 on Open Collective <https://github.com/sponsors/urllib3>`_.
    There's a lot of work to be done for our small team and we want to make sure
    development can get completed on-time while also fairly compensating contributors
    for the additional effort required for a large release like ``v2.0``.
diff -Nru python-urllib3-1.26.2/PKG-INFO python-urllib3-1.26.4/PKG-INFO
--- python-urllib3-1.26.2/PKG-INFO	2020-11-12 18:16:39.000000000 -0400
+++ python-urllib3-1.26.4/PKG-INFO	2021-03-15 11:03:55.002221800 -0400
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: urllib3
-Version: 1.26.2
+Version: 1.26.4
 Summary: HTTP library with thread-safe connection pooling, file post, and more.
 Home-page: https://urllib3.readthedocs.io/
 Author: Andrey Petrov
@@ -116,6 +116,23 @@
         Changes
         =======
         
+        1.26.4 (2021-03-15)
+        -------------------
+        
+        * Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
+          during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.
+        
+        
+        1.26.3 (2021-01-26)
+        -------------------
+        
+        * Fixed bytes and string comparison issue with headers (Pull #2141)
+        
+        * Changed ``ProxySchemeUnknown`` error message to be
+          more actionable if the user supplies a proxy URL without
+          a scheme. (Pull #2107)
+        
+        
         1.26.2 (2020-11-12)
         -------------------
         
diff -Nru python-urllib3-1.26.2/src/urllib3/connection.py python-urllib3-1.26.4/src/urllib3/connection.py
--- python-urllib3-1.26.2/src/urllib3/connection.py	2020-11-12 18:16:34.000000000 -0400
+++ python-urllib3-1.26.4/src/urllib3/connection.py	2021-03-15 11:03:47.000000000 -0400
@@ -67,7 +67,7 @@
 
 # When it comes time to update this value as a part of regular maintenance
 # (ie test_recent_date is failing) update it to ~6 months before the current date.
-RECENT_DATE = datetime.date(2019, 1, 1)
+RECENT_DATE = datetime.date(2020, 7, 1)
 
 _CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]")
 
@@ -215,7 +215,7 @@
 
     def putheader(self, header, *values):
         """"""
-        if SKIP_HEADER not in values:
+        if not any(isinstance(v, str) and v == SKIP_HEADER for v in values):
             _HTTPConnection.putheader(self, header, *values)
         elif six.ensure_str(header.lower()) not in SKIPPABLE_HEADERS:
             raise ValueError(
@@ -490,6 +490,10 @@
             self.ca_cert_dir,
             self.ca_cert_data,
         )
+        # By default urllib3's SSLContext disables `check_hostname` and uses
+        # a custom check. For proxies we're good with relying on the default
+        # verification.
+        ssl_context.check_hostname = True
 
         # If no cert was provided, use only the default options for server
         # certificate validation
diff -Nru python-urllib3-1.26.2/src/urllib3/exceptions.py python-urllib3-1.26.4/src/urllib3/exceptions.py
--- python-urllib3-1.26.2/src/urllib3/exceptions.py	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/src/urllib3/exceptions.py	2021-03-15 11:03:47.000000000 -0400
@@ -289,7 +289,17 @@
     # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
 
     def __init__(self, scheme):
-        message = "Not supported proxy scheme %s" % scheme
+        # 'localhost' is here because our URL parser parses
+        # localhost:8080 -> scheme=localhost, remove if we fix this.
+        if scheme == "localhost":
+            scheme = None
+        if scheme is None:
+            message = "Proxy URL had no scheme, should start with http:// or https://";
+        else:
+            message = (
+                "Proxy URL had unsupported scheme %s, should use http:// or https://";
+                % scheme
+            )
         super(ProxySchemeUnknown, self).__init__(message)
 
 
diff -Nru python-urllib3-1.26.2/src/urllib3/util/retry.py python-urllib3-1.26.4/src/urllib3/util/retry.py
--- python-urllib3-1.26.2/src/urllib3/util/retry.py	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/src/urllib3/util/retry.py	2021-03-15 11:03:47.000000000 -0400
@@ -253,6 +253,7 @@
                 "Using 'method_whitelist' with Retry is deprecated and "
                 "will be removed in v2.0. Use 'allowed_methods' instead",
                 DeprecationWarning,
+                stacklevel=2,
             )
             allowed_methods = method_whitelist
         if allowed_methods is _Default:
diff -Nru python-urllib3-1.26.2/src/urllib3/_version.py python-urllib3-1.26.4/src/urllib3/_version.py
--- python-urllib3-1.26.2/src/urllib3/_version.py	2020-11-12 18:16:34.000000000 -0400
+++ python-urllib3-1.26.4/src/urllib3/_version.py	2021-03-15 11:03:47.000000000 -0400
@@ -1,2 +1,2 @@
 # This file is protected via CODEOWNERS
-__version__ = "1.26.2"
+__version__ = "1.26.4"
diff -Nru python-urllib3-1.26.2/src/urllib3.egg-info/PKG-INFO python-urllib3-1.26.4/src/urllib3.egg-info/PKG-INFO
--- python-urllib3-1.26.2/src/urllib3.egg-info/PKG-INFO	2020-11-12 18:16:39.000000000 -0400
+++ python-urllib3-1.26.4/src/urllib3.egg-info/PKG-INFO	2021-03-15 11:03:54.000000000 -0400
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: urllib3
-Version: 1.26.2
+Version: 1.26.4
 Summary: HTTP library with thread-safe connection pooling, file post, and more.
 Home-page: https://urllib3.readthedocs.io/
 Author: Andrey Petrov
@@ -116,6 +116,23 @@
         Changes
         =======
         
+        1.26.4 (2021-03-15)
+        -------------------
+        
+        * Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
+          during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.
+        
+        
+        1.26.3 (2021-01-26)
+        -------------------
+        
+        * Fixed bytes and string comparison issue with headers (Pull #2141)
+        
+        * Changed ``ProxySchemeUnknown`` error message to be
+          more actionable if the user supplies a proxy URL without
+          a scheme. (Pull #2107)
+        
+        
         1.26.2 (2020-11-12)
         -------------------
         
diff -Nru python-urllib3-1.26.2/test/conftest.py python-urllib3-1.26.4/test/conftest.py
--- python-urllib3-1.26.2/test/conftest.py	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/test/conftest.py	2021-03-15 11:03:47.000000000 -0400
@@ -65,6 +65,17 @@
 
 
 @pytest.fixture
+def no_localhost_san_server(tmp_path_factory):
+    tmpdir = tmp_path_factory.mktemp("certs")
+    ca = trustme.CA()
+    # non localhost common name
+    server_cert = ca.issue_cert(u"example.com")
+
+    with run_server_in_thread("https", "localhost", tmpdir, ca, server_cert) as cfg:
+        yield cfg
+
+
+@pytest.fixture
 def ip_san_server(tmp_path_factory):
     tmpdir = tmp_path_factory.mktemp("certs")
     ca = trustme.CA()
diff -Nru python-urllib3-1.26.2/test/with_dummyserver/test_proxy_poolmanager.py python-urllib3-1.26.4/test/with_dummyserver/test_proxy_poolmanager.py
--- python-urllib3-1.26.2/test/with_dummyserver/test_proxy_poolmanager.py	2020-11-12 18:16:30.000000000 -0400
+++ python-urllib3-1.26.4/test/with_dummyserver/test_proxy_poolmanager.py	2021-03-15 11:03:47.000000000 -0400
@@ -23,6 +23,7 @@
     ConnectTimeoutError,
     MaxRetryError,
     ProxyError,
+    ProxySchemeUnknown,
     ProxySchemeUnsupported,
     SSLError,
 )
@@ -502,6 +503,27 @@
             r = http.request("GET", "%s/" % self.https_url.upper())
             assert r.status == 200
 
+    @pytest.mark.parametrize(
+        "url, error_msg",
+        [
+            (
+                "127.0.0.1",
+                "Proxy URL had no scheme, should start with http:// or https://";,
+            ),
+            (
+                "localhost:8080",
+                "Proxy URL had no scheme, should start with http:// or https://";,
+            ),
+            (
+                "ftp://google.com";,
+                "Proxy URL had unsupported scheme ftp, should use http:// or https://";,
+            ),
+        ],
+    )
+    def test_invalid_schema(self, url, error_msg):
+        with pytest.raises(ProxySchemeUnknown, match=error_msg):
+            proxy_from_url(url)
+
 
 @pytest.mark.skipif(not HAS_IPV6, reason="Only runs on IPv6 systems")
 class TestIPv6HTTPProxyManager(IPv6HTTPDummyProxyTestCase):
@@ -521,3 +543,25 @@
 
             r = http.request("GET", "%s/" % self.https_url)
             assert r.status == 200
+
+
+class TestHTTPSProxyVerification:
+    @onlyPy3
+    def test_https_proxy_hostname_verification(self, no_localhost_san_server):
+        bad_server = no_localhost_san_server
+        bad_proxy_url = "https://%s:%s"; % (bad_server.host, bad_server.port)
+
+        # An exception will be raised before we contact the destination domain.
+        test_url = "testing.com"
+        with proxy_from_url(bad_proxy_url, ca_certs=bad_server.ca_certs) as https:
+            with pytest.raises(MaxRetryError) as e:
+                https.request("GET", "http://%s/"; % test_url)
+            assert isinstance(e.value.reason, SSLError)
+            assert "hostname 'localhost' doesn't match" in str(e.value.reason)
+
+            with pytest.raises(MaxRetryError) as e:
+                https.request("GET", "https://%s/"; % test_url)
+            assert isinstance(e.value.reason, SSLError)
+            assert "hostname 'localhost' doesn't match" in str(
+                e.value.reason
+            ) or "Hostname mismatch" in str(e.value.reason)

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: