Bump setuptools to 83.0.0 to remediate Unicode MANIFEST exclusion bypass - #2893
Open
Sergio Sisternes (sergio-sisternes-epam) with Copilot wants to merge 2 commits into
Open
Bump setuptools to 83.0.0 to remediate Unicode MANIFEST exclusion bypass#2893Sergio Sisternes (sergio-sisternes-epam) with Copilot wants to merge 2 commits into
Sergio Sisternes (sergio-sisternes-epam) with Copilot wants to merge 2 commits into
Conversation
Copilot started work on behalf of
Sergio Sisternes (sergio-sisternes-epam)
September 8, 2026 08:08
View session
Co-authored-by: sergio-sisternes-epam <207026618+sergio-sisternes-epam@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Fix setuptools exclusion bypass in sdist on macOS
Bump setuptools to 83.0.0 to remediate Unicode MANIFEST exclusion bypass
Sep 8, 2026
Daniel Meppiel (danielmeppiel)
marked this pull request as ready for review
September 8, 2026 09:35
Daniel Meppiel (danielmeppiel)
approved these changes
Sep 8, 2026
Daniel Meppiel (danielmeppiel)
enabled auto-merge
September 8, 2026 09:36
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Sep 8, 2026
Daniel Meppiel (danielmeppiel)
requested changes
Sep 8, 2026
Daniel Meppiel (danielmeppiel)
left a comment
Collaborator
There was a problem hiding this comment.
fix CI
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This updates
setuptoolsto the first patched version to address CVE-2026-59890 / GHSA-h35f-9h28-mq5c, where Unicode normalization mismatches can bypassMANIFEST.inexclusions during sdist creation on macOS filesystems.Dependency remediation
uv.lockvia uv tooling with a targeted package upgrade.setuptoolsfrom80.9.0to83.0.0(lowest non-vulnerable version).Reachability Assessment
uv build --sdist/ build backend path), which is the affected code path in the advisory.tests/integration/test_tls_wheel_content.py(--sdistbuild path).github/workflows/build-release.yml(uv buildfor publish artifacts)Type of change
Testing
Spec conformance (OpenAPM v0.1)
If this PR changes behaviour that an OpenAPM v0.1
req-XXXcovers,confirm the three-step ritual (see CONTRIBUTING.md "Adding or
changing a normative requirement"):
docs/src/content/docs/specs/openapm-v0.1.mdupdated(new/changed
<a id="req-XXX"></a>anchor + prose + Appendix Crow).
docs/src/content/docs/specs/manifests/openapm-v0.1.requirements.ymlupdated.
@pytest.mark.req("req-XXX")test undertests/spec_conformance/added or extended.CONFORMANCE.{md,json}regenerated viauv run --extra dev python -m tests.spec_conformance.gen_statementand committed.
Original prompt
This section details the Dependabot vulnerability alert you should resolve
<alert_title>setuptools: MANIFEST.in exclusion bypass in sdist via Unicode normalization collision (NFC/NFD) on macOS APFS/HFS+</alert_title>
<alert_description>## Summary
When building a source distribution (
python -m build --sdist/setup.py sdist), setuptools'FileListappliesMANIFEST.indirectives (exclude,global-exclude,recursive-exclude,prune) by matching a compiled glob against on-disk file names byte-for-byte, with no Unicode normalization. On normalization-preserving filesystems (notably macOS APFS and HFS+), a file written in NFD and aMANIFEST.inrule written in NFC refer to the same file but are byte-distinct, so the exclusion silently fails to match. A file the maintainer intended to exclude is then packed into the.tar.gzand, if published, uploaded to the public, immutable PyPI index.Details
File names in
FileList.filescome fromos.walk(setuptools/_distutils/filelist.py,_find_all_simple), so on APFS a file written NFD is offered to the matcher in NFD, while theMANIFEST.inpattern carries the author's editor form (typically NFC). The matching path performs no canonicalization:A rule written NFC (
café=63 61 66 c3 a9) does not match an on-disk name written NFD (café=63 61 66 65 cc 81), even though the filesystem treats the two as one file.A
unicodedata.normalize('NFD', ...)helper exists insetuptools/unicode_utils.py(decompose()), but it is never called in the manifest matching path, so neither the pattern nor the walked path is normalized before matching. The only normalization in this area,EggInfoCommand._manifest_normalize, usesfilesys_decode(bytes→str decode only, no NFC/NFD) and runs when writingSOURCES.txt, after matching has already occurred.Impact
MANIFEST.inexclusions are the documented mechanism maintainers use to keep secrets, local configs, and private fixtures out of the published sdist. A non-ASCII excluded file may be published to the public, immutable PyPI index despite the rule — an irreversible disclosure with no visual cue (NFC and NFD forms render identically). Exposure is filesystem-dependent and most relevant on macOS APFS/HFS+, where many maintainers build and publish. Pure-ASCII rules are unaffected.Proof of concept
With a project containing
MANIFEST.in:and an on-disk file
secret_café.txtwritten in NFD,python -m build --sdistpacks the secret file into the resulting.tar.gz, while an ASCII control file excluded by the same directive is correctly dropped — isolating the bypass to the NFC-pattern vs. NFD-name mismatch. Reproduced on macOS APFS with setuptools 82.0.1.Remediation
Normalize both the walked path and each
MANIFEST.inpattern to a single canonical form before matching, in bothsetuptools/command/egg_info.py(FileList) and the vendoredsetuptools/_distutils/filelist.py. For an exclusion list, err toward excluding more, and document thatMANIFEST.inmatching is normalization-insensitive on macOS.Credit
Reported by Tomas Illuminati. Coordinated via CERT/CC VINCE VU#604762.</alert_description>
moderate
https://github.com/pypa/setuptools/security/advisories/GHSA-h35f-9h28-mq5c https://nvd.nist.gov/vuln/detail/CVE-2026-59890 https://github.com/pypa/setuptools/commit/dd9f436a36486b4cb8a4c70a2321548b0be09b8f https://github.com/pypa/advisory-database/tree/main/vulns/setuptools/PYSEC-2026-3447.yaml https://github.com/pypa/setuptools/releases/tag/v83.0.0 https://github.com/advisories/GHSA-h35f-9h28-mq5cGHSA-h35f-9h28-mq5c, CVE-2026-59890
setuptools
pip
<vulnerable_versions>= 80.9.0</vulnerable_versions>
<patched_version>83.0.0</patched_version>
<manifest_path>uv.lock</manifest_path>
<task_instructions>Resolve this alert by updating the affected package to a non-vulnerable version. Prefer the lowest non-vulnerable version (see the patched_version field above) over the latest to minimize breaking changes. Include a Reachability Assessment section in the PR description. Review the alert_description field to understand which APIs, features, or configurations are affected, then search the codebase for usage of those specific items. If the vulnerable code path is reachable, explain how (which files, APIs, or call sites use the affected functionality) and note that the codebase is a...