Skip to content

Commit dd995b7

Browse files
authored
Fix CVE-2024-6345 in python3 (#9904)
1 parent a76c83a commit dd995b7

6 files changed

Lines changed: 170 additions & 27 deletions

File tree

SPECS/python3/CVE-2024-6345.patch

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
From a537ec061cdfb9f39ef721111bf6927627fe91ec Mon Sep 17 00:00:00 2001
2+
From: Sindhu Karri <lakarri@microsoft.com>
3+
Date: Mon, 22 Jul 2024 12:23:41 +0000
4+
Subject: [PATCH] Fix CVE-2024-6345 in package_index.py
5+
6+
---
7+
setuptools/package_index.py | 175 +++++++++++++++++-------------------
8+
1 file changed, 83 insertions(+), 92 deletions(-)
9+
10+
diff --git a/setuptools/package_index.py b/setuptools/package_index.py
11+
index c998160..85d7cfe 100644
12+
--- a/setuptools/package_index.py
13+
+++ b/setuptools/package_index.py
14+
@@ -812,96 +812,45 @@ class PackageIndex(Environment):
15+
def _attempt_download(self, url, filename):
16+
headers = self._download_to(url, filename)
17+
if 'html' in headers.get('content-type', '').lower():
18+
- return self._download_html(url, headers, filename)
19+
+ return self._invalid_download_html(url, headers, filename)
20+
else:
21+
return filename
22+
23+
- def _download_html(self, url, headers, filename):
24+
- file = open(filename)
25+
- for line in file:
26+
- if line.strip():
27+
- # Check for a subversion index page
28+
- if re.search(r'<title>([^- ]+ - )?Revision \d+:', line):
29+
- # it's a subversion index page:
30+
- file.close()
31+
- os.unlink(filename)
32+
- return self._download_svn(url, filename)
33+
- break # not an index page
34+
- file.close()
35+
+ def _invalid_download_html(self, url, headers, filename):
36+
os.unlink(filename)
37+
- raise DistutilsError("Unexpected HTML page found at " + url)
38+
-
39+
- def _download_svn(self, url, filename):
40+
- warnings.warn("SVN download support is deprecated", UserWarning)
41+
- url = url.split('#', 1)[0] # remove any fragment for svn's sake
42+
- creds = ''
43+
- if url.lower().startswith('svn:') and '@' in url:
44+
- scheme, netloc, path, p, q, f = urllib.parse.urlparse(url)
45+
- if not netloc and path.startswith('//') and '/' in path[2:]:
46+
- netloc, path = path[2:].split('/', 1)
47+
- auth, host = _splituser(netloc)
48+
- if auth:
49+
- if ':' in auth:
50+
- user, pw = auth.split(':', 1)
51+
- creds = " --username=%s --password=%s" % (user, pw)
52+
- else:
53+
- creds = " --username=" + auth
54+
- netloc = host
55+
- parts = scheme, netloc, url, p, q, f
56+
- url = urllib.parse.urlunparse(parts)
57+
- self.info("Doing subversion checkout from %s to %s", url, filename)
58+
- os.system("svn checkout%s -q %s %s" % (creds, url, filename))
59+
- return filename
60+
+ raise DistutilsError(f"Unexpected HTML page found at {url}")
61+
62+
@staticmethod
63+
- def _vcs_split_rev_from_url(url, pop_prefix=False):
64+
- scheme, netloc, path, query, frag = urllib.parse.urlsplit(url)
65+
+ def _vcs_split_rev_from_url(url):
66+
+ """
67+
+ Given a possible VCS URL, return a clean URL and resolved revision if any.
68+
+
69+
+ >>> vsrfu = PackageIndex._vcs_split_rev_from_url
70+
+ >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools')
71+
+ ('https://github.com/pypa/setuptools', 'v69.0.0')
72+
+ >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools')
73+
+ ('https://github.com/pypa/setuptools', None)
74+
+ >>> vsrfu('http://foo/bar')
75+
+ ('http://foo/bar', None)
76+
+ """
77+
+ parts = urllib.parse.urlsplit(url)
78+
79+
- scheme = scheme.split('+', 1)[-1]
80+
+ clean_scheme = parts.scheme.split('+', 1)[-1]
81+
82+
# Some fragment identification fails
83+
- path = path.split('#', 1)[0]
84+
-
85+
- rev = None
86+
- if '@' in path:
87+
- path, rev = path.rsplit('@', 1)
88+
-
89+
- # Also, discard fragment
90+
- url = urllib.parse.urlunsplit((scheme, netloc, path, query, ''))
91+
-
92+
- return url, rev
93+
-
94+
- def _download_git(self, url, filename):
95+
- filename = filename.split('#', 1)[0]
96+
- url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)
97+
-
98+
- self.info("Doing git clone from %s to %s", url, filename)
99+
- os.system("git clone --quiet %s %s" % (url, filename))
100+
-
101+
- if rev is not None:
102+
- self.info("Checking out %s", rev)
103+
- os.system("git -C %s checkout --quiet %s" % (
104+
- filename,
105+
- rev,
106+
- ))
107+
-
108+
- return filename
109+
-
110+
- def _download_hg(self, url, filename):
111+
- filename = filename.split('#', 1)[0]
112+
- url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)
113+
+ no_fragment_path, _, _ = parts.path.partition('#')
114+
115+
- self.info("Doing hg clone from %s to %s", url, filename)
116+
- os.system("hg clone --quiet %s %s" % (url, filename))
117+
+ pre, sep, post = no_fragment_path.rpartition('@')
118+
+ clean_path, rev = (pre, post) if sep else (post, None)
119+
120+
- if rev is not None:
121+
- self.info("Updating to %s", rev)
122+
- os.system("hg --cwd %s up -C -r %s -q" % (
123+
- filename,
124+
- rev,
125+
- ))
126+
+ resolved = parts._replace(
127+
+ scheme=clean_scheme,
128+
+ path=clean_path,
129+
+ # discard the fragment
130+
+ fragment='',
131+
+ ).geturl()
132+
133+
- return filename
134+
+ return resolved, rev
135+
136+
def debug(self, msg, *args):
137+
log.debug(msg, *args)

