Security fix for CVE-2024-4032
Resolves: RHEL-44060
This commit is contained in:
		
							parent
							
								
									f2d319607d
								
							
						
					
					
						commit
						8ddf38fba2
					
				
							
								
								
									
										356
									
								
								00431-cve-2024-4032.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										356
									
								
								00431-cve-2024-4032.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,356 @@ | ||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: Petr Viktorin <encukou@gmail.com> | ||||
| Date: Tue, 7 May 2024 11:58:20 +0200 | ||||
| Subject: [PATCH] 00431: CVE-2024-4032: incorrect IPv4 and IPv6 private ranges | ||||
| 
 | ||||
| Upstream issue: https://github.com/python/cpython/issues/113171 | ||||
| 
 | ||||
| Backported from 3.8. | ||||
| ---
 | ||||
|  Doc/library/ipaddress.rst                     | 43 ++++++++- | ||||
|  Doc/tools/susp-ignored.csv                    |  8 ++ | ||||
|  Lib/ipaddress.py                              | 95 +++++++++++++++---- | ||||
|  Lib/test/test_ipaddress.py                    | 52 ++++++++++ | ||||
|  ...-03-14-01-38-44.gh-issue-113171.VFnObz.rst |  9 ++ | ||||
|  5 files changed, 186 insertions(+), 21 deletions(-) | ||||
|  create mode 100644 Misc/NEWS.d/next/Library/2024-03-14-01-38-44.gh-issue-113171.VFnObz.rst | ||||
| 
 | ||||
| diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst
 | ||||
| index 4ce1ed1ced..18613babc9 100644
 | ||||
| --- a/Doc/library/ipaddress.rst
 | ||||
| +++ b/Doc/library/ipaddress.rst
 | ||||
| @@ -166,18 +166,53 @@ write code that handles both IP versions correctly.  Address objects are
 | ||||
|   | ||||
|     .. attribute:: is_private | ||||
|   | ||||
| -      ``True`` if the address is allocated for private networks.  See
 | ||||
| +      ``True`` if the address is defined as not globally reachable by
 | ||||
|        iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ | ||||
| -      (for IPv6).
 | ||||
| +      (for IPv6) with the following exceptions:
 | ||||
| +
 | ||||
| +      * ``is_private`` is ``False`` for the shared address space (``100.64.0.0/10``)
 | ||||
| +      * For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the
 | ||||
| +        semantics of the underlying IPv4 addresses and the following condition holds
 | ||||
| +        (see :attr:`IPv6Address.ipv4_mapped`)::
 | ||||
| +
 | ||||
| +            address.is_private == address.ipv4_mapped.is_private
 | ||||
| +
 | ||||
| +      ``is_private`` has value opposite to :attr:`is_global`, except for the shared address space
 | ||||
| +      (``100.64.0.0/10`` range) where they are both ``False``.
 | ||||
| +
 | ||||
| +      .. versionchanged:: 3.8.20
 | ||||
| +
 | ||||
| +         Fixed some false positives and false negatives.
 | ||||
| +
 | ||||
| +         * ``192.0.0.0/24`` is considered private with the exception of ``192.0.0.9/32`` and
 | ||||
| +           ``192.0.0.10/32`` (previously: only the ``192.0.0.0/29`` sub-range was considered private).
 | ||||
| +         * ``64:ff9b:1::/48`` is considered private.
 | ||||
| +         * ``2002::/16`` is considered private.
 | ||||
| +         * There are exceptions within ``2001::/23`` (otherwise considered private): ``2001:1::1/128``,
 | ||||
| +           ``2001:1::2/128``, ``2001:3::/32``, ``2001:4:112::/48``, ``2001:20::/28``, ``2001:30::/28``.
 | ||||
| +           The exceptions are not considered private.
 | ||||
|   | ||||
|     .. attribute:: is_global | ||||
|   | ||||
| -      ``True`` if the address is allocated for public networks.  See
 | ||||
| +      ``True`` if the address is defined as globally reachable by
 | ||||
|        iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ | ||||
| -      (for IPv6).
 | ||||
| +      (for IPv6) with the following exception:
 | ||||
| +
 | ||||
| +      For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the
 | ||||
| +      semantics of the underlying IPv4 addresses and the following condition holds
 | ||||
| +      (see :attr:`IPv6Address.ipv4_mapped`)::
 | ||||
| +
 | ||||
| +         address.is_global == address.ipv4_mapped.is_global
 | ||||
