import UBI python3.12-3.12.12-3.el10_1
This commit is contained in:
parent
5e7f5070b7
commit
e908e2868e
139
00471-cve-2025-12084.patch
Normal file
139
00471-cve-2025-12084.patch
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Miss Islington (bot)"
|
||||||
|
<31488909+miss-islington@users.noreply.github.com>
|
||||||
|
Date: Mon, 22 Dec 2025 14:48:49 +0100
|
||||||
|
Subject: 00471: CVE-2025-12084
|
||||||
|
|
||||||
|
* gh-142145: Remove quadratic behavior in node ID cache clearing (GH-142146)
|
||||||
|
* gh-142754: Ensure that Element & Attr instances have the ownerDocument attribute (GH-142794)
|
||||||
|
(cherry picked from commit 1cc7551b3f9f71efbc88d96dce90f82de98b2454)
|
||||||
|
(cherry picked from commit 08d8e18ad81cd45bc4a27d6da478b51ea49486e4)
|
||||||
|
(cherry picked from commit 8d2d7bb2e754f8649a68ce4116271a4932f76907)
|
||||||
|
|
||||||
|
Co-authored-by: Jacob Walls <38668450+jacobtylerwalls@users.noreply.github.com>
|
||||||
|
Co-authored-by: Seth Michael Larson <seth@python.org>
|
||||||
|
Co-authored-by: Petr Viktorin <encukou@gmail.com>
|
||||||
|
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
|
||||||
|
Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
|
||||||
|
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
|
||||||
|
Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
|
||||||
|
Co-authored-by: Gregory P. Smith <greg@krypto.org>
|
||||||
|
---
|
||||||
|
Lib/test/test_minidom.py | 33 ++++++++++++++++++-
|
||||||
|
Lib/xml/dom/minidom.py | 11 ++-----
|
||||||
|
...-12-01-09-36-45.gh-issue-142145.tcAUhg.rst | 6 ++++
|
||||||
|
3 files changed, 41 insertions(+), 9 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py
|
||||||
|
index 699265ccad..ab4823c831 100644
|
||||||
|
--- a/Lib/test/test_minidom.py
|
||||||
|
+++ b/Lib/test/test_minidom.py
|
||||||
|
@@ -2,13 +2,14 @@
|
||||||
|
|
||||||
|
import copy
|
||||||
|
import pickle
|
||||||
|
+import time
|
||||||
|
import io
|
||||||
|
from test import support
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import xml.dom.minidom
|
||||||
|
|
||||||
|
-from xml.dom.minidom import parse, Attr, Node, Document, parseString
|
||||||
|
+from xml.dom.minidom import parse, Attr, Node, Document, Element, parseString
|
||||||
|
from xml.dom.minidom import getDOMImplementation
|
||||||
|
from xml.parsers.expat import ExpatError
|
||||||
|
|
||||||
|
@@ -176,6 +177,36 @@ def testAppendChild(self):
|
||||||
|
self.confirm(dom.documentElement.childNodes[-1].data == "Hello")
|
||||||
|
dom.unlink()
|
||||||
|
|
||||||
|
+ @support.requires_resource('cpu')
|
||||||
|
+ def testAppendChildNoQuadraticComplexity(self):
|
||||||
|
+ impl = getDOMImplementation()
|
||||||
|
+
|
||||||
|
+ newdoc = impl.createDocument(None, "some_tag", None)
|
||||||
|
+ top_element = newdoc.documentElement
|
||||||
|
+ children = [newdoc.createElement(f"child-{i}") for i in range(1, 2 ** 15 + 1)]
|
||||||
|
+ element = top_element
|
||||||
|
+
|
||||||
|
+ start = time.monotonic()
|
||||||
|
+ for child in children:
|
||||||
|
+ element.appendChild(child)
|
||||||
|
+ element = child
|
||||||
|
+ end = time.monotonic()
|
||||||
|
+
|
||||||
|
+ # This example used to take at least 30 seconds.
|
||||||
|
+ # Conservative assertion due to the wide variety of systems and
|
||||||
|
+ # build configs timing based tests wind up run under.
|
||||||
|
+ # A --with-address-sanitizer --with-pydebug build on a rpi5 still
|
||||||
|
+ # completes this loop in <0.5 seconds.
|
||||||
|
+ self.assertLess(end - start, 4)
|
||||||
|
+
|
||||||
|
+ def testSetAttributeNodeWithoutOwnerDocument(self):
|
||||||
|
+ # regression test for gh-142754
|
||||||
|
+ elem = Element("test")
|
||||||
|
+ attr = Attr("id")
|
||||||
|
+ attr.value = "test-id"
|
||||||
|
+ elem.setAttributeNode(attr)
|
||||||
|
+ self.assertEqual(elem.getAttribute("id"), "test-id")
|
||||||
|
+
|
||||||
|
def testAppendChildFragment(self):
|
||||||
|
dom, orig, c1, c2, c3, frag = self._create_fragment_test_nodes()
|
||||||
|
dom.documentElement.appendChild(frag)
|
||||||
|
diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py
|
||||||
|
index ef8a159833..cada981f39 100644
|
||||||
|
--- a/Lib/xml/dom/minidom.py
|
||||||
|
+++ b/Lib/xml/dom/minidom.py
|
||||||
|
@@ -292,13 +292,6 @@ def _append_child(self, node):
|
||||||
|
childNodes.append(node)
|
||||||
|
node.parentNode = self
|
||||||
|
|
||||||
|
-def _in_document(node):
|
||||||
|
- # return True iff node is part of a document tree
|
||||||
|
- while node is not None:
|
||||||
|
- if node.nodeType == Node.DOCUMENT_NODE:
|
||||||
|
- return True
|
||||||
|
- node = node.parentNode
|
||||||
|
- return False
|
||||||
|
|
||||||
|
def _write_data(writer, data):
|
||||||
|
"Writes datachars to writer."
|
||||||
|
@@ -355,6 +348,7 @@ class Attr(Node):
|
||||||
|
def __init__(self, qName, namespaceURI=EMPTY_NAMESPACE, localName=None,
|
||||||
|
prefix=None):
|
||||||
|
self.ownerElement = None
|
||||||
|
+ self.ownerDocument = None
|
||||||
|
self._name = qName
|
||||||
|
self.namespaceURI = namespaceURI
|
||||||
|
self._prefix = prefix
|
||||||
|
@@ -680,6 +674,7 @@ class Element(Node):
|
||||||
|
|
||||||
|
def __init__(self, tagName, namespaceURI=EMPTY_NAMESPACE, prefix=None,
|
||||||
|
localName=None):
|
||||||
|
+ self.ownerDocument = None
|
||||||
|
self.parentNode = None
|
||||||
|
self.tagName = self.nodeName = tagName
|
||||||
|
self.prefix = prefix
|
||||||
|
@@ -1539,7 +1534,7 @@ def _clear_id_cache(node):
|
||||||
|
if node.nodeType == Node.DOCUMENT_NODE:
|
||||||
|
node._id_cache.clear()
|
||||||
|
node._id_search_stack = None
|
||||||
|
- elif _in_document(node):
|
||||||
|
+ elif node.ownerDocument:
|
||||||
|
node.ownerDocument._id_cache.clear()
|
||||||
|
node.ownerDocument._id_search_stack= None
|
||||||
|
|
||||||
|
diff --git a/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst b/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..05c7df35d1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Security/2025-12-01-09-36-45.gh-issue-142145.tcAUhg.rst
|
||||||
|
@@ -0,0 +1,6 @@
|
||||||
|
+Remove quadratic behavior in ``xml.minidom`` node ID cache clearing. In order
|
||||||
|
+to do this without breaking existing users, we also add the *ownerDocument*
|
||||||
|
+attribute to :mod:`xml.dom.minidom` elements and attributes created by directly
|
||||||
|
+instantiating the ``Element`` or ``Attr`` class. Note that this way of creating
|
||||||
|
+nodes is not supported; creator functions like
|
||||||
|
+:py:meth:`xml.dom.Document.documentElement` should be used instead.
|
||||||
159
00472-cve-2025-13836.patch
Normal file
159
00472-cve-2025-13836.patch
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Miss Islington (bot)"
|
||||||
|
<31488909+miss-islington@users.noreply.github.com>
|
||||||
|
Date: Mon, 22 Dec 2025 14:50:18 +0100
|
||||||
|
Subject: 00472: CVE-2025-13836
|
||||||
|
|
||||||
|
[3.12] gh-119451: Fix a potential denial of service in http.client (GH-119454) (#142140)
|
||||||
|
|
||||||
|
gh-119451: Fix a potential denial of service in http.client (GH-119454)
|
||||||
|
|
||||||
|
Reading the whole body of the HTTP response could cause OOM if
|
||||||
|
the Content-Length value is too large even if the server does not send
|
||||||
|
a large amount of data. Now the HTTP client reads large data by chunks,
|
||||||
|
therefore the amount of consumed memory is proportional to the amount
|
||||||
|
of sent data.
|
||||||
|
(cherry picked from commit 5a4c4a033a4a54481be6870aa1896fad732555b5)
|
||||||
|
|
||||||
|
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
|
||||||
|
---
|
||||||
|
Lib/http/client.py | 28 ++++++--
|
||||||
|
Lib/test/test_httplib.py | 66 +++++++++++++++++++
|
||||||
|
...-05-23-11-47-48.gh-issue-119451.qkJe9-.rst | 5 ++
|
||||||
|
3 files changed, 95 insertions(+), 4 deletions(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst
|
||||||
|
|
||||||
|
diff --git a/Lib/http/client.py b/Lib/http/client.py
|
||||||
|
index fb29923d94..70451d67d4 100644
|
||||||
|
--- a/Lib/http/client.py
|
||||||
|
+++ b/Lib/http/client.py
|
||||||
|
@@ -111,6 +111,11 @@
|
||||||
|
_MAXLINE = 65536
|
||||||
|
_MAXHEADERS = 100
|
||||||
|
|
||||||
|
+# Data larger than this will be read in chunks, to prevent extreme
|
||||||
|
+# overallocation.
|
||||||
|
+_MIN_READ_BUF_SIZE = 1 << 20
|
||||||
|
+
|
||||||
|
+
|
||||||
|
# Header name/value ABNF (http://tools.ietf.org/html/rfc7230#section-3.2)
|
||||||
|
#
|
||||||
|
# VCHAR = %x21-7E
|
||||||
|
@@ -639,10 +644,25 @@ def _safe_read(self, amt):
|
||||||
|
reading. If the bytes are truly not available (due to EOF), then the
|
||||||
|
IncompleteRead exception can be used to detect the problem.
|
||||||
|
"""
|
||||||
|
- data = self.fp.read(amt)
|
||||||
|
- if len(data) < amt:
|
||||||
|
- raise IncompleteRead(data, amt-len(data))
|
||||||
|
- return data
|
||||||
|
+ cursize = min(amt, _MIN_READ_BUF_SIZE)
|
||||||
|
+ data = self.fp.read(cursize)
|
||||||
|
+ if len(data) >= amt:
|
||||||
|
+ return data
|
||||||
|
+ if len(data) < cursize:
|
||||||
|
+ raise IncompleteRead(data, amt - len(data))
|
||||||
|
+
|
||||||
|
+ data = io.BytesIO(data)
|
||||||
|
+ data.seek(0, 2)
|
||||||
|
+ while True:
|
||||||
|
+ # This is a geometric increase in read size (never more than
|
||||||
|
+ # doubling out the current length of data per loop iteration).
|
||||||
|
+ delta = min(cursize, amt - cursize)
|
||||||
|
+ data.write(self.fp.read(delta))
|
||||||
|
+ if data.tell() >= amt:
|
||||||
|
+ return data.getvalue()
|
||||||
|
+ cursize += delta
|
||||||
|
+ if data.tell() < cursize:
|
||||||
|
+ raise IncompleteRead(data.getvalue(), amt - data.tell())
|
||||||
|
|
||||||
|
def _safe_readinto(self, b):
|
||||||
|
"""Same as _safe_read, but for reading into a buffer."""
|
||||||
|
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
|
||||||
|
index 01f5a10190..e46dac0077 100644
|
||||||
|
--- a/Lib/test/test_httplib.py
|
||||||
|
+++ b/Lib/test/test_httplib.py
|
||||||
|
@@ -1452,6 +1452,72 @@ def run_server():
|
||||||
|
thread.join()
|
||||||
|
self.assertEqual(result, b"proxied data\n")
|
||||||
|
|
||||||
|
+ def test_large_content_length(self):
|
||||||
|
+ serv = socket.create_server((HOST, 0))
|
||||||
|
+ self.addCleanup(serv.close)
|
||||||
|
+
|
||||||
|
+ def run_server():
|
||||||
|
+ [conn, address] = serv.accept()
|
||||||
|
+ with conn:
|
||||||
|
+ while conn.recv(1024):
|
||||||
|
+ conn.sendall(
|
||||||
|
+ b"HTTP/1.1 200 Ok\r\n"
|
||||||
|
+ b"Content-Length: %d\r\n"
|
||||||
|
+ b"\r\n" % size)
|
||||||
|
+ conn.sendall(b'A' * (size//3))
|
||||||
|
+ conn.sendall(b'B' * (size - size//3))
|
||||||
|
+
|
||||||
|
+ thread = threading.Thread(target=run_server)
|
||||||
|
+ thread.start()
|
||||||
|
+ self.addCleanup(thread.join, 1.0)
|
||||||
|
+
|
||||||
|
+ conn = client.HTTPConnection(*serv.getsockname())
|
||||||
|
+ try:
|
||||||
|
+ for w in range(15, 27):
|
||||||
|
+ size = 1 << w
|
||||||
|
+ conn.request("GET", "/")
|
||||||
|
+ with conn.getresponse() as response:
|
||||||
|
+ self.assertEqual(len(response.read()), size)
|
||||||
|
+ finally:
|
||||||
|
+ conn.close()
|
||||||
|
+ thread.join(1.0)
|
||||||
|
+
|
||||||
|
+ def test_large_content_length_truncated(self):
|
||||||
|
+ serv = socket.create_server((HOST, 0))
|
||||||
|
+ self.addCleanup(serv.close)
|
||||||
|
+
|
||||||
|
+ def run_server():
|
||||||
|
+ while True:
|
||||||
|
+ [conn, address] = serv.accept()
|
||||||
|
+ with conn:
|
||||||
|
+ conn.recv(1024)
|
||||||
|
+ if not size:
|
||||||
|
+ break
|
||||||
|
+ conn.sendall(
|
||||||
|
+ b"HTTP/1.1 200 Ok\r\n"
|
||||||
|
+ b"Content-Length: %d\r\n"
|
||||||
|
+ b"\r\n"
|
||||||
|
+ b"Text" % size)
|
||||||
|
+
|
||||||
|
+ thread = threading.Thread(target=run_server)
|
||||||
|
+ thread.start()
|
||||||
|
+ self.addCleanup(thread.join, 1.0)
|
||||||
|
+
|
||||||
|
+ conn = client.HTTPConnection(*serv.getsockname())
|
||||||
|
+ try:
|
||||||
|
+ for w in range(18, 65):
|
||||||
|
+ size = 1 << w
|
||||||
|
+ conn.request("GET", "/")
|
||||||
|
+ with conn.getresponse() as response:
|
||||||
|
+ self.assertRaises(client.IncompleteRead, response.read)
|
||||||
|
+ conn.close()
|
||||||
|
+ finally:
|
||||||
|
+ conn.close()
|
||||||
|
+ size = 0
|
||||||
|
+ conn.request("GET", "/")
|
||||||
|
+ conn.close()
|
||||||
|
+ thread.join(1.0)
|
||||||
|
+
|
||||||
|
def test_putrequest_override_domain_validation(self):
|
||||||
|
"""
|
||||||
|
It should be possible to override the default validation
|
||||||
|
diff --git a/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst b/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..6d6f25cd2f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Security/2024-05-23-11-47-48.gh-issue-119451.qkJe9-.rst
|
||||||
|
@@ -0,0 +1,5 @@
|
||||||
|
+Fix a potential memory denial of service in the :mod:`http.client` module.
|
||||||
|
+When connecting to a malicious server, it could cause
|
||||||
|
+an arbitrary amount of memory to be allocated.
|
||||||
|
+This could have led to symptoms including a :exc:`MemoryError`, swapping, out
|
||||||
|
+of memory (OOM) killed processes or containers, or even system crashes.
|
||||||
@ -17,7 +17,7 @@ URL: https://www.python.org/
|
|||||||
#global prerel ...
|
#global prerel ...
|
||||||
%global upstream_version %{general_version}%{?prerel}
|
%global upstream_version %{general_version}%{?prerel}
|
||||||
Version: %{general_version}%{?prerel:~%{prerel}}
|
Version: %{general_version}%{?prerel:~%{prerel}}
|
||||||
Release: 1%{?dist}
|
Release: 3%{?dist}
|
||||||
License: Python-2.0.1
|
License: Python-2.0.1
|
||||||
|
|
||||||
|
|
||||||
@ -434,6 +434,27 @@ Patch462: 00462-fix-pyssl_seterror-handling-ssl_error_syscall.patch
|
|||||||
# will not show the Python functions, irrespective of this patch.
|
# will not show the Python functions, irrespective of this patch.
|
||||||
Patch464: 00464-enable-pac-and-bti-protections-for-aarch64.patch
|
Patch464: 00464-enable-pac-and-bti-protections-for-aarch64.patch
|
||||||
|
|
||||||
|
# 00471 # 37c05f26d11e8e24f2a760167015a267996b1d69
|
||||||
|
# CVE-2025-12084
|
||||||
|
#
|
||||||
|
# * gh-142145: Remove quadratic behavior in node ID cache clearing (GH-142146)
|
||||||
|
# * gh-142754: Ensure that Element & Attr instances have the ownerDocument attribute (GH-142794)
|
||||||
|
Patch471: 00471-cve-2025-12084.patch
|
||||||
|
|
||||||
|
# 00472 # 2ba215eaba508b2cdd7c3acfdf3b9a6e32872274
|
||||||
|
# CVE-2025-13836
|
||||||
|
#
|
||||||
|
# [3.12] gh-119451: Fix a potential denial of service in http.client (GH-119454) (#142140)
|
||||||
|
#
|
||||||
|
# gh-119451: Fix a potential denial of service in http.client (GH-119454)
|
||||||
|
#
|
||||||
|
# Reading the whole body of the HTTP response could cause OOM if
|
||||||
|
# the Content-Length value is too large even if the server does not send
|
||||||
|
# a large amount of data. Now the HTTP client reads large data by chunks,
|
||||||
|
# therefore the amount of consumed memory is proportional to the amount
|
||||||
|
# of sent data.
|
||||||
|
Patch472: 00472-cve-2025-13836.patch
|
||||||
|
|
||||||
# (New patches go here ^^^)
|
# (New patches go here ^^^)
|
||||||
#
|
#
|
||||||
# When adding new patches to "python" and "python3" in Fedora, EL, etc.,
|
# When adding new patches to "python" and "python3" in Fedora, EL, etc.,
|
||||||
@ -1799,6 +1820,14 @@ CheckPython optimized
|
|||||||
# ======================================================
|
# ======================================================
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jan 16 2026 Lumír Balhar <lbalhar@redhat.com> - 3.12.12-3
|
||||||
|
- Security fix for CVE-2025-13836
|
||||||
|
Resolves: RHEL-140978
|
||||||
|
|
||||||
|
* Tue Jan 06 2026 Lumír Balhar <lbalhar@redhat.com> - 3.12.12-2
|
||||||
|
- Security fix for CVE-2025-12084
|
||||||
|
Resolves: RHEL-135387
|
||||||
|
|
||||||
* Fri Oct 10 2025 Karolina Surma <ksurma@redhat.com> - 3.12.12-1
|
* Fri Oct 10 2025 Karolina Surma <ksurma@redhat.com> - 3.12.12-1
|
||||||
- Update to 3.12.12
|
- Update to 3.12.12
|
||||||
- Security fix for CVE-2025-8291
|
- Security fix for CVE-2025-8291
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user