SPECS/python3/python3.spec

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
Summary: A high-level scripting language
1313
Name: python3
1414
Version: 3.9.19
15-
Release: 1%{?dist}
15+
Release: 2%{?dist}
1616
License: PSF
1717
Vendor: Microsoft Corporation
1818
Distribution: Mariner
@@ -24,6 +24,7 @@ Patch0: cgi3.patch
2424
Patch1: 0001-gh-95231-Disable-md5-crypt-modules-if-FIPS-is-enable.patch
2525
# Patch for setuptools, resolved in 65.5.1
2626
Patch1000: CVE-2022-40897.patch
27+
Patch1001: CVE-2024-6345.patch
2728

2829
BuildRequires: bzip2-devel
2930
BuildRequires: expat-devel >= 2.1.0
@@ -212,6 +213,8 @@ popd
212213
# Manually patch CVE-2022-40897 which is a bundled wheel. We can only update the source code after install
213214
echo 'Patching CVE-2022-40897 in bundled wheel file %{_libdir}/python%{majmin}/site-packages/setuptools/package_index.py'
214215
patch %{buildroot}%{_libdir}/python%{majmin}/site-packages/setuptools/package_index.py < %{PATCH1000}
216+
echo 'Patching CVE-2024-6345 in bundled wheel file %{_libdir}/python%{majmin}/site-packages/setuptools/package_index.py'
217+
patch -p1 %{buildroot}%{_libdir}/python%{majmin}/site-packages/setuptools/package_index.py < %{PATCH1001}
215218