| +
 | ||||
| +      ``is_global`` has value opposite to :attr:`is_private`, except for the shared address space
 | ||||
| +      (``100.64.0.0/10`` range) where they are both ``False``.
 | ||||
|   | ||||
|        .. versionadded:: 3.4 | ||||
|   | ||||
| +      .. versionchanged:: 3.8.20
 | ||||
| +
 | ||||
| +         Fixed some false positives and false negatives, see :attr:`is_private` for details.
 | ||||
| +
 | ||||
|     .. attribute:: is_unspecified | ||||
|   | ||||
|        ``True`` if the address is unspecified.  See :RFC:`5735` (for IPv4) | ||||
| diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv
 | ||||
| index ed434ce77d..6bc0741b12 100644
 | ||||
| --- a/Doc/tools/susp-ignored.csv
 | ||||
| +++ b/Doc/tools/susp-ignored.csv
 | ||||
| @@ -160,6 +160,14 @@ library/ipaddress,,:db00,2001:db00::0/24
 | ||||
|  library/ipaddress,,::,2001:db00::0/24 | ||||
|  library/ipaddress,,:db00,2001:db00::0/ffff:ff00:: | ||||
|  library/ipaddress,,::,2001:db00::0/ffff:ff00:: | ||||
| +library/ipaddress,,:ff9b,64:ff9b:1::/48
 | ||||
| +library/ipaddress,,::,64:ff9b:1::/48
 | ||||
| +library/ipaddress,,::,2001::
 | ||||
| +library/ipaddress,,::,2001:1::
 | ||||
| +library/ipaddress,,::,2001:3::
 | ||||
| +library/ipaddress,,::,2001:4:112::
 | ||||
| +library/ipaddress,,::,2001:20::
 | ||||
| +library/ipaddress,,::,2001:30::
 | ||||
|  library/itertools,,:step,elements from seq[start:stop:step] | ||||
|  library/itertools,,:stop,elements from seq[start:stop:step] | ||||
|  library/logging.handlers,,:port,host:port | ||||
| diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
 | ||||
| index 98492136ca..55d4d62d70 100644
 | ||||
| --- a/Lib/ipaddress.py
 | ||||
| +++ b/Lib/ipaddress.py
 | ||||
| @@ -1302,18 +1302,41 @@ class IPv4Address(_BaseV4, _BaseAddress):
 | ||||
|      @property | ||||
|      @functools.lru_cache() | ||||
|      def is_private(self): | ||||
| -        """Test if this address is allocated for private networks.
 | ||||
| +        """``True`` if the address is defined as not globally reachable by
 | ||||
| +        iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
 | ||||
| +        (for IPv6) with the following exceptions:
 | ||||
|   | ||||
| -        Returns:
 | ||||
| -            A boolean, True if the address is reserved per
 | ||||
| -            iana-ipv4-special-registry.
 | ||||
| +        * ``is_private`` is ``False`` for ``100.64.0.0/10``
 | ||||
| +        * For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the
 | ||||
| +            semantics of the underlying IPv4 addresses and the following condition holds
 | ||||
| +            (see :attr:`IPv6Address.ipv4_mapped`)::
 | ||||
|   | ||||
| +                address.is_private == address.ipv4_mapped.is_private
 | ||||
| +
 | ||||
| +        ``is_private`` has value opposite to :attr:`is_global`, except for the ``100.64.0.0/10``
 | ||||
| +        IPv4 range where they are both ``False``.
 | ||||
|          """ | ||||
| -        return any(self in net for net in self._constants._private_networks)
 | ||||
| +        return (
 | ||||
| +            any(self in net for net in self._constants._private_networks)
 | ||||
| +            and all(self not in net for net in self._constants._private_networks_exceptions)
 | ||||
| +        )
 | ||||
|   | ||||
|      @property | ||||
|      @functools.lru_cache() | ||||
|      def is_global(self): | ||||
| +        """``True`` if the address is defined as globally reachable by
 | ||||
| +        iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
 | ||||
| +        (for IPv6) with the following exception:
 | ||||
| +
 | ||||
| +        For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the
 | ||||
| +        semantics of the underlying IPv4 addresses and the following condition holds
 | ||||
| +        (see :attr:`IPv6Address.ipv4_mapped`)::
 | ||||
| +
 | ||||
| +            address.is_global == address.ipv4_mapped.is_global
 | ||||
| +
 | ||||
| +        ``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10``
 | ||||
| +        IPv4 range where they are both ``False``.
 | ||||
| +        """
 | ||||
|          return self not in self._constants._public_network and not self.is_private | ||||
|   | ||||
|      @property | ||||
| @@ -1548,13 +1571,15 @@ class _IPv4Constants:
 | ||||
|   | ||||
|      _public_network = IPv4Network('100.64.0.0/10') | ||||
|   | ||||
| +    # Not globally reachable address blocks listed on
 | ||||
| +    # https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
 | ||||
|      _private_networks = [ | ||||
|          IPv4Network('0.0.0.0/8'), | ||||
|          IPv4Network('10.0.0.0/8'), | ||||
|          IPv4Network('127.0.0.0/8'), | ||||
|          IPv4Network('169.254.0.0/16'), | ||||
|          IPv4Network('172.16.0.0/12'), | ||||
| -        IPv4Network('192.0.0.0/29'),
 | ||||
| +        IPv4Network('192.0.0.0/24'),
 | ||||
|          IPv4Network('192.0.0.170/31'), | ||||
|          IPv4Network('192.0.2.0/24'), | ||||
|          IPv4Network('192.168.0.0/16'), | ||||
| @@ -1565,6 +1590,11 @@ class _IPv4Constants:
 | ||||
|          IPv4Network('255.255.255.255/32'), | ||||
|          ] | ||||
|   | ||||
| +    _private_networks_exceptions = [
 | ||||
| +        IPv4Network('192.0.0.9/32'),
 | ||||
| +        IPv4Network('192.0.0.10/32'),
 | ||||
| +    ]
 | ||||
| +
 | ||||
|      _reserved_network = IPv4Network('240.0.0.0/4') | ||||
|   | ||||
|      _unspecified_address = IPv4Address('0.0.0.0') | ||||
| @@ -1953,23 +1983,42 @@ class IPv6Address(_BaseV6, _BaseAddress):
 | ||||
|      @property | ||||
|      @functools.lru_cache() | ||||
|      def is_private(self): | ||||
| -        """Test if this address is allocated for private networks.
 | ||||
| +        """``True`` if the address is defined as not globally reachable by
 | ||||
| +        iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
 | ||||
| +        (for IPv6) with the following exceptions:
 | ||||
|   | ||||
| -        Returns:
 | ||||
| -            A boolean, True if the address is reserved per
 | ||||
| -            iana-ipv6-special-registry.
 | ||||
| +        * ``is_private`` is ``False`` for ``100.64.0.0/10``
 | ||||
| +        * For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the
 | ||||
| +            semantics of the underlying IPv4 addresses and the following condition holds
 | ||||
| +            (see :attr:`IPv6Address.ipv4_mapped`)::
 | ||||
|   | ||||
| +                address.is_private == address.ipv4_mapped.is_private
 | ||||
| +
 | ||||
| +        ``is_private`` has value opposite to :attr:`is_global`, except for the ``100.64.0.0/10``
 | ||||
| +        IPv4 range where they are both ``False``.
 | ||||
|          """ | ||||
| -        return any(self in net for net in self._constants._private_networks)
 | ||||
| +        ipv4_mapped = self.ipv4_mapped
 | ||||
| +        if ipv4_mapped is not None:
 | ||||
| +            return ipv4_mapped.is_private
 | ||||
| +        return (
 | ||||
| +            any(self in net for net in self._constants._private_networks)
 | ||||
| +            and all(self not in net for net in self._constants._private_networks_exceptions)
 | ||||
| +        )
 | ||||
|   | ||||
|      @property | ||||
|      def is_global(self): | ||||
| -        """Test if this address is allocated for public networks.
 | ||||
| +        """``True`` if the address is defined as globally reachable by
 | ||||
| +        iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
 | ||||
| +        (for IPv6) with the following exception:
 | ||||
|   | ||||
| -        Returns:
 | ||||
| -            A boolean, true if the address is not reserved per
 | ||||
| -            iana-ipv6-special-registry.
 | ||||
| +        For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the
 | ||||
| +        semantics of the underlying IPv4 addresses and the following condition holds
 | ||||
| +        (see :attr:`IPv6Address.ipv4_mapped`)::
 | ||||
|   | ||||
| +            address.is_global == address.ipv4_mapped.is_global
 | ||||
| +
 | ||||
| +        ``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10``
 | ||||
| +        IPv4 range where they are both ``False``.
 | ||||
