CVE-2026-59890: setuptools: MANIFEST.in exclusion bypass in sdist via Unicode normalization collision (NFC/NFD) on macOS APFS/HFS+
When building a source distribution (python -m build --sdist / setup.py sdist), setuptools’ FileList applies MANIFEST.in directives (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 a MANIFEST.in rule 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.gz and, if published, uploaded to the public, immutable PyPI index.
References
- github.com/advisories/GHSA-h35f-9h28-mq5c
- github.com/pypa/advisory-database/tree/main/vulns/setuptools/PYSEC-2026-3447.yaml
- github.com/pypa/setuptools/commit/dd9f436a36486b4cb8a4c70a2321548b0be09b8f
- github.com/pypa/setuptools/releases/tag/v83.0.0
- github.com/pypa/setuptools/security/advisories/GHSA-h35f-9h28-mq5c
- nvd.nist.gov/vuln/detail/CVE-2026-59890
Code Behaviors & Features
Detect and mitigate CVE-2026-59890 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →