Update dependency setuptools to v83 [SECURITY] - #177
Conversation
Ready for review! The automated tests have finished. ✅I've aggregated the results of the automated checks for this PR below. 🔍 LintI've checked the pulse of your pull request. 💓 ❌ ruff: issues found — see job log 🏷️ Release PreviewEnsuring the 'Contributors' list is sorted and complete. 👥 Current:
🚀 Release Channel Compatibility Predicted next version:
🔒 Security (pip-audit)Scanning for any potential man-in-the-middle risks. 👨💻 ✅ No known vulnerabilities found (66 packages scanned). ⚖️ License CheckLegal eagle here! Checking those licenses. ⚖️ ✅ No license violations found. Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed. 📊 CoverageMeasuring the reach of our test cases. 📏 ✅ 98.2% total coverage Per-file coverage (9 files)
Full report: download the 📋 Repo HealthA thorough inspection of the project's hygiene. 🧼 ✅ All required files present. Latest Version: ✅ 🔌 Skill Tests (ovoscope)Scanning for any 'hidden gems' in your skill's interaction. 💎 ✅ 57/57 passed ✅ TestAudioCaptureSequence — 1/1 🚌 Bus CoverageWho's listening? Who's emitting? Let's check the bus coverage! 📢 🔨 Build TestsEnsuring the gears are properly lubricated. 💧 ✅ All versions pass
🔗 Downstream DependentsI've checked the pulse of your pull request. 💓 No dependents found for ovos-audio Keeping things running like clockwork 🕰️ |
This PR contains the following updates:
82.0.1→83.0.0setuptools: MANIFEST.in exclusion bypass in sdist via Unicode normalization collision (NFC/NFD) on macOS APFS/HFS+
CVE-2026-59890 / GHSA-h35f-9h28-mq5c
More information
Details
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.
Severity
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
pypa/setuptools (setuptools)
v83.0.0Compare Source
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.