|          """ | ||||
|          return not self.is_private | ||||
|   | ||||
| @@ -2236,19 +2285,31 @@ class _IPv6Constants:
 | ||||
|   | ||||
|      _multicast_network = IPv6Network('ff00::/8') | ||||
|   | ||||
| +    # Not globally reachable address blocks listed on
 | ||||
| +    # https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
 | ||||
|      _private_networks = [ | ||||
|          IPv6Network('::1/128'), | ||||
|          IPv6Network('::/128'), | ||||
|          IPv6Network('::ffff:0:0/96'), | ||||
| +        IPv6Network('64:ff9b:1::/48'),
 | ||||
|          IPv6Network('100::/64'), | ||||
|          IPv6Network('2001::/23'), | ||||
| -        IPv6Network('2001:2::/48'),
 | ||||
|          IPv6Network('2001:db8::/32'), | ||||
| -        IPv6Network('2001:10::/28'),
 | ||||
| +        # IANA says N/A, let's consider it not globally reachable to be safe
 | ||||
| +        IPv6Network('2002::/16'),
 | ||||
|          IPv6Network('fc00::/7'), | ||||
|          IPv6Network('fe80::/10'), | ||||
|          ] | ||||
|   | ||||
| +    _private_networks_exceptions = [
 | ||||
| +        IPv6Network('2001:1::1/128'),
 | ||||
| +        IPv6Network('2001:1::2/128'),
 | ||||
| +        IPv6Network('2001:3::/32'),
 | ||||
| +        IPv6Network('2001:4:112::/48'),
 | ||||
| +        IPv6Network('2001:20::/28'),
 | ||||
| +        IPv6Network('2001:30::/28'),
 | ||||
| +    ]
 | ||||
| +
 | ||||
|      _reserved_networks = [ | ||||
|          IPv6Network('::/8'), IPv6Network('100::/8'), | ||||
|          IPv6Network('200::/7'), IPv6Network('400::/6'), | ||||
| diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
 | ||||
| index 7de444af4a..716846b2ae 100644
 | ||||
| --- a/Lib/test/test_ipaddress.py
 | ||||
| +++ b/Lib/test/test_ipaddress.py
 | ||||
| @@ -1665,6 +1665,10 @@ class IpaddrUnitTest(unittest.TestCase):
 | ||||
|          self.assertEqual(True, ipaddress.ip_address( | ||||
|                  '172.31.255.255').is_private) | ||||
|          self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private) | ||||
| +        self.assertFalse(ipaddress.ip_address('192.0.0.0').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('192.0.0.9').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('192.0.0.10').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('192.0.0.255').is_global)
 | ||||
|   | ||||
|          self.assertEqual(True, | ||||
|                           ipaddress.ip_address('169.254.100.200').is_link_local) | ||||
| @@ -1680,6 +1684,40 @@ class IpaddrUnitTest(unittest.TestCase):
 | ||||
|          self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback) | ||||
|          self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified) | ||||
|   | ||||
| +    def testPrivateNetworks(self):
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("0.0.0.0/0").is_private)
 | ||||
| +        self.assertEqual(False, ipaddress.ip_network("1.0.0.0/8").is_private)
 | ||||
| +
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("0.0.0.0/8").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("10.0.0.0/8").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("127.0.0.0/8").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("169.254.0.0/16").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("172.16.0.0/12").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("192.0.0.0/29").is_private)
 | ||||
| +        self.assertEqual(False, ipaddress.ip_network("192.0.0.9/32").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("192.0.0.170/31").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("192.0.2.0/24").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("192.168.0.0/16").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("198.18.0.0/15").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("198.51.100.0/24").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("203.0.113.0/24").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("240.0.0.0/4").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("255.255.255.255/32").is_private)
 | ||||
| +
 | ||||
| +        self.assertEqual(False, ipaddress.ip_network("::/0").is_private)
 | ||||
| +        self.assertEqual(False, ipaddress.ip_network("::ff/128").is_private)
 | ||||
| +
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("::1/128").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("::/128").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("::ffff:0:0/96").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("100::/64").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("2001:2::/48").is_private)
 | ||||
| +        self.assertEqual(False, ipaddress.ip_network("2001:3::/48").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("2001:db8::/32").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("2001:10::/28").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("fc00::/7").is_private)
 | ||||
| +        self.assertEqual(True, ipaddress.ip_network("fe80::/10").is_private)
 | ||||
| +
 | ||||
|      def testReservedIpv6(self): | ||||
|   | ||||
|          self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast) | ||||
| @@ -1753,6 +1791,20 @@ class IpaddrUnitTest(unittest.TestCase):
 | ||||
|          self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified) | ||||
|          self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified) | ||||
|   | ||||
| +        self.assertFalse(ipaddress.ip_address('64:ff9b:1::').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('2001::').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('2001:1::1').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('2001:1::2').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('2001:2::').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('2001:3::').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('2001:4::').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('2001:4:112::').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('2001:10::').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('2001:20::').is_global)
 | ||||
| +        self.assertTrue(ipaddress.ip_address('2001:30::').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('2001:40::').is_global)
 | ||||
| +        self.assertFalse(ipaddress.ip_address('2002::').is_global)
 | ||||
| +
 | ||||
|          # some generic IETF reserved addresses | ||||
|          self.assertEqual(True, ipaddress.ip_address('100::').is_reserved) | ||||
|          self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved) | ||||
| diff --git a/Misc/NEWS.d/next/Library/2024-03-14-01-38-44.gh-issue-113171.VFnObz.rst b/Misc/NEWS.d/next/Library/2024-03-14-01-38-44.gh-issue-113171.VFnObz.rst
 | ||||
| new file mode 100644 | ||||
| index 0000000000..f9a72473be
 | ||||
| --- /dev/null
 | ||||
| +++ b/Misc/NEWS.d/next/Library/2024-03-14-01-38-44.gh-issue-113171.VFnObz.rst
 | ||||
| @@ -0,0 +1,9 @@
 | ||||
| +Fixed various false positives and false negatives in
 | ||||
| +
 | ||||
| +* :attr:`ipaddress.IPv4Address.is_private` (see these docs for details)
 | ||||
| +* :attr:`ipaddress.IPv4Address.is_global`
 | ||||
| +* :attr:`ipaddress.IPv6Address.is_private`
 | ||||
| +* :attr:`ipaddress.IPv6Address.is_global`
 | ||||
| +
 | ||||
| +Also in the corresponding :class:`ipaddress.IPv4Network` and :class:`ipaddress.IPv6Network`
 | ||||
| +attributes.
 | ||||
							
								
								
									
										15
									
								
								python3.spec
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								python3.spec
									
									
									
									
									
								
							| @ -14,7 +14,7 @@ URL: https://www.python.org/ | ||||
| #  WARNING  When rebasing to a new Python version, | ||||
| #           remember to update the python3-docs package as well | ||||
| Version: %{pybasever}.8 | ||||
| Release: 62%{?dist} | ||||
| Release: 63%{?dist} | ||||
| License: Python | ||||
| 
 | ||||
| 
 | ||||
| @ -874,6 +874,14 @@ Patch426: 00426-CVE-2023-6597.patch | ||||
| # Patch rebased from 3.8. | ||||
| Patch427: 00427-CVE-2024-0450.patch | ||||
| 
 | ||||
| # 00431 # | ||||
| # CVE-2024-4032: incorrect IPv4 and IPv6 private ranges | ||||
| # | ||||
| # Upstream issue: https://github.com/python/cpython/issues/113171 | ||||
| # | ||||
| # Backported from 3.8. | ||||
| Patch431: 00431-cve-2024-4032.patch | ||||
| 
 | ||||
| # (New patches go here ^^^) | ||||
| # | ||||
| # When adding new patches to "python" and "python3" in Fedora, EL, etc., | ||||
| @ -1230,6 +1238,7 @@ git apply %{PATCH351} | ||||
| %patch422 -p1 | ||||
| %patch426 -p1 | ||||
| %patch427 -p1 | ||||
| %patch431 -p1 | ||||
| 
 | ||||
| # Remove files that should be generated by the build | ||||
| # (This is after patching, so that we can use patches directly from upstream) | ||||
| @ -2161,6 +2170,10 @@ fi | ||||
| # ====================================================== | ||||
| 
 | ||||
| %changelog | ||||
| * Thu Jul 04 2024 Lumír Balhar <lbalhar@redhat.com> - 3.6.8-63 | ||||
| - Security fix for CVE-2024-4032 | ||||
| Resolves: RHEL-44060 | ||||
| 
 | ||||
| * Wed Apr 24 2024 Lumír Balhar <lbalhar@redhat.com> - 3.6.8-62 | ||||
| - Security fix for CVE-2024-0450 | ||||
| Resolves: RHEL-33683 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user