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. Learn more about Dependency Scanning →