| Message ID | 20260127154214.97186-1-adarsh.jagadish.kamini@est.tech |
|---|---|
| State | Rejected, archived |
| Delegated to: | Yoann Congal |
| Headers | show |
| Series | [scarthgap,v2] Backport fix for CVE-2026-21441 Python3 urllib3 | expand |
Le 27/01/2026 à 16:42, adarsh.jagadish.kamini via lists.openembedded.org a écrit : > From: Adarsh Jagadish Kamini <adarsh.jagadish.kamini@est.tech> > > Include the patch linked in the NVD report : https://nvd.nist.gov/vuln/detail/CVE-2026-21441 > Signed-off-by: Adarsh Jagadish Kamini <adarsh.jagadish.kamini@est.tech> This patch looks like it is needed on master as well. Can you wait for it to merge there before sending a backport request? Thanks! > --- > .../python3-urllib3/CVE-2026-21441.patch | 105 ++++++++++++++++++ > .../python/python3-urllib3_2.2.2.bb | 1 + > 2 files changed, 106 insertions(+) > create mode 100644 meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch > > diff --git a/meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch b/meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch > new file mode 100644 > index 0000000000..16af67af31 > --- /dev/null > +++ b/meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch > @@ -0,0 +1,105 @@ > +From 686d2bdd4affd3c86e605f54a72afe53c920f72f Mon Sep 17 00:00:00 2001 > +From: Illia Volochii <illia.volochii@gmail.com> > +Date: Wed, 7 Jan 2026 18:07:30 +0200 > +Subject: [PATCH] Backport fix CVE-2026-21441 python urllib3 > + > +Original commit: 8864ac407bba8607950025e0979c4c69bc7abc7b > +Original-author: Illia Volochii <illia.volochii@gmail.com> > + > +Bugfixes > +-------- > + > +- Fixed a high-severity security issue where decompression-bomb safeguards of > + the streaming API were bypassed when HTTP redirects were followed. > + (`GHSA-38jv-5279-wg99 <https://github.com/urllib3/urllib3/security/advisories/GHSA-38jv-5279-wg99>`__) > + > +* Stop decoding response content during redirects needlessly > + > +* Rename the new query parameter > + > +* Add a changelog entry > + > +Fixes CVE-2026-21441 > +CVE: CVE-2026-21441 > + > +Upstream-Status: Backport [https://github.com/urllib3/urllib3/commit/8864ac407bba8607950025e0979c4c69bc7abc7b] > + > +Signed-off-by: Adarsh Jagadish Kamini <adarsh.jagadish.kamini@est.tech> > +--- > + dummyserver/app.py | 8 +++++++- > + src/urllib3/response.py | 6 +++++- > + test/with_dummyserver/test_connectionpool.py | 19 +++++++++++++++++++ > + 3 files changed, 31 insertions(+), 2 deletions(-) > + > +diff --git a/dummyserver/app.py b/dummyserver/app.py > +index 9fc9d1b7..c4978152 100644 > +--- a/dummyserver/app.py > ++++ b/dummyserver/app.py > +@@ -233,10 +233,16 @@ async def redirect() -> ResponseReturnValue: > + values = await request.values > + target = values.get("target", "/") > + status = values.get("status", "303 See Other") > ++ compressed = values.get("compressed") == "true" > + status_code = status.split(" ")[0] > + > + headers = [("Location", target)] > +- return await make_response("", status_code, headers) > ++ if compressed: > ++ headers.append(("Content-Encoding", "gzip")) > ++ data = gzip.compress(b"foo") > ++ else: > ++ data = b"" > ++ return await make_response(data, status_code, headers) > + > + > + @hypercorn_app.route("/redirect_after") > +diff --git a/src/urllib3/response.py b/src/urllib3/response.py > +index a0273d65..909da62b 100644 > +--- a/src/urllib3/response.py > ++++ b/src/urllib3/response.py > +@@ -646,7 +646,11 @@ class HTTPResponse(BaseHTTPResponse): > + Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. > + """ > + try: > +- self.read() > ++ self.read( > ++ # Do not spend resources decoding the content unless > ++ # decoding has already been initiated. > ++ decode_content=self._has_decoded_content, > ++ ) > + except (HTTPError, OSError, BaseSSLError, HTTPException): > + pass > + > +diff --git a/test/with_dummyserver/test_connectionpool.py b/test/with_dummyserver/test_connectionpool.py > +index 4fbe6a4f..ebcdf9bf 100644 > +--- a/test/with_dummyserver/test_connectionpool.py > ++++ b/test/with_dummyserver/test_connectionpool.py > +@@ -480,6 +480,25 @@ class TestConnectionPool(HypercornDummyServerTestCase): > + assert r.status == 200 > + assert r.data == b"Dummy server!" > + > ++ @mock.patch("urllib3.response.GzipDecoder.decompress") > ++ def test_no_decoding_with_redirect_when_preload_disabled( > ++ self, gzip_decompress: mock.MagicMock > ++ ) -> None: > ++ """ > ++ Test that urllib3 does not attempt to decode a gzipped redirect > ++ response when `preload_content` is set to `False`. > ++ """ > ++ with HTTPConnectionPool(self.host, self.port) as pool: > ++ # Three requests are expected: two redirects and one final / 200 OK. > ++ response = pool.request( > ++ "GET", > ++ "/redirect", > ++ fields={"target": "/redirect?compressed=true", "compressed": "true"}, > ++ preload_content=False, > ++ ) > ++ assert response.status == 200 > ++ gzip_decompress.assert_not_called() > ++ > + def test_303_redirect_makes_request_lose_body(self) -> None: > + with HTTPConnectionPool(self.host, self.port) as pool: > + response = pool.request( > +-- > +2.44.0 > + > diff --git a/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb b/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb > index 620927322a..f6ac8f89ca 100644 > --- a/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb > +++ b/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb > @@ -11,6 +11,7 @@ SRC_URI += " \ > file://CVE-2025-50181.patch \ > file://CVE-2025-66418.patch \ > file://CVE-2025-66471.patch \ > + file://CVE-2026-21441.patch \ > " > > RDEPENDS:${PN} += "\ > > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#230084): https://lists.openembedded.org/g/openembedded-core/message/230084 > Mute This Topic: https://lists.openembedded.org/mt/117504613/4316185 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [yoann.congal@smile.fr] > -=-=-=-=-=-=-=-=-=-=-=- >
diff --git a/meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch b/meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch new file mode 100644 index 0000000000..16af67af31 --- /dev/null +++ b/meta/recipes-devtools/python/python3-urllib3/CVE-2026-21441.patch @@ -0,0 +1,105 @@ +From 686d2bdd4affd3c86e605f54a72afe53c920f72f Mon Sep 17 00:00:00 2001 +From: Illia Volochii <illia.volochii@gmail.com> +Date: Wed, 7 Jan 2026 18:07:30 +0200 +Subject: [PATCH] Backport fix CVE-2026-21441 python urllib3 + +Original commit: 8864ac407bba8607950025e0979c4c69bc7abc7b +Original-author: Illia Volochii <illia.volochii@gmail.com> + +Bugfixes +-------- + +- Fixed a high-severity security issue where decompression-bomb safeguards of + the streaming API were bypassed when HTTP redirects were followed. + (`GHSA-38jv-5279-wg99 <https://github.com/urllib3/urllib3/security/advisories/GHSA-38jv-5279-wg99>`__) + +* Stop decoding response content during redirects needlessly + +* Rename the new query parameter + +* Add a changelog entry + +Fixes CVE-2026-21441 +CVE: CVE-2026-21441 + +Upstream-Status: Backport [https://github.com/urllib3/urllib3/commit/8864ac407bba8607950025e0979c4c69bc7abc7b] + +Signed-off-by: Adarsh Jagadish Kamini <adarsh.jagadish.kamini@est.tech> +--- + dummyserver/app.py | 8 +++++++- + src/urllib3/response.py | 6 +++++- + test/with_dummyserver/test_connectionpool.py | 19 +++++++++++++++++++ + 3 files changed, 31 insertions(+), 2 deletions(-) + +diff --git a/dummyserver/app.py b/dummyserver/app.py +index 9fc9d1b7..c4978152 100644 +--- a/dummyserver/app.py ++++ b/dummyserver/app.py +@@ -233,10 +233,16 @@ async def redirect() -> ResponseReturnValue: + values = await request.values + target = values.get("target", "/") + status = values.get("status", "303 See Other") ++ compressed = values.get("compressed") == "true" + status_code = status.split(" ")[0] + + headers = [("Location", target)] +- return await make_response("", status_code, headers) ++ if compressed: ++ headers.append(("Content-Encoding", "gzip")) ++ data = gzip.compress(b"foo") ++ else: ++ data = b"" ++ return await make_response(data, status_code, headers) + + + @hypercorn_app.route("/redirect_after") +diff --git a/src/urllib3/response.py b/src/urllib3/response.py +index a0273d65..909da62b 100644 +--- a/src/urllib3/response.py ++++ b/src/urllib3/response.py +@@ -646,7 +646,11 @@ class HTTPResponse(BaseHTTPResponse): + Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. + """ + try: +- self.read() ++ self.read( ++ # Do not spend resources decoding the content unless ++ # decoding has already been initiated. ++ decode_content=self._has_decoded_content, ++ ) + except (HTTPError, OSError, BaseSSLError, HTTPException): + pass + +diff --git a/test/with_dummyserver/test_connectionpool.py b/test/with_dummyserver/test_connectionpool.py +index 4fbe6a4f..ebcdf9bf 100644 +--- a/test/with_dummyserver/test_connectionpool.py ++++ b/test/with_dummyserver/test_connectionpool.py +@@ -480,6 +480,25 @@ class TestConnectionPool(HypercornDummyServerTestCase): + assert r.status == 200 + assert r.data == b"Dummy server!" + ++ @mock.patch("urllib3.response.GzipDecoder.decompress") ++ def test_no_decoding_with_redirect_when_preload_disabled( ++ self, gzip_decompress: mock.MagicMock ++ ) -> None: ++ """ ++ Test that urllib3 does not attempt to decode a gzipped redirect ++ response when `preload_content` is set to `False`. ++ """ ++ with HTTPConnectionPool(self.host, self.port) as pool: ++ # Three requests are expected: two redirects and one final / 200 OK. ++ response = pool.request( ++ "GET", ++ "/redirect", ++ fields={"target": "/redirect?compressed=true", "compressed": "true"}, ++ preload_content=False, ++ ) ++ assert response.status == 200 ++ gzip_decompress.assert_not_called() ++ + def test_303_redirect_makes_request_lose_body(self) -> None: + with HTTPConnectionPool(self.host, self.port) as pool: + response = pool.request( +-- +2.44.0 + diff --git a/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb b/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb index 620927322a..f6ac8f89ca 100644 --- a/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb +++ b/meta/recipes-devtools/python/python3-urllib3_2.2.2.bb @@ -11,6 +11,7 @@ SRC_URI += " \ file://CVE-2025-50181.patch \ file://CVE-2025-66418.patch \ file://CVE-2025-66471.patch \ + file://CVE-2026-21441.patch \ " RDEPENDS:${PN} += "\