216219
# Windows executables get installed by pip and setuptools- we don't need these.
217220
find %{buildroot}%{_libdir}/python%{majmin}/site-packages -name '*.exe' -delete -print
@@ -313,6 +316,9 @@ rm -rf %{buildroot}%{_bindir}/__pycache__
313316
%{_libdir}/python%{majmin}/test/*
314317

315318
%changelog
319+
* Mon Jul 22 2024 Sindhu Karri <lakarri@microsoft.com> - 3.9.19-2
320+
- Patch for CVE-2024-6345
321+
316322
* Fri Mar 22 2024 Binu Philip <bphilip@microsoft.com> - 3.9.19-1
317323
- Upgrade to python 3.9.19 for CVE-2023-6597 and other security fixes
318324

toolkit/resources/manifests/package/pkggen_core_aarch64.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,10 @@ ca-certificates-base-2.0.0-17.cm2.noarch.rpm
237237
ca-certificates-2.0.0-17.cm2.noarch.rpm
238238
dwz-0.14-2.cm2.aarch64.rpm
239239
unzip-6.0-20.cm2.aarch64.rpm
240-
python3-3.9.19-1.cm2.aarch64.rpm
241-
python3-devel-3.9.19-1.cm2.aarch64.rpm
242-
python3-libs-3.9.19-1.cm2.aarch64.rpm
243-
python3-setuptools-3.9.19-1.cm2.noarch.rpm
240+
python3-3.9.19-2.cm2.aarch64.rpm
241+
python3-devel-3.9.19-2.cm2.aarch64.rpm
242+
python3-libs-3.9.19-2.cm2.aarch64.rpm
243+
python3-setuptools-3.9.19-2.cm2.noarch.rpm
244244
python3-pygments-2.4.2-7.cm2.noarch.rpm
245245
which-2.21-8.cm2.aarch64.rpm
246246
libselinux-3.2-1.cm2.aarch64.rpm

toolkit/resources/manifests/package/pkggen_core_x86_64.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,10 @@ ca-certificates-base-2.0.0-17.cm2.noarch.rpm
237237
ca-certificates-2.0.0-17.cm2.noarch.rpm
238238
dwz-0.14-2.cm2.x86_64.rpm
239239
unzip-6.0-20.cm2.x86_64.rpm
240-
python3-3.9.19-1.cm2.x86_64.rpm
241-
python3-devel-3.9.19-1.cm2.x86_64.rpm
242-
python3-libs-3.9.19-1.cm2.x86_64.rpm
243-
python3-setuptools-3.9.19-1.cm2.noarch.rpm
240+
python3-3.9.19-2.cm2.x86_64.rpm
241+
python3-devel-3.9.19-2.cm2.x86_64.rpm
242+
python3-libs-3.9.19-2.cm2.x86_64.rpm
243+
python3-setuptools-3.9.19-2.cm2.noarch.rpm
244244
python3-pygments-2.4.2-7.cm2.noarch.rpm
245245
which-2.21-8.cm2.x86_64.rpm
246246
libselinux-3.2-1.cm2.x86_64.rpm

toolkit/resources/manifests/package/toolchain_aarch64.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -510,28 +510,28 @@ procps-ng-devel-3.3.17-2.cm2.aarch64.rpm
510510
procps-ng-lang-3.3.17-2.cm2.aarch64.rpm
511511
pyproject-rpm-macros-1.0.0~rc1-4.cm2.noarch.rpm
512512
python-markupsafe-debuginfo-2.1.0-1.cm2.aarch64.rpm
513-
python3-3.9.19-1.cm2.aarch64.rpm
513+
python3-3.9.19-2.cm2.aarch64.rpm
514514
python3-audit-3.0.6-8.cm2.aarch64.rpm
515515
python3-cracklib-2.9.7-5.cm2.aarch64.rpm
516-
python3-curses-3.9.19-1.cm2.aarch64.rpm
516+
python3-curses-3.9.19-2.cm2.aarch64.rpm
517517
python3-Cython-0.29.33-2.cm2.aarch64.rpm
518-
python3-debuginfo-3.9.19-1.cm2.aarch64.rpm
519-
python3-devel-3.9.19-1.cm2.aarch64.rpm
518+
python3-debuginfo-3.9.19-2.cm2.aarch64.rpm
519+
python3-devel-3.9.19-2.cm2.aarch64.rpm
520520
python3-gpg-1.16.0-2.cm2.aarch64.rpm
521521
python3-jinja2-3.0.3-4.cm2.noarch.rpm
522522
python3-libcap-ng-0.8.2-2.cm2.aarch64.rpm
523-
python3-libs-3.9.19-1.cm2.aarch64.rpm
523+
python3-libs-3.9.19-2.cm2.aarch64.rpm
524524
python3-libxml2-2.10.4-3.cm2.aarch64.rpm
525525
python3-lxml-4.9.1-1.cm2.aarch64.rpm
526526
python3-magic-5.40-2.cm2.noarch.rpm
527527
python3-markupsafe-2.1.0-1.cm2.aarch64.rpm
528528
python3-newt-0.52.21-5.cm2.aarch64.rpm
529-
python3-pip-3.9.19-1.cm2.noarch.rpm
529+
python3-pip-3.9.19-2.cm2.noarch.rpm
530530
python3-pygments-2.4.2-7.cm2.noarch.rpm
531531
python3-rpm-4.18.0-4.cm2.aarch64.rpm
532-
python3-setuptools-3.9.19-1.cm2.noarch.rpm
533-
python3-test-3.9.19-1.cm2.aarch64.rpm
534-
python3-tools-3.9.19-1.cm2.aarch64.rpm
532+
python3-setuptools-3.9.19-2.cm2.noarch.rpm
533+
python3-test-3.9.19-2.cm2.aarch64.rpm
534+
python3-tools-3.9.19-2.cm2.aarch64.rpm
535535
readline-8.1-1.cm2.aarch64.rpm
536536
readline-debuginfo-8.1-1.cm2.aarch64.rpm
537537
readline-devel-8.1-1.cm2.aarch64.rpm

toolkit/resources/manifests/package/toolchain_x86_64.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -516,28 +516,28 @@ procps-ng-devel-3.3.17-2.cm2.x86_64.rpm
516516
procps-ng-lang-3.3.17-2.cm2.x86_64.rpm
517517
pyproject-rpm-macros-1.0.0~rc1-4.cm2.noarch.rpm
518518
python-markupsafe-debuginfo-2.1.0-1.cm2.x86_64.rpm
519-
python3-3.9.19-1.cm2.x86_64.rpm
519+
python3-3.9.19-2.cm2.x86_64.rpm
520520
python3-audit-3.0.6-8.cm2.x86_64.rpm
521521
python3-cracklib-2.9.7-5.cm2.x86_64.rpm
522-
python3-curses-3.9.19-1.cm2.x86_64.rpm
522+
python3-curses-3.9.19-2.cm2.x86_64.rpm
523523
python3-Cython-0.29.33-2.cm2.x86_64.rpm
524-
python3-debuginfo-3.9.19-1.cm2.x86_64.rpm
525-
python3-devel-3.9.19-1.cm2.x86_64.rpm
524+
python3-debuginfo-3.9.19-2.cm2.x86_64.rpm
525+
python3-devel-3.9.19-2.cm2.x86_64.rpm
526526
python3-gpg-1.16.0-2.cm2.x86_64.rpm
527527
python3-jinja2-3.0.3-4.cm2.noarch.rpm
528528
python3-libcap-ng-0.8.2-2.cm2.x86_64.rpm
529-
python3-libs-3.9.19-1.cm2.x86_64.rpm
529+
python3-libs-3.9.19-2.cm2.x86_64.rpm
530530
python3-libxml2-2.10.4-3.cm2.x86_64.rpm
531531
python3-lxml-4.9.1-1.cm2.x86_64.rpm
532532
python3-magic-5.40-2.cm2.noarch.rpm
533533
python3-markupsafe-2.1.0-1.cm2.x86_64.rpm
534534
python3-newt-0.52.21-5.cm2.x86_64.rpm
535-
python3-pip-3.9.19-1.cm2.noarch.rpm
535+
python3-pip-3.9.19-2.cm2.noarch.rpm
536536
python3-pygments-2.4.2-7.cm2.noarch.rpm
537537
python3-rpm-4.18.0-4.cm2.x86_64.rpm
538-
python3-setuptools-3.9.19-1.cm2.noarch.rpm
539-
python3-test-3.9.19-1.cm2.x86_64.rpm
540-
python3-tools-3.9.19-1.cm2.x86_64.rpm
538+
python3-setuptools-3.9.19-2.cm2.noarch.rpm
539+
python3-test-3.9.19-2.cm2.x86_64.rpm
540+
python3-tools-3.9.19-2.cm2.x86_64.rpm
541541
readline-8.1-1.cm2.x86_64.rpm
542542
readline-debuginfo-8.1-1.cm2.x86_64.rpm
543543
readline-devel-8.1-1.cm2.x86_64.rpm

0 commit comments

Comments
 